mirror of
https://github.com/coredns/coredns.git
synced 2025-10-27 00:04:15 -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