From d49ca8747d8174f229b838649098d8eb684dc75b Mon Sep 17 00:00:00 2001 From: Joey Jiao Date: Thu, 5 Sep 2024 15:32:08 +0800 Subject: all: add /addcandidate rest api to upload new prog as candidate ex to upload prog to syzkaller: curl -s --noproxy 0.0.0.0 -F "file=@prog" http://0.0.0.0:8888/addcandidate --- pkg/manager/http.go | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'pkg') diff --git a/pkg/manager/http.go b/pkg/manager/http.go index cbde6d151..6d4e2ac40 100644 --- a/pkg/manager/http.go +++ b/pkg/manager/http.go @@ -81,6 +81,7 @@ func (serv *HTTPServer) Serve() { handle("/vms", serv.httpVMs) handle("/vm", serv.httpVM) handle("/metrics", promhttp.HandlerFor(prometheus.DefaultGatherer, promhttp.HandlerOpts{}).ServeHTTP) + handle("/addcandidate", serv.httpAddCandidate) handle("/syscalls", serv.httpSyscalls) handle("/corpus", serv.httpCorpus) handle("/corpus.db", serv.httpDownloadCorpus) @@ -734,6 +735,46 @@ func (serv *HTTPServer) modulesInfo(w http.ResponseWriter, r *http.Request) { serv.jsonPage(w, r, "modules", cover.Modules) } +func (serv *HTTPServer) httpAddCandidate(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "only POST method supported", http.StatusMethodNotAllowed) + return + } + err := r.ParseMultipartForm(20 << 20) + if err != nil { + http.Error(w, fmt.Sprintf("failed to parse form: %v", err), http.StatusBadRequest) + return + } + file, _, err := r.FormFile("file") + if err != nil { + http.Error(w, fmt.Sprintf("failed to retrieve file from form-data: %v", err), http.StatusBadRequest) + return + } + defer file.Close() + data, err := io.ReadAll(file) + if err != nil { + http.Error(w, fmt.Sprintf("failed to read file: %v", err), http.StatusBadRequest) + return + } + prog, err := ParseSeed(serv.Cfg.Target, data) + if err != nil { + http.Error(w, fmt.Sprintf("failed to parse seed: %v", err), http.StatusBadRequest) + return + } + if !prog.OnlyContains(serv.Fuzzer.Load().Config.EnabledCalls) { + http.Error(w, "contains disabled syscall", http.StatusBadRequest) + return + } + var flags fuzzer.ProgFlags + flags |= fuzzer.ProgMinimized + flags |= fuzzer.ProgSmashed + candidates := []fuzzer.Candidate{{ + Prog: prog, + Flags: flags, + }} + serv.Fuzzer.Load().AddCandidates(candidates) +} + var alphaNumRegExp = regexp.MustCompile(`^[a-zA-Z0-9]*$`) func isAlphanumeric(s string) bool { -- cgit mrf-deployment