From 539e603206f427ff6549cde661fef0205a4c9034 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Fri, 15 Sep 2017 10:15:00 +0200 Subject: syz-manager, syz-fuzzer, executor: ensure that binaries are consistent Check that manager/fuzzer/executor are build on the same git revision, use the same syscall descriptions and the same target arch. Update #336 --- sys/linux/386.go | 4 +++- sys/linux/amd64.go | 4 +++- sys/linux/arm.go | 4 +++- sys/linux/arm64.go | 4 +++- sys/linux/init.go | 3 ++- sys/linux/ppc64le.go | 4 +++- sys/sys.go | 3 +++ sys/syz-sysgen/sysgen.go | 27 ++++++++++++++++++--------- 8 files changed, 38 insertions(+), 15 deletions(-) (limited to 'sys') diff --git a/sys/linux/386.go b/sys/linux/386.go index 60842fd78..edce34ee9 100644 --- a/sys/linux/386.go +++ b/sys/linux/386.go @@ -4,7 +4,7 @@ package linux import . "github.com/google/syzkaller/prog" func init() { - initArch(syscalls_386, resources_386, structDescs_386, consts_386, "386", 4) + initArch(revision_386, syscalls_386, resources_386, structDescs_386, consts_386, "386", 4) } var resources_386 = []*ResourceDesc{ @@ -17186,3 +17186,5 @@ var consts_386 = []ConstValue{ {Name: "__WCLONE", Value: 2147483648}, {Name: "__WNOTHREAD", Value: 536870912}, } + +const revision_386 = "fb26afa29ccd7317f2c0796cf1386b493eeb955f" diff --git a/sys/linux/amd64.go b/sys/linux/amd64.go index 5a64db3e7..53f1aacc4 100644 --- a/sys/linux/amd64.go +++ b/sys/linux/amd64.go @@ -4,7 +4,7 @@ package linux import . "github.com/google/syzkaller/prog" func init() { - initArch(syscalls_amd64, resources_amd64, structDescs_amd64, consts_amd64, "amd64", 8) + initArch(revision_amd64, syscalls_amd64, resources_amd64, structDescs_amd64, consts_amd64, "amd64", 8) } var resources_amd64 = []*ResourceDesc{ @@ -17268,3 +17268,5 @@ var consts_amd64 = []ConstValue{ {Name: "__WCLONE", Value: 2147483648}, {Name: "__WNOTHREAD", Value: 536870912}, } + +const revision_amd64 = "c14ec0f07c2984481a0bf1453ea928549382eb25" diff --git a/sys/linux/arm.go b/sys/linux/arm.go index 3eb900c60..b364bdc71 100644 --- a/sys/linux/arm.go +++ b/sys/linux/arm.go @@ -4,7 +4,7 @@ package linux import . "github.com/google/syzkaller/prog" func init() { - initArch(syscalls_arm, resources_arm, structDescs_arm, consts_arm, "arm", 4) + initArch(revision_arm, syscalls_arm, resources_arm, structDescs_arm, consts_arm, "arm", 4) } var resources_arm = []*ResourceDesc{ @@ -17140,3 +17140,5 @@ var consts_arm = []ConstValue{ {Name: "__WCLONE", Value: 2147483648}, {Name: "__WNOTHREAD", Value: 536870912}, } + +const revision_arm = "f73cb445fdead3417b165eec037a0d892cc3253e" diff --git a/sys/linux/arm64.go b/sys/linux/arm64.go index f82fa3974..8f90a0822 100644 --- a/sys/linux/arm64.go +++ b/sys/linux/arm64.go @@ -4,7 +4,7 @@ package linux import . "github.com/google/syzkaller/prog" func init() { - initArch(syscalls_arm64, resources_arm64, structDescs_arm64, consts_arm64, "arm64", 8) + initArch(revision_arm64, syscalls_arm64, resources_arm64, structDescs_arm64, consts_arm64, "arm64", 8) } var resources_arm64 = []*ResourceDesc{ @@ -17182,3 +17182,5 @@ var consts_arm64 = []ConstValue{ {Name: "__WCLONE", Value: 2147483648}, {Name: "__WNOTHREAD", Value: 536870912}, } + +const revision_arm64 = "72353a7ede1fe6cb903fcb02eb5eb11407bea5d8" diff --git a/sys/linux/init.go b/sys/linux/init.go index cbf93e963..509e2ab04 100644 --- a/sys/linux/init.go +++ b/sys/linux/init.go @@ -9,12 +9,13 @@ import ( "github.com/google/syzkaller/prog" ) -func initArch(syscalls []*prog.Syscall, resources []*prog.ResourceDesc, +func initArch(rev string, syscalls []*prog.Syscall, resources []*prog.ResourceDesc, structDescs []*prog.KeyedStruct, consts []prog.ConstValue, archName string, ptrSize uint64) { arch := makeArch(syscalls, resources, structDescs, consts, archName) target := &prog.Target{ OS: "linux", Arch: archName, + Revision: rev, PtrSize: ptrSize, PageSize: pageSize, DataOffset: dataOffset, diff --git a/sys/linux/ppc64le.go b/sys/linux/ppc64le.go index b1b9459ed..aa0f691a7 100644 --- a/sys/linux/ppc64le.go +++ b/sys/linux/ppc64le.go @@ -4,7 +4,7 @@ package linux import . "github.com/google/syzkaller/prog" func init() { - initArch(syscalls_ppc64le, resources_ppc64le, structDescs_ppc64le, consts_ppc64le, "ppc64le", 8) + initArch(revision_ppc64le, syscalls_ppc64le, resources_ppc64le, structDescs_ppc64le, consts_ppc64le, "ppc64le", 8) } var resources_ppc64le = []*ResourceDesc{ @@ -17172,3 +17172,5 @@ var consts_ppc64le = []ConstValue{ {Name: "__WCLONE", Value: 2147483648}, {Name: "__WNOTHREAD", Value: 536870912}, } + +const revision_ppc64le = "cec4f3697757a69ac044be83bac5ba45df7f2fbf" diff --git a/sys/sys.go b/sys/sys.go index 7f52504fe..3ab982fdb 100644 --- a/sys/sys.go +++ b/sys/sys.go @@ -74,3 +74,6 @@ func init() { } } } + +// Emitted by Makefile. +var GitRevision string diff --git a/sys/syz-sysgen/sysgen.go b/sys/syz-sysgen/sysgen.go index ce88cb539..ea3e3e110 100644 --- a/sys/syz-sysgen/sysgen.go +++ b/sys/syz-sysgen/sysgen.go @@ -21,6 +21,7 @@ import ( "github.com/google/syzkaller/pkg/ast" "github.com/google/syzkaller/pkg/compiler" + "github.com/google/syzkaller/pkg/hash" "github.com/google/syzkaller/pkg/serializer" "github.com/google/syzkaller/prog" "github.com/google/syzkaller/sys" @@ -79,9 +80,11 @@ func main() { sysFile := filepath.Join("sys", OS, job.Target.Arch+".go") out := new(bytes.Buffer) generate(job.Target, prog, consts, out) + rev := hash.String(out.Bytes()) + fmt.Fprintf(out, "const revision_%v = %q\n", job.Target.Arch, rev) writeSource(sysFile, out.Bytes()) - job.ArchData = generateExecutorSyscalls(job.Target, prog.Syscalls) + job.ArchData = generateExecutorSyscalls(job.Target, prog.Syscalls, rev) job.OK = true }() } @@ -132,8 +135,8 @@ func generate(target *sys.Target, prg *compiler.Prog, consts map[string]uint64, fmt.Fprintf(out, "import . \"github.com/google/syzkaller/prog\"\n\n") fmt.Fprintf(out, "func init() {\n") - fmt.Fprintf(out, "\tinitArch(syscalls_%v, resources_%v, structDescs_%v, consts_%v, %q, %v)\n", - target.Arch, target.Arch, target.Arch, target.Arch, target.Arch, target.PtrSize) + fmt.Fprintf(out, "\tinitArch(revision_%v, syscalls_%v, resources_%v, structDescs_%v, consts_%v, %q, %v)\n", + target.Arch, target.Arch, target.Arch, target.Arch, target.Arch, target.Arch, target.PtrSize) fmt.Fprintf(out, "}\n\n") fmt.Fprintf(out, "var resources_%v = ", target.Arch) @@ -157,21 +160,25 @@ func generate(target *sys.Target, prg *compiler.Prog, consts map[string]uint64, }) fmt.Fprintf(out, "var consts_%v = ", target.Arch) serializer.Write(out, constArr) - fmt.Fprintf(out, "\n") + fmt.Fprintf(out, "\n\n") } -func generateExecutorSyscalls(target *sys.Target, syscalls []*prog.Syscall) []byte { +func generateExecutorSyscalls(target *sys.Target, syscalls []*prog.Syscall, rev string) []byte { type SyscallData struct { Name string NR int32 } type ArchData struct { - CARCH []string - Calls []SyscallData - Fake []SyscallData + Revision string + GOARCH string + CARCH []string + Calls []SyscallData + Fake []SyscallData } data := ArchData{ - CARCH: target.CArch, + Revision: rev, + GOARCH: target.Arch, + CARCH: target.CArch, } fake := make(map[string]uint64) for _, c := range syscalls { @@ -247,6 +254,8 @@ struct call_t { var archTempl = template.Must(template.New("").Parse(` #if {{range $cdef := $.CARCH}}defined({{$cdef}}) || {{end}}0 +#define GOARCH "{{.GOARCH}}" +#define SYZ_REVISION "{{.Revision}}" {{range $c := $.Fake}}#define __NR_{{$c.Name}} {{$c.NR}} {{end}} static call_t syscalls[] = { -- cgit mrf-deployment