1 min read

libFuzzer を利用した Erlang/OTP 向けファジングライブラリ

人間が書いています。

Erlang/OTP でファジングをやりたいなとずっと思っていたのですが、ファジングライブラリは基本的には自前で作るのは難しいので libFuzzer 1択なのですが、これを Erlang/OTP というマニアックな言語で実現するのはちょっと厳しすぎるので、諦めていました。

その代わり PBT で binary() を生成して食わせるという対応をしていました。ただこれは PBT 本来の使い方からはかけ離れてるので良い戦略ではありません。

昨今のセキュリティをもっともっとしっかりやっていくぞという気持ちから、Erlang/OTP 向けのファジングライブラリを実装しました。

時雨堂初の NIF (C 拡張) 利用ライブラリです。

GitHub - shiguredo/fuzzer: libFuzzer-based fuzzing library for Erlang functions
libFuzzer-based fuzzing library for Erlang functions - shiguredo/fuzzer

利用方法

とにかく簡単に利用できる用にしてあります。 parser や decoder に libFuzzer が生成するバイナリを食わせるだけです。ファジングなのでクラッシュを目的としています。

-module(example_fuzz_target).

-behaviour(fuzzer_target).

-export([evaluate/1]).


-spec evaluate(binary()) -> ok.
evaluate(Data) ->
    % example_parser は利用者が用意する対象の関数
    % 通常の入力エラーは {error, Reason} として返るため、クラッシュにしない
    % 例外は捕捉しないため、その入力はクラッシュ入力として保存される
    case example_parser:decode(Data) of
        {ok, _Value} ->
            ok;
        {error, _Reason} ->
            ok
    end.

Erlang コードを理解しているわけでは無く、シンプルにこの部分まで進んだみたいなのをひたすら libFuzzer に渡しているだけです。libFuzzer を使い倒す戦略です。

かなり良くできたと思うので、仕事で Erlang/OTP を使ってるかたは是非使ってみてください。