Skip to content

Commit 41f4564

Browse files
smalyshevnikic
authored andcommitted
Add fuzzer SAPIs to the core
1 parent 9b9fac7 commit 41f4564

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

123 files changed

+936
-0
lines changed

sapi/fuzzer/Makefile.frag

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
fuzzer: $(PHP_FUZZER_BINARIES)
2+
3+
FUZZER_BUILD = $(LIBTOOL) --mode=link $(FUZZING_CC) -export-dynamic $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) $(EXTRA_LDFLAGS_PROGRAM) $(LDFLAGS) $(PHP_RPATHS) $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(EXTRA_LIBS) $(ZEND_EXTRA_LIBS) $(FUZZING_LIB) -rpath /ORIGIN/lib
4+
5+
$(SAPI_FUZZER_PATH)/php-fuzz-parser: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_PARSER_OBJS)
6+
$(FUZZER_BUILD) $(PHP_FUZZER_PARSER_OBJS) -o $@
7+
8+
$(SAPI_FUZZER_PATH)/php-fuzz-unserialize: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_UNSERIALIZE_OBJS)
9+
$(FUZZER_BUILD) $(PHP_FUZZER_UNSERIALIZE_OBJS) -o $@
10+
11+
$(SAPI_FUZZER_PATH)/php-fuzz-json: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_JSON_OBJS)
12+
$(FUZZER_BUILD) $(PHP_FUZZER_JSON_OBJS) -o $@
13+
14+
$(SAPI_FUZZER_PATH)/php-fuzz-exif: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_EXIF_OBJS)
15+
$(FUZZER_BUILD) $(PHP_FUZZER_EXIF_OBJS) -o $@
16+
17+
$(SAPI_FUZZER_PATH)/php-fuzz-mbstring: $(PHP_GLOBAL_OBJS) $(PHP_SAPI_OBJS) $(PHP_FUZZER_MBSTRING_OBJS)
18+
$(FUZZER_BUILD) $(PHP_FUZZER_MBSTRING_OBJS) -o $@

sapi/fuzzer/README

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
Fuzzing SAPI for PHP
2+
3+
Enable fuzzing targets with --enable-fuzzer switch.
4+
5+
Your compiler should support -fsanitize=address and you need
6+
to have Fuzzer library around.
7+
8+
When running `make` it creates these binaries in `sapi/fuzzer/`:
9+
* php-fuzz-parser - fuzzing language parser
10+
* php-fuzz-unserialize - fuzzing unserialize() function
11+
* php-fuzz-json - fuzzing JSON parser
12+
* php-fuzz-exif - fuzzing exif_read_data() function (use --enable-exif)
13+
* php-fuzz-mbstring - fuzzing mb_ereg[i] (requires --enable-mbstring)

sapi/fuzzer/config.m4

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
AC_MSG_CHECKING(for clang fuzzer SAPI)
2+
3+
PHP_ARG_ENABLE([fuzzer],,
4+
[AS_HELP_STRING([--enable-fuzzer],
5+
[Build PHP as clang fuzzing test module (for developers)])],
6+
[no])
7+
8+
dnl For newer clang versions see https://llvm.org/docs/LibFuzzer.html#fuzzer-usage
9+
dnl for relevant flags.
10+
11+
dnl Macro to define fuzzing target
12+
dnl PHP_FUZZER_TARGET(name, target-var)
13+
dnl
14+
AC_DEFUN([PHP_FUZZER_TARGET], [
15+
PHP_FUZZER_BINARIES="$PHP_FUZZER_BINARIES $SAPI_FUZZER_PATH/php-fuzz-$1"
16+
PHP_SUBST($2)
17+
PHP_ADD_SOURCES_X([sapi/fuzzer],[fuzzer-$1.c fuzzer-sapi.c],[],$2)
18+
])
19+
20+
if test "$PHP_FUZZER" != "no"; then
21+
AC_MSG_RESULT([yes])
22+
PHP_REQUIRE_CXX()
23+
PHP_ADD_MAKEFILE_FRAGMENT($abs_srcdir/sapi/fuzzer/Makefile.frag)
24+
SAPI_FUZZER_PATH=sapi/fuzzer
25+
PHP_SUBST(SAPI_FUZZER_PATH)
26+
if test -z "$LIB_FUZZING_ENGINE"; then
27+
FUZZING_LIB="-lFuzzer"
28+
FUZZING_CC="$CC"
29+
AX_CHECK_COMPILE_FLAG([-fsanitize=address], [
30+
CFLAGS="$CFLAGS -fsanitize=address"
31+
CXXFLAGS="$CXXFLAGS -fsanitize=address"
32+
LDFLAGS="$LDFLAGS -fsanitize=address"
33+
],[
34+
AC_MSG_ERROR(compiler doesn't support -fsanitize flags)
35+
])
36+
else
37+
FUZZING_LIB="-lFuzzingEngine"
38+
FUZZING_CC="$CXX -stdlib=libc++"
39+
fi
40+
PHP_SUBST(FUZZING_LIB)
41+
PHP_SUBST(FUZZING_CC)
42+
43+
dnl PHP_SELECT_SAPI(fuzzer-parser, program, $FUZZER_SOURCES, , '$(SAPI_FUZZER_PATH)')
44+
45+
PHP_ADD_BUILD_DIR([sapi/fuzzer])
46+
PHP_FUZZER_BINARIES=""
47+
PHP_INSTALLED_SAPIS="$PHP_INSTALLED_SAPIS fuzzer"
48+
49+
PHP_FUZZER_TARGET([parser], PHP_FUZZER_PARSER_OBJS)
50+
PHP_FUZZER_TARGET([unserialize], PHP_FUZZER_UNSERIALIZE_OBJS)
51+
PHP_FUZZER_TARGET([exif], PHP_FUZZER_EXIF_OBJS)
52+
53+
if test -n "$enable_json" && test "$enable_json" != "no"; then
54+
PHP_FUZZER_TARGET([json], PHP_FUZZER_JSON_OBJS)
55+
fi
56+
if test -n "$enable_mbstring" && test "$enable_mbstring" != "no"; then
57+
PHP_FUZZER_TARGET([mbstring], PHP_FUZZER_MBSTRING_OBJS)
58+
fi
59+
60+
PHP_SUBST(PHP_FUZZER_BINARIES)
61+
fi
62+
63+
AC_MSG_RESULT($PHP_FUZZER)

sapi/fuzzer/corpus/exif/bug34704.jpg

9.74 KB
9.74 KB

sapi/fuzzer/corpus/exif/bug48378.jpeg

2.51 KB
85.5 KB
85.5 KB
Lines changed: 9 additions & 0 deletions
Lines changed: 12 additions & 0 deletions

0 commit comments

Comments
 (0)