1*e86b9096SDag-Erling Smørgrav>From cc9b927f8f29d989ddb8415fe6508a538546abca Mon Sep 17 00:00:00 2001 2*e86b9096SDag-Erling SmørgravFrom: Jacob Hoffman-Andrews <github@hoffman-andrews.com> 3*e86b9096SDag-Erling SmørgravDate: Wed, 2 Jan 2019 22:52:51 -0800 4*e86b9096SDag-Erling SmørgravSubject: [PATCH] Add unbound-fuzzme. 5*e86b9096SDag-Erling Smørgrav 6*e86b9096SDag-Erling SmørgravThis is a small program that simply parses a packet provided on stdout, 7*e86b9096SDag-Erling Smørgravfor the purposes of fuzzing. 8*e86b9096SDag-Erling Smørgrav--- 9*e86b9096SDag-Erling Smørgrav .gitignore | 1 + 10*e86b9096SDag-Erling Smørgrav Makefile.in | 22 ++++++++++++++++++++-- 11*e86b9096SDag-Erling Smørgrav smallapp/unbound-fuzzme.c | 38 ++++++++++++++++++++++++++++++++++++++ 12*e86b9096SDag-Erling Smørgrav 3 files changed, 59 insertions(+), 2 deletions(-) 13*e86b9096SDag-Erling Smørgrav create mode 100644 smallapp/unbound-fuzzme.c 14*e86b9096SDag-Erling Smørgrav 15*e86b9096SDag-Erling Smørgravdiff --git a/.gitignore b/.gitignore 16*e86b9096SDag-Erling Smørgravindex f4527fd8..6163f905 100644 17*e86b9096SDag-Erling Smørgrav--- a/.gitignore 18*e86b9096SDag-Erling Smørgrav+++ b/.gitignore 19*e86b9096SDag-Erling Smørgrav@@ -24,6 +24,7 @@ 20*e86b9096SDag-Erling Smørgrav /unbound-checkconf 21*e86b9096SDag-Erling Smørgrav /unbound-control 22*e86b9096SDag-Erling Smørgrav /unbound-control-setup 23*e86b9096SDag-Erling Smørgrav+/unbound-fuzzme 24*e86b9096SDag-Erling Smørgrav /unbound-host 25*e86b9096SDag-Erling Smørgrav /unbound.h 26*e86b9096SDag-Erling Smørgrav /asynclook 27*e86b9096SDag-Erling Smørgravdiff --git a/Makefile.in b/Makefile.in 28*e86b9096SDag-Erling Smørgravindex af5b10f6..dacf1ab5 100644 29*e86b9096SDag-Erling Smørgrav--- a/Makefile.in 30*e86b9096SDag-Erling Smørgrav+++ b/Makefile.in 31*e86b9096SDag-Erling Smørgrav@@ -177,6 +177,10 @@ shm_main.lo remote.lo stats.lo unbound.lo \ 32*e86b9096SDag-Erling Smørgrav worker.lo @WIN_DAEMON_OBJ@ 33*e86b9096SDag-Erling Smørgrav DAEMON_OBJ_LINK=$(DAEMON_OBJ) $(COMMON_OBJ_ALL_SYMBOLS) $(SLDNS_OBJ) \ 34*e86b9096SDag-Erling Smørgrav $(COMPAT_OBJ) @WIN_DAEMON_OBJ_LINK@ 35*e86b9096SDag-Erling Smørgrav+FUZZME_SRC=smallapp/unbound-fuzzme.c 36*e86b9096SDag-Erling Smørgrav+FUZZME_OBJ=unbound-fuzzme.lo 37*e86b9096SDag-Erling Smørgrav+FUZZME_OBJ_LINK=$(FUZZME_OBJ) worker_cb.lo $(COMMON_OBJ_ALL_SYMBOLS) $(SLDNS_OBJ) \ 38*e86b9096SDag-Erling Smørgrav+$(COMPAT_OBJ) 39*e86b9096SDag-Erling Smørgrav CHECKCONF_SRC=smallapp/unbound-checkconf.c smallapp/worker_cb.c 40*e86b9096SDag-Erling Smørgrav CHECKCONF_OBJ=unbound-checkconf.lo worker_cb.lo 41*e86b9096SDag-Erling Smørgrav CHECKCONF_OBJ_LINK=$(CHECKCONF_OBJ) $(COMMON_OBJ_ALL_SYMBOLS) $(SLDNS_OBJ) \ 42*e86b9096SDag-Erling Smørgrav@@ -252,6 +256,7 @@ RSRC_OBJ=rsrc_svcinst.o rsrc_svcuninst.o rsrc_anchorupd.o rsrc_unbound.o \ 43*e86b9096SDag-Erling Smørgrav rsrc_unbound_checkconf.o 44*e86b9096SDag-Erling Smørgrav 45*e86b9096SDag-Erling Smørgrav ALL_SRC=$(COMMON_SRC) $(UNITTEST_SRC) $(DAEMON_SRC) \ 46*e86b9096SDag-Erling Smørgrav+ $(FUZZME_SRC) \ 47*e86b9096SDag-Erling Smørgrav $(TESTBOUND_SRC) $(LOCKVERIFY_SRC) $(PKTVIEW_SRC) \ 48*e86b9096SDag-Erling Smørgrav $(MEMSTATS_SRC) $(CHECKCONF_SRC) $(LIBUNBOUND_SRC) $(HOST_SRC) \ 49*e86b9096SDag-Erling Smørgrav $(ASYNCLOOK_SRC) $(STREAMTCP_SRC) $(PERF_SRC) $(DELAYER_SRC) \ 50*e86b9096SDag-Erling Smørgrav@@ -259,6 +264,7 @@ ALL_SRC=$(COMMON_SRC) $(UNITTEST_SRC) $(DAEMON_SRC) \ 51*e86b9096SDag-Erling Smørgrav $(PYTHONMOD_SRC) $(PYUNBOUND_SRC) $(WIN_DAEMON_THE_SRC)\ 52*e86b9096SDag-Erling Smørgrav $(SVCINST_SRC) $(SVCUNINST_SRC) $(ANCHORUPD_SRC) $(SLDNS_SRC) 53*e86b9096SDag-Erling Smørgrav ALL_OBJ=$(COMMON_OBJ) $(UNITTEST_OBJ) $(DAEMON_OBJ) \ 54*e86b9096SDag-Erling Smørgrav+ $(FUZZME_OBJ) \ 55*e86b9096SDag-Erling Smørgrav $(TESTBOUND_OBJ) $(LOCKVERIFY_OBJ) $(PKTVIEW_OBJ) \ 56*e86b9096SDag-Erling Smørgrav $(MEMSTATS_OBJ) $(CHECKCONF_OBJ) $(LIBUNBOUND_OBJ) $(HOST_OBJ) \ 57*e86b9096SDag-Erling Smørgrav $(ASYNCLOOK_OBJ) $(STREAMTCP_OBJ) $(PERF_OBJ) $(DELAYER_OBJ) \ 58*e86b9096SDag-Erling Smørgrav@@ -274,7 +280,7 @@ LINK_LIB=$(LIBTOOL) --tag=CC --mode=link $(CC) $(RUNTIME_PATH) $(CPPFLAGS) $(CFL 59*e86b9096SDag-Erling Smørgrav 60*e86b9096SDag-Erling Smørgrav all: $(COMMON_OBJ) $(ALLTARGET) 61*e86b9096SDag-Erling Smørgrav 62*e86b9096SDag-Erling Smørgrav-alltargets: unbound$(EXEEXT) unbound-checkconf$(EXEEXT) lib unbound-host$(EXEEXT) unbound-control$(EXEEXT) unbound-anchor$(EXEEXT) unbound-control-setup $(WINAPPS) $(PYUNBOUND_TARGET) 63*e86b9096SDag-Erling Smørgrav+alltargets: unbound$(EXEEXT) unbound-checkconf$(EXEEXT) lib unbound-host$(EXEEXT) unbound-control$(EXEEXT) unbound-anchor$(EXEEXT) unbound-control-setup unbound-fuzzme$(EXEEXT) $(WINAPPS) $(PYUNBOUND_TARGET) 64*e86b9096SDag-Erling Smørgrav 65*e86b9096SDag-Erling Smørgrav # compat with BSD make, register suffix, and an implicit rule to actualise it. 66*e86b9096SDag-Erling Smørgrav .SUFFIXES: .lo 67*e86b9096SDag-Erling Smørgrav@@ -325,6 +331,9 @@ libunbound.la: $(LIBUNBOUND_OBJ_LINK) 68*e86b9096SDag-Erling Smørgrav unbound$(EXEEXT): $(DAEMON_OBJ_LINK) libunbound.la 69*e86b9096SDag-Erling Smørgrav $(LINK) -o $@ $(DAEMON_OBJ_LINK) $(EXTRALINK) $(SSLLIB) $(LIBS) 70*e86b9096SDag-Erling Smørgrav 71*e86b9096SDag-Erling Smørgrav+unbound-fuzzme$(EXEEXT): $(FUZZME_OBJ_LINK) libunbound.la 72*e86b9096SDag-Erling Smørgrav+ $(LINK) -o $@ $(FUZZME_OBJ_LINK) $(EXTRALINK) $(SSLLIB) $(LIBS) 73*e86b9096SDag-Erling Smørgrav+ 74*e86b9096SDag-Erling Smørgrav unbound-checkconf$(EXEEXT): $(CHECKCONF_OBJ_LINK) libunbound.la 75*e86b9096SDag-Erling Smørgrav $(LINK) -o $@ $(CHECKCONF_OBJ_LINK) $(EXTRALINK) $(SSLLIB) $(LIBS) 76*e86b9096SDag-Erling Smørgrav 77*e86b9096SDag-Erling Smørgrav@@ -447,7 +456,7 @@ util/configparser.c util/configparser.h: $(srcdir)/util/configparser.y 78*e86b9096SDag-Erling Smørgrav 79*e86b9096SDag-Erling Smørgrav clean: 80*e86b9096SDag-Erling Smørgrav rm -f *.o *.d *.lo *~ tags 81*e86b9096SDag-Erling Smørgrav- rm -f unbound$(EXEEXT) unbound-checkconf$(EXEEXT) unbound-host$(EXEEXT) unbound-control$(EXEEXT) unbound-anchor$(EXEEXT) unbound-control-setup libunbound.la unbound.h 82*e86b9096SDag-Erling Smørgrav+ rm -f unbound$(EXEEXT) unbound-checkconf$(EXEEXT) unbound-fuzzme$(EXEEXT) unbound-host$(EXEEXT) unbound-control$(EXEEXT) unbound-anchor$(EXEEXT) unbound-control-setup libunbound.la unbound.h 83*e86b9096SDag-Erling Smørgrav rm -f $(ALL_SRC:.c=.lint) 84*e86b9096SDag-Erling Smørgrav rm -f _unbound.la libunbound/python/libunbound_wrap.c libunbound/python/unbound.py pythonmod/interface.h pythonmod/unboundmodule.py 85*e86b9096SDag-Erling Smørgrav rm -rf autom4te.cache .libs build doc/html doc/xml 86*e86b9096SDag-Erling Smørgrav@@ -1183,6 +1192,15 @@ stats.lo stats.o: $(srcdir)/daemon/stats.c config.h $(srcdir)/daemon/stats.h $(s 87*e86b9096SDag-Erling Smørgrav $(srcdir)/util/storage/slabhash.h $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/dnstree.h \ 88*e86b9096SDag-Erling Smørgrav $(srcdir)/util/rtt.h $(srcdir)/services/authzone.h $(srcdir)/validator/val_kcache.h \ 89*e86b9096SDag-Erling Smørgrav $(srcdir)/validator/val_neg.h 90*e86b9096SDag-Erling Smørgrav+unbound-fuzzme.lo unbound-fuzzme.o: $(srcdir)/smallapp/unbound-fuzzme.c \ 91*e86b9096SDag-Erling Smørgrav+ $(srcdir)/util/locks.h $(srcdir)/util/alloc.h $(srcdir)/services/modstack.h \ 92*e86b9096SDag-Erling Smørgrav+ $(srcdir)/daemon/remote.h $(srcdir)/util/config_file.h \ 93*e86b9096SDag-Erling Smørgrav+ $(srcdir)/util/storage/slabhash.h $(srcdir)/util/storage/lruhash.h $(srcdir)/services/listen_dnsport.h \ 94*e86b9096SDag-Erling Smørgrav+ $(srcdir)/util/netevent.h $(srcdir)/dnscrypt/dnscrypt.h $(srcdir)/services/cache/rrset.h \ 95*e86b9096SDag-Erling Smørgrav+ $(srcdir)/util/data/packed_rrset.h $(srcdir)/services/cache/infra.h $(srcdir)/util/storage/dnstree.h \ 96*e86b9096SDag-Erling Smørgrav+ $(srcdir)/util/rbtree.h $(srcdir)/util/rtt.h $(srcdir)/util/data/msgreply.h $(srcdir)/util/fptr_wlist.h \ 97*e86b9096SDag-Erling Smørgrav+ $(srcdir)/util/module.h $(srcdir)/util/data/msgparse.h $(srcdir)/sldns/pkthdr.h $(srcdir)/sldns/rrdef.h \ 98*e86b9096SDag-Erling Smørgrav+ $(srcdir)/util/tube.h $(srcdir)/services/mesh.h $(srcdir)/util/net_help.h $(srcdir)/util/ub_event.h 99*e86b9096SDag-Erling Smørgrav unbound.lo unbound.o: $(srcdir)/daemon/unbound.c config.h $(srcdir)/util/log.h $(srcdir)/daemon/daemon.h \ 100*e86b9096SDag-Erling Smørgrav $(srcdir)/util/locks.h $(srcdir)/util/alloc.h $(srcdir)/services/modstack.h \ 101*e86b9096SDag-Erling Smørgrav $(srcdir)/daemon/remote.h \ 102*e86b9096SDag-Erling Smørgravdiff --git a/smallapp/unbound-fuzzme.c b/smallapp/unbound-fuzzme.c 103*e86b9096SDag-Erling Smørgravnew file mode 100644 104*e86b9096SDag-Erling Smørgravindex 00000000..74ae5204 105*e86b9096SDag-Erling Smørgrav--- /dev/null 106*e86b9096SDag-Erling Smørgrav+++ b/smallapp/unbound-fuzzme.c 107*e86b9096SDag-Erling Smørgrav@@ -0,0 +1,38 @@ 108*e86b9096SDag-Erling Smørgrav+/* 109*e86b9096SDag-Erling Smørgrav+ * unbound-fuzzme.c - parse a packet provided on stdin (for fuzzing). 110*e86b9096SDag-Erling Smørgrav+ * 111*e86b9096SDag-Erling Smørgrav+ */ 112*e86b9096SDag-Erling Smørgrav+#include "config.h" 113*e86b9096SDag-Erling Smørgrav+#include "util/regional.h" 114*e86b9096SDag-Erling Smørgrav+#include "util/fptr_wlist.h" 115*e86b9096SDag-Erling Smørgrav+#include "sldns/sbuffer.h" 116*e86b9096SDag-Erling Smørgrav+ 117*e86b9096SDag-Erling Smørgrav+#define SZ 10000 118*e86b9096SDag-Erling Smørgrav+ 119*e86b9096SDag-Erling Smørgrav+int main() { 120*e86b9096SDag-Erling Smørgrav+ char buffer[SZ]; 121*e86b9096SDag-Erling Smørgrav+ size_t n_read = fread(buffer, 1, SZ, stdin); 122*e86b9096SDag-Erling Smørgrav+ if (n_read == SZ) { 123*e86b9096SDag-Erling Smørgrav+ printf("input too big\n"); 124*e86b9096SDag-Erling Smørgrav+ return 1; 125*e86b9096SDag-Erling Smørgrav+ } 126*e86b9096SDag-Erling Smørgrav+ sldns_buffer *pkt = sldns_buffer_new(n_read); 127*e86b9096SDag-Erling Smørgrav+ sldns_buffer_init_frm_data(pkt, buffer, n_read); 128*e86b9096SDag-Erling Smørgrav+ 129*e86b9096SDag-Erling Smørgrav+ struct regional *region = regional_create(); 130*e86b9096SDag-Erling Smørgrav+ 131*e86b9096SDag-Erling Smørgrav+ struct msg_parse* prs; 132*e86b9096SDag-Erling Smørgrav+ struct edns_data edns; 133*e86b9096SDag-Erling Smørgrav+ prs = (struct msg_parse*)malloc(sizeof(struct msg_parse)); 134*e86b9096SDag-Erling Smørgrav+ if(!prs) { 135*e86b9096SDag-Erling Smørgrav+ printf("out of memory on incoming message\n"); 136*e86b9096SDag-Erling Smørgrav+ return 1; 137*e86b9096SDag-Erling Smørgrav+ } 138*e86b9096SDag-Erling Smørgrav+ memset(prs, 0, sizeof(*prs)); 139*e86b9096SDag-Erling Smørgrav+ memset(&edns, 0, sizeof(edns)); 140*e86b9096SDag-Erling Smørgrav+ sldns_buffer_set_position(pkt, 0); 141*e86b9096SDag-Erling Smørgrav+ if(parse_packet(pkt, prs, region) != LDNS_RCODE_NOERROR) { 142*e86b9096SDag-Erling Smørgrav+ printf("parse error\n"); 143*e86b9096SDag-Erling Smørgrav+ return 1; 144*e86b9096SDag-Erling Smørgrav+ } 145*e86b9096SDag-Erling Smørgrav+} 146*e86b9096SDag-Erling Smørgrav-- 147*e86b9096SDag-Erling Smørgrav2.17.1 148*e86b9096SDag-Erling Smørgrav 149