Skip to content

Commit 99ed12e

Browse files
a-nogikhtarasmadan
authored andcommitted
syz-cluster: rewrite fuzz config generation
Instead of a predefined set of manually written syz-manager configs, construct it dynamically from different bits. During triage, select not just one, but all matching fuzzer configurations and then merge them together.
1 parent 790f0ff commit 99ed12e

39 files changed

+1846
-406
lines changed

pkg/db/db.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,3 +346,42 @@ func ReadCorpus(filename string, target *prog.Target) (progs []*prog.Prog, err e
346346
}
347347
return progs, nil
348348
}
349+
350+
type DeserializeFailure struct {
351+
File string
352+
Err error
353+
}
354+
355+
func Merge(into string, other []string, target *prog.Target) ([]DeserializeFailure, error) {
356+
dstDB, err := Open(into, false)
357+
if err != nil {
358+
return nil, fmt.Errorf("failed to open database: %w", err)
359+
}
360+
var failed []DeserializeFailure
361+
for _, add := range other {
362+
addDB, err := Open(add, false)
363+
if err == nil {
364+
// It's a DB file.
365+
for key, rec := range addDB.Records {
366+
dstDB.Save(key, rec.Val, rec.Seq)
367+
}
368+
continue
369+
}
370+
if target == nil {
371+
// We were not given a target, so we cannot parse it as a seed file.
372+
return nil, fmt.Errorf("failed to open db %v: %w", add, err)
373+
}
374+
data, err := os.ReadFile(add)
375+
if err != nil {
376+
return nil, err
377+
}
378+
if _, err := target.Deserialize(data, prog.NonStrict); err != nil {
379+
failed = append(failed, DeserializeFailure{add, err})
380+
}
381+
dstDB.Save(hash.String(data), data, 0)
382+
}
383+
if err := dstDB.Flush(); err != nil {
384+
return nil, fmt.Errorf("failed to save db: %w", err)
385+
}
386+
return failed, nil
387+
}

syz-cluster/pkg/api/api.go

Lines changed: 46 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,20 @@ type FuzzTask struct {
2020
FuzzConfig
2121
}
2222

23+
const (
24+
FocusNet = "net"
25+
FocusKVM = "kvm"
26+
FocusIoUring = "io_uring"
27+
FocusBPF = "bpf"
28+
FocusFS = "fs"
29+
)
30+
2331
// FuzzConfig represents a set of parameters passed to the fuzz step.
32+
// The triage step aggregates multiple KernelFuzzConfig to construct FuzzConfig.
2433
type FuzzConfig struct {
25-
Track string `json:"track"` // E.g. KASAN.
26-
Config string `json:"config"` // Refers to workflow/configs/{}.
27-
CorpusURL string `json:"corpus_url"`
34+
Track string `json:"track"` // E.g. KASAN.
35+
Focus []string `json:"focus"`
36+
CorpusURLs []string `json:"corpus_urls"`
2837
// Don't expect kernel coverage for the patched area.
2938
SkipCoverCheck bool `json:"skip_cover_check"`
3039
// Only report the bugs that match the regexp.
@@ -39,19 +48,24 @@ type Tree struct {
3948
EmailLists []string `json:"email_lists"`
4049
}
4150

51+
// KernelFuzzConfig is a specific fuzzing assignment.
52+
// Based on it, the triage step will construct FuzzTasks.
53+
type KernelFuzzConfig struct {
54+
EmailLists []string `json:"email_lists"`
55+
Track string `json:"track"` // E.g. KASAN.
56+
KernelConfig string `json:"kernel_config"`
57+
Focus string `json:"focus"`
58+
CorpusURL string `json:"corpus_url"`
59+
SkipCoverCheck bool `json:"skip_cover_check"`
60+
BugTitleRe string `json:"bug_title_re"`
61+
}
62+
4263
// FuzzTriageTarget is a single record in the list of supported fuzz configs.
4364
type FuzzTriageTarget struct {
4465
EmailLists []string `json:"email_lists"`
4566
Campaigns []*KernelFuzzConfig `json:"campaigns"`
4667
}
4768

48-
// KernelFuzzConfig is a specific fuzzing assignment.
49-
// Based on it, the triage step will construct FuzzTasks.
50-
type KernelFuzzConfig struct {
51-
KernelConfig string `json:"kernel_config"`
52-
FuzzConfig
53-
}
54-
5569
type BuildRequest struct {
5670
Arch string `json:"arch"`
5771
TreeName string `json:"tree_name"`
@@ -233,8 +247,8 @@ var DefaultTrees = []*Tree{
233247
const (
234248
netCorpusURL = `https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db`
235249
bpfCorpusURL = `https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db`
236-
allCorpusURL = `https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db`
237250
fsCorpusURL = `https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db`
251+
allCorpusURL = `https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db`
238252
)
239253

240254
const kasanTrack = "KASAN"
@@ -245,38 +259,32 @@ var FuzzTargets = []*FuzzTriageTarget{
245259
EmailLists: []string{`kvm@vger.kernel.org`},
246260
Campaigns: []*KernelFuzzConfig{
247261
{
262+
Track: kasanTrack,
248263
KernelConfig: `upstream-apparmor-kasan.config`,
249-
FuzzConfig: FuzzConfig{
250-
Track: kasanTrack,
251-
Config: `kvm`,
252-
CorpusURL: allCorpusURL,
253-
},
264+
Focus: FocusKVM,
265+
CorpusURL: allCorpusURL,
254266
},
255267
},
256268
},
257269
{
258270
EmailLists: []string{`io-uring@vger.kernel.org`},
259271
Campaigns: []*KernelFuzzConfig{
260272
{
273+
Track: kasanTrack,
261274
KernelConfig: `upstream-apparmor-kasan.config`,
262-
FuzzConfig: FuzzConfig{
263-
Track: kasanTrack,
264-
Config: `io-uring`,
265-
CorpusURL: allCorpusURL,
266-
},
275+
Focus: FocusIoUring,
276+
CorpusURL: allCorpusURL,
267277
},
268278
},
269279
},
270280
{
271281
EmailLists: []string{`bpf@vger.kernel.org`},
272282
Campaigns: []*KernelFuzzConfig{
273283
{
284+
Track: kasanTrack,
274285
KernelConfig: `upstream-apparmor-kasan.config`,
275-
FuzzConfig: FuzzConfig{
276-
Track: kasanTrack,
277-
Config: `bpf`,
278-
CorpusURL: bpfCorpusURL,
279-
},
286+
Focus: FocusBPF,
287+
CorpusURL: bpfCorpusURL,
280288
},
281289
},
282290
},
@@ -288,12 +296,10 @@ var FuzzTargets = []*FuzzTriageTarget{
288296
},
289297
Campaigns: []*KernelFuzzConfig{
290298
{
299+
Track: kasanTrack,
291300
KernelConfig: `upstream-apparmor-kasan.config`,
292-
FuzzConfig: FuzzConfig{
293-
Track: kasanTrack,
294-
Config: `net`,
295-
CorpusURL: netCorpusURL,
296-
},
301+
Focus: FocusNet,
302+
CorpusURL: netCorpusURL,
297303
},
298304
},
299305
},
@@ -307,11 +313,9 @@ var FuzzTargets = []*FuzzTriageTarget{
307313
Campaigns: []*KernelFuzzConfig{
308314
{
309315
KernelConfig: `upstream-apparmor-kasan.config`,
310-
FuzzConfig: FuzzConfig{
311-
Track: kasanTrack,
312-
Config: `fs`,
313-
CorpusURL: fsCorpusURL,
314-
},
316+
Track: kasanTrack,
317+
Focus: FocusFS,
318+
CorpusURL: fsCorpusURL,
315319
},
316320
},
317321
},
@@ -320,13 +324,10 @@ var FuzzTargets = []*FuzzTriageTarget{
320324
Campaigns: []*KernelFuzzConfig{
321325
{
322326
KernelConfig: `upstream-apparmor-kasan.config`,
323-
FuzzConfig: FuzzConfig{
324-
Track: kasanTrack,
325-
Config: `all`,
326-
CorpusURL: allCorpusURL,
327-
// Not all mm/ code is instrumented with KCOV.
328-
SkipCoverCheck: true,
329-
},
327+
Track: kasanTrack,
328+
CorpusURL: allCorpusURL,
329+
// Not all mm/ code is instrumented with KCOV.
330+
SkipCoverCheck: true,
330331
},
331332
},
332333
},
@@ -335,11 +336,8 @@ var FuzzTargets = []*FuzzTriageTarget{
335336
Campaigns: []*KernelFuzzConfig{
336337
{
337338
KernelConfig: `upstream-apparmor-kasan.config`,
338-
FuzzConfig: FuzzConfig{
339-
Track: kasanTrack,
340-
Config: `all`,
341-
CorpusURL: allCorpusURL,
342-
},
339+
Track: kasanTrack,
340+
CorpusURL: allCorpusURL,
343341
},
344342
},
345343
},
Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,10 @@
77
"syzkaller": "/syzkaller",
88
"workdir": "/workdir",
99
"type": "qemu",
10-
# The perf_event_open call generates too many false positive stalls.
11-
# The hfs/gfs mounts result in too many distracting kernel crashes that slow down diff fuzzing.
12-
"disable_syscalls": [ "perf_event_open*", "syz_mount_image$hfs", "syz_mount_image$gfs*"],
1310
"procs": 3,
1411
"sandbox": "none",
1512
"experimental": {"cover_edges": false},
16-
"vm": {
13+
"vm": {
1714
"count": 3,
1815
"cmdline": "root=/dev/sda1",
1916
"kernel": "/base/kernel",

0 commit comments

Comments
 (0)