2018-07-21 01:44:44 +01:00
|
|
|
{ stdenv, fetchurl, callPackage, makeWrapper
|
2017-09-05 20:59:43 +01:00
|
|
|
, clang, llvm, which, libcgroup
|
|
|
|
}:
|
2014-11-25 18:42:53 +00:00
|
|
|
|
2015-03-23 02:57:55 +00:00
|
|
|
let
|
2018-12-02 16:26:31 +00:00
|
|
|
afl-qemu = callPackage ./qemu.nix { inherit afl; };
|
2018-08-20 20:11:29 +01:00
|
|
|
qemu-exe-name = if stdenv.hostPlatform.system == "x86_64-linux" then "qemu-x86_64"
|
|
|
|
else if stdenv.hostPlatform.system == "i686-linux" then "qemu-i386"
|
|
|
|
else throw "afl: no support for ${stdenv.hostPlatform.system}!";
|
2018-12-02 16:26:31 +00:00
|
|
|
afl = stdenv.mkDerivation rec {
|
|
|
|
name = "afl-${version}";
|
|
|
|
version = "2.52b";
|
2017-09-05 20:59:43 +01:00
|
|
|
|
2018-12-02 16:26:31 +00:00
|
|
|
src = fetchurl {
|
|
|
|
url = "http://lcamtuf.coredump.cx/afl/releases/${name}.tgz";
|
|
|
|
sha256 = "0ig0ij4n1pwry5dw1hk4q88801jzzy2cric6y2gd6560j55lnqa3";
|
|
|
|
};
|
2019-01-05 15:58:51 +00:00
|
|
|
enableParallelBuilding = true;
|
2014-11-25 18:42:53 +00:00
|
|
|
|
2018-12-02 16:26:31 +00:00
|
|
|
# Note: libcgroup isn't needed for building, just for the afl-cgroup
|
|
|
|
# script.
|
2019-01-05 15:58:51 +00:00
|
|
|
nativeBuildInputs = [ makeWrapper which ];
|
|
|
|
buildInputs = [ llvm ];
|
2014-11-25 18:42:53 +00:00
|
|
|
|
2019-01-05 15:58:51 +00:00
|
|
|
makeFlags = [ "PREFIX=$(out)" ];
|
|
|
|
postBuild = ''
|
|
|
|
make -C llvm_mode $makeFlags -j$NIX_BUILD_CORES
|
2018-12-02 16:26:31 +00:00
|
|
|
'';
|
2019-01-05 15:58:51 +00:00
|
|
|
postInstall = ''
|
2018-12-02 16:26:31 +00:00
|
|
|
# Install the custom QEMU emulator for binary blob fuzzing.
|
|
|
|
cp ${afl-qemu}/bin/${qemu-exe-name} $out/bin/afl-qemu-trace
|
2015-03-23 02:57:55 +00:00
|
|
|
|
2018-12-02 16:26:31 +00:00
|
|
|
# Install the cgroups wrapper for asan-based fuzzing.
|
|
|
|
cp experimental/asan_cgroups/limit_memory.sh $out/bin/afl-cgroup
|
|
|
|
chmod +x $out/bin/afl-cgroup
|
|
|
|
substituteInPlace $out/bin/afl-cgroup \
|
|
|
|
--replace "cgcreate" "${libcgroup}/bin/cgcreate" \
|
|
|
|
--replace "cgexec" "${libcgroup}/bin/cgexec" \
|
|
|
|
--replace "cgdelete" "${libcgroup}/bin/cgdelete"
|
2015-03-23 02:57:55 +00:00
|
|
|
|
2018-12-02 16:26:31 +00:00
|
|
|
# Patch shebangs before wrapping
|
|
|
|
patchShebangs $out/bin
|
2015-04-11 12:43:25 +01:00
|
|
|
|
2018-12-02 16:26:31 +00:00
|
|
|
# Wrap afl-clang-fast(++) with a *different* AFL_PATH, because it
|
|
|
|
# has totally different semantics in that case(?) - and also set a
|
|
|
|
# proper AFL_CC and AFL_CXX so we don't pick up the wrong one out
|
|
|
|
# of $PATH.
|
|
|
|
for x in $out/bin/afl-clang-fast $out/bin/afl-clang-fast++; do
|
|
|
|
wrapProgram $x \
|
|
|
|
--prefix AFL_PATH : "$out/lib/afl" \
|
|
|
|
--run 'export AFL_CC=''${AFL_CC:-${clang}/bin/clang} AFL_CXX=''${AFL_CXX:-${clang}/bin/clang++}'
|
|
|
|
done
|
|
|
|
'';
|
2015-04-11 12:43:25 +01:00
|
|
|
|
2019-01-05 15:58:51 +00:00
|
|
|
passthru.qemu = afl-qemu;
|
2014-11-25 18:42:53 +00:00
|
|
|
|
2018-12-02 16:26:31 +00:00
|
|
|
meta = {
|
|
|
|
description = "Powerful fuzzer via genetic algorithms and instrumentation";
|
|
|
|
longDescription = ''
|
|
|
|
American fuzzy lop is a fuzzer that employs a novel type of
|
|
|
|
compile-time instrumentation and genetic algorithms to
|
|
|
|
automatically discover clean, interesting test cases that
|
|
|
|
trigger new internal states in the targeted binary. This
|
|
|
|
substantially improves the functional coverage for the fuzzed
|
|
|
|
code. The compact synthesized corpora produced by the tool are
|
|
|
|
also useful for seeding other, more labor or resource-intensive
|
|
|
|
testing regimes down the road.
|
|
|
|
'';
|
|
|
|
homepage = "http://lcamtuf.coredump.cx/afl/";
|
|
|
|
license = stdenv.lib.licenses.asl20;
|
|
|
|
platforms = ["x86_64-linux" "i686-linux"];
|
2019-04-10 22:13:56 +01:00
|
|
|
maintainers = with stdenv.lib.maintainers; [ thoughtpolice ris ];
|
2018-12-02 16:26:31 +00:00
|
|
|
};
|
2017-11-16 17:11:10 +00:00
|
|
|
};
|
2018-12-02 16:26:31 +00:00
|
|
|
in afl
|