Repository navigation
fix(fuzz): retain encrypted private campaign evidence - #47
Merged
Merged
Conversation
Run scheduled campaigns through a private evidence wrapper that records the exact input, source identity, tool versions and raw libFuzzer output, then streams the archive into age. Upload only ciphertext; keep the public candidate schema unchanged. Retain failure-only QEMU execution evidence with an outcome receipt and map public candidate IDs to inputs in a private crash-triage index. Fail the campaign closed when recipients, encryption or upload fail. Set the QEMU libFuzzer per-input timeout above the 900-second guest bound in both the runner and local Makefile campaigns. Refs #46
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Scheduled fuzzing publishes only an opaque HMAC candidate ID. Raw libFuzzer inputs, stack traces and QEMU evidence were kept in
RUNNER_TEMPand discarded with the job, so the open candidates in #40 and #41 cannot be reproduced or root-caused even by maintainers.Outcome
Retain failure-only plaintext evidence inside the runner, seal it with
age, and publish only ciphertext. The public candidate schema, issue format and HMAC IDs are unchanged.Closes #46.
Design and scope
scripts/fuzz/private_evidence.py runrecords the exact command, revision, source hashes, source patch, guest-image hashes, tool versions, exit status and raw libFuzzer output in an exclusive private directory.sealstreams a tar/gzip archive directly intoage; onlycampaign.tar.gz.ageis uploaded, underfuzz-evidence-<job-index>. Plaintext never enters a cache or artifact.outcome.json. The receipt distinguishescrash,boot_timeout,guest_hangandexecution_error; an execution error alone is not a kernel defect.crash-triage --private-indexwrites a mode-0600 index mapping public candidate IDs to retained inputs. The public report remains exactly two fields and never embeds paths or payloads; the index cannot be written into the public output directory.FUZZ_EVIDENCE_RECIPIENTSis missing or malformed, or when encryption/upload fails, so the reporting job cannot create a pointer without evidence.-timeout=1200, above the executor's 900-second guest bound, in both the workflow runner and the local Makefile campaign targets.Security properties
sealrefuses symlinks, hard links, special files, incomplete runs, an existing output, and archives over 1 GiB.os.replace.FUZZ_EVIDENCE_RECIPIENTSis already configured on this repository andpreflightsucceeds.Validation
python3 -m pytest scripts/tests -qbash scripts/ci/entrypoint.sh toolsmake lintuserspace/fuzzertestsuserspace/fuzzerClippy-D warnings+ releasecrash-triagebuilduserspace/nilix-syz-fuzzertestsfuzzqemu_executor::testsFUZZ_EVIDENCE_RECIPIENTSpreflightgit diff --check(cr-at-eol)The real-guest QEMU smoke/campaign was not run locally; the PR relies on the existing
qemu-fuzzCI gate for the guest path.Compatibility and limitations
FUZZ_EVIDENCE_RECIPIENTSis removed or invalid.