mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 02:03:20 -04:00 
			
		
		
		
	Add fuzzing infrastructure (#1118)
Fix file/fuzz.go build and docs in Makefile.fuzz Each plugin can add a fuzz.go to join the fuzzing craze. pkg/fuzz/do.go could be made a lot smarter, but is probably good enough for starters. $ make -f Makefile.fuzz <plugin> will build with go-fuzz-build and then execute a go-fuzz run. Each plugin's fuzz run uses a per-plugin directory to store the fuzz data.
This commit is contained in:
		
							
								
								
									
										33
									
								
								Makefile.fuzz
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								Makefile.fuzz
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| # Makefile for fuzzing | ||||
| # | ||||
| # Use go-fuzz and needs the tools installed. For each fuzz.go in a plugin's directory | ||||
| # you can start the fuzzing with: make -f Makefile.fuzz <plugin> | ||||
| # e.g. | ||||
| # | ||||
| # 	make -f Makefile.fuzz proxy | ||||
| #  | ||||
| # Each plugin that wants to join the fuzzing fray only needs to add a fuzz.go that calls | ||||
| # the plugins's ServeDNS and used the plugin/pkg/fuzz for the Do function. | ||||
| # | ||||
| # Installing go-fuzz | ||||
| #$ go get github.com/dvyukov/go-fuzz/go-fuzz | ||||
| #$ go get github.com/dvyukov/go-fuzz/go-fuzz-build | ||||
|  | ||||
| REPO:="github.com/coredns/coredns/plugin" | ||||
|  | ||||
| FUZZ:=$(dir $(wildcard plugin/*/fuzz.go)) # plugin/cache/ | ||||
| PLUGINS:=$(foreach f,$(FUZZ),$(subst plugin, ,$(f:/=))) # > /cache | ||||
| PLUGINS:=$(foreach f,$(PLUGINS),$(subst /, ,$(f))) # > cache | ||||
|  | ||||
| .PHONY: echo | ||||
| echo: | ||||
| 	@echo fuzz targets: $(PLUGINS) | ||||
|  | ||||
| .PHONY: $(PLUGINS) | ||||
| $(PLUGINS): echo | ||||
| 	go-fuzz-build $(REPO)/$(@) | ||||
| 	go-fuzz -bin=./$(@)-fuzz.zip -workdir=fuzz/$(@) | ||||
|  | ||||
| .PHONY: clean | ||||
| clean: | ||||
| 	rm *-fuzz.zip | ||||
							
								
								
									
										14
									
								
								plugin/cache/fuzz.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								plugin/cache/fuzz.go
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| package cache | ||||
|  | ||||
| import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/coredns/coredns/plugin/pkg/fuzz" | ||||
| ) | ||||
|  | ||||
| // Fuzz fuzzes cache. | ||||
| func Fuzz(data []byte) int { | ||||
| 	c := &Cache{pcap: defaultCap, ncap: defaultCap, pttl: maxTTL, nttl: maxNTTL, prefetch: 0, duration: 1 * time.Minute} | ||||
|  | ||||
| 	return fuzz.Do(c, data) | ||||
| } | ||||
							
								
								
									
										48
									
								
								plugin/file/fuzz.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								plugin/file/fuzz.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| package file | ||||
|  | ||||
| import ( | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/coredns/coredns/plugin/pkg/fuzz" | ||||
| 	"github.com/coredns/coredns/plugin/test" | ||||
| ) | ||||
|  | ||||
| // Fuzz fuzzes file. | ||||
| func Fuzz(data []byte) int { | ||||
| 	name := "miek.nl." | ||||
| 	zone, _ := Parse(strings.NewReader(fuzzMiekNL), name, "stdin", 0) | ||||
| 	f := File{Next: test.ErrorHandler(), Zones: Zones{Z: map[string]*Zone{name: zone}, Names: []string{name}}} | ||||
|  | ||||
| 	return fuzz.Do(f, data) | ||||
| } | ||||
|  | ||||
| const fuzzMiekNL = ` | ||||
| $TTL    30M | ||||
| $ORIGIN miek.nl. | ||||
| @       IN      SOA     linode.atoom.net. miek.miek.nl. ( | ||||
|                              1282630057 ; Serial | ||||
|                              4H         ; Refresh | ||||
|                              1H         ; Retry | ||||
|                              7D         ; Expire | ||||
|                              4H )       ; Negative Cache TTL | ||||
|                 IN      NS      linode.atoom.net. | ||||
|                 IN      NS      ns-ext.nlnetlabs.nl. | ||||
|                 IN      NS      omval.tednet.nl. | ||||
|                 IN      NS      ext.ns.whyscream.net. | ||||
|  | ||||
|                 IN      MX      1  aspmx.l.google.com. | ||||
|                 IN      MX      5  alt1.aspmx.l.google.com. | ||||
|                 IN      MX      5  alt2.aspmx.l.google.com. | ||||
|                 IN      MX      10 aspmx2.googlemail.com. | ||||
|                 IN      MX      10 aspmx3.googlemail.com. | ||||
|  | ||||
| 		IN      A       139.162.196.78 | ||||
| 		IN      AAAA    2a01:7e00::f03c:91ff:fef1:6735 | ||||
|  | ||||
| a               IN      A       139.162.196.78 | ||||
|                 IN      AAAA    2a01:7e00::f03c:91ff:fef1:6735 | ||||
| www             IN      CNAME   a | ||||
| archive         IN      CNAME   a | ||||
|  | ||||
| srv		IN	SRV     10 10 8080 a.miek.nl. | ||||
| mx		IN	MX      10 a.miek.nl.` | ||||
							
								
								
									
										25
									
								
								plugin/pkg/fuzz/do.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								plugin/pkg/fuzz/do.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| package fuzz | ||||
|  | ||||
| import ( | ||||
| 	"github.com/coredns/coredns/plugin" | ||||
| 	"github.com/coredns/coredns/plugin/test" | ||||
|  | ||||
| 	"github.com/miekg/dns" | ||||
| 	"golang.org/x/net/context" | ||||
| ) | ||||
|  | ||||
| // Do will fuzz p - used by gofuzz. See Maefile.fuzz for comments and context. | ||||
| func Do(p plugin.Handler, data []byte) int { | ||||
| 	ctx := context.TODO() | ||||
| 	ret := 1 | ||||
| 	r := new(dns.Msg) | ||||
| 	if err := r.Unpack(data); err != nil { | ||||
| 		ret = 0 | ||||
| 	} | ||||
|  | ||||
| 	if _, err := p.ServeDNS(ctx, &test.ResponseWriter{}, r); err != nil { | ||||
| 		ret = 1 | ||||
| 	} | ||||
|  | ||||
| 	return ret | ||||
| } | ||||
							
								
								
									
										19
									
								
								plugin/proxy/fuzz.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								plugin/proxy/fuzz.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| package proxy | ||||
|  | ||||
| import ( | ||||
| 	"github.com/coredns/coredns/plugin/pkg/fuzz" | ||||
|  | ||||
| 	"github.com/mholt/caddy" | ||||
| ) | ||||
|  | ||||
| // Fuzz fuzzes proxy. | ||||
| func Fuzz(data []byte) int { | ||||
| 	c := caddy.NewTestController("dns", "proxy . 8.8.8.8:53") | ||||
| 	up, err := NewStaticUpstreams(&c.Dispenser) | ||||
| 	if err != nil { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	p := &Proxy{Upstreams: &up} | ||||
|  | ||||
| 	return fuzz.Do(p, data) | ||||
| } | ||||
							
								
								
									
										19
									
								
								plugin/rewrite/fuzz.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								plugin/rewrite/fuzz.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| package rewrite | ||||
|  | ||||
| import ( | ||||
| 	"github.com/coredns/coredns/plugin/pkg/fuzz" | ||||
|  | ||||
| 	"github.com/mholt/caddy" | ||||
| ) | ||||
|  | ||||
| // Fuzz fuzzes rewrite. | ||||
| func Fuzz(data []byte) int { | ||||
| 	c := caddy.NewTestController("dns", "rewrite edns0 subnet set 24 56") | ||||
| 	rules, err := rewriteParse(c) | ||||
| 	if err != nil { | ||||
| 		return 0 | ||||
| 	} | ||||
| 	r := Rewrite{Rules: rules} | ||||
|  | ||||
| 	return fuzz.Do(r, data) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user