본문으로 건너뛰기
cccskills
무료GitHub에 공개

libafl

Use when a LibAFL fuzzer needs an executor, observer, feedback, mutator, scheduler, or objective composed around a target. Not for remote, credential, publish, deploy, or irreversible changes.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

설치 방법 보기

포함된 파일(2)

  • SKILL.md5.9 KB
  • agents/openai.yaml182 B

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

LibAFL custom fuzzer composition

Contract

FieldBound contract
TriggerUser needs a custom LibAFL fuzzer, observer, feedback, mutator, scheduler, or executor composition.
AuthorityReversible local: writes named local Rust source artifacts, corpus entries, and objective findings under the output directory; rollback is deleting the generated crate, the output directory, or reverting VCS changes. No remote mutation.
Side effectLocal-write: creates or modifies Rust source files implementing the composed fuzzing engine and target integration, plus corpus entries and crash/timeout findings under the output directory.
DoneThe composed LibAFL fuzzer compiles, runs the target, records coverage feedback, and persists objective findings to disk.

Inputs

  • Target: the function, binary, or harness to fuzz. Required.
  • Components: which LibAFL modules to compose, at minimum an executor, observer, feedback, and mutator. Optional; defaults to a coverage-guided in-process fuzzer with StdScheduledMutator and HitcountsMapObserver.
  • Objective: the stopping condition or crash classification (e.g., timeout, crash, custom ExitKind). Optional; defaults to crash detection.
  • Output directory: where corpus and findings persist. Optional; defaults to ./fuzz_out.

Procedure

  1. Identify the target boundary. Determine the function signature or binary entry point to fuzz. Confirm the target accepts byte-slice input (&[u8]) or can be wrapped in a BytesInput harness. Done when: the target boundary is identified and confirmed compatible with byte-slice input.

  2. Select the executor. Choose InProcessExecutor for in-process fuzzing or ForkserverExecutor / CommandExecutor for out-of-process. InProcessExecutor has no crash isolation in-process; when crash handling is needed, select InProcessForkExecutor, which forks per execution and catches crashes in the parent. Done when: one executor is selected and crash handling is configured.

  3. Select the observer. Create a HitcountsMapObserver backed by a CoverageMap (typically AFL-style shared memory). Wrap in MultiMapObserver if tracking multiple maps. Done when: one observer is selected and backed by a coverage map.

  4. Select the feedback. Combine MaxMapFeedback (coverage novelty) with TimeoutFeedback or CrashFeedback for objective classification. Use feedback_or! / feedback_and! macros to compose. Done when: feedback is composed with coverage novelty and objective classification.

  5. Select the objective. Define the stopping condition using CrashFeedback, TimeoutFeedback, or a custom ExitKind-based feedback. This determines what the fuzzer reports as a finding. Done when: one objective feedback is selected.

  6. Select the mutator. Choose StdScheduledMutator with a stack of mutations (havoc_mutations, token_mutations, or custom). For structured inputs, implement HasMaxSize and use encoded_mutations. Done when: one mutator is selected with its mutation stack.

  7. Select the scheduler. Use QueueScheduler for corpus cycling, PowerScheduleScheduler for power scheduling, or MinimizerScheduler wrapping another scheduler for corpus minimization. Done when: one scheduler is selected.

  8. Assemble the fuzzer. Create a StdFuzzer with the chosen scheduler and feedback. Wire the executor, observer, and objective. Done when: the StdFuzzer is assembled with all components wired.

  9. Set up the event manager. Use SimpleEventManager for single-process or LlmpEventManager for multi-process. Connect to a StatsMonitor (e.g., MultiMonitor printing to stdout). Done when: the event manager is set up and connected to a stats monitor.

  10. Initialize state and corpus. Create StdState with the initial corpus directory, the feedback, and the objective. Load seed inputs from the corpus directory or provide inline BytesInput seeds. Done when: StdState is initialized with corpus and seeds loaded.

  11. Run the fuzzer. Call fuzzer.fuzz_loop(...). The fuzzer will mutate inputs, execute the target, observe coverage, and persist new corpus entries and objective findings to the output directory. Done when: the fuzz loop runs and persists corpus entries and findings.

  12. Verify findings. After the run, inspect the output directory for crash/timeout artifacts. Replay each finding against the target to confirm reproducibility. Done when: every finding artifact is inspected and replayed against the target.

Failure and recovery

  • Compilation failure: LibAFL API changes between versions. Pin the libafl crate version in Cargo.toml. If compilation fails, check the LibAFL changelog for breaking API changes and adjust component wiring.
  • No coverage observed: the observer map may not be linked to the target. Verify the CoverageMap is shared with the executor (e.g., via OwnedMutRawPtr or forkserver shared memory). Fix the map linkage before re-running.
  • Target crash before fuzzing starts: the harness panics or aborts on initialization. Wrap the target in catch_unwind or fix the harness. Do not widen scope to debug the target itself.
  • Empty corpus: no seed inputs loaded. Provide at least one valid input in the corpus directory or inline. The fuzzer cannot make progress without seeds.
  • Non-convergent mutation: the mutator produces only invalid inputs that the target rejects immediately. Add a MapFeedback or custom IsInteresting feedback to guide toward valid input regions, or switch to a structured mutator.

Output

Compiled fuzzing engine binary in target/, live corpus in the output directory, persisted crash and timeout findings (each replayable against the target), and coverage statistics printed to the event manager monitor.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

Use when explaining System V AMD64, ARM AAPCS, RISC-V psABI, stack frames, variadic calls, or FFI register rules. Not for the Rust FFI binding layer: use rust-ffi.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

OutlineDriven/odin-claude-plugin372026년 9월 29일 업데이트

Use when configuring ADC sampling time, DMA-driven ADC, calibration, or DAC channel setup on bare-metal MCUs. Not for the DMA stream itself: use dma-baremetal.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

OutlineDriven/odin-claude-plugin372026년 9월 29일 업데이트

af-xdp

무료

Use when creating AF_XDP sockets, configuring UMEM and XSK rings, writing an XDP redirect program, or choosing copy versus zero-copy mode. Not for full kernel bypass: use dpdk.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

OutlineDriven/odin-claude-plugin372026년 9월 29일 업데이트

Use when a completed session needs an agent-environment retrospective. Not for an engineering retrospective from telemetry: use engineering-retrospective.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

OutlineDriven/odin-claude-plugin372026년 9월 29일 업데이트

Use when a redacted, trimmed agent transcript must be appended to a GitHub PR or issue body, with human approval and preview. Not for automated or model-initiated insertion.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

OutlineDriven/odin-claude-plugin372026년 9월 29일 업데이트

agents-md

무료

Use when a repo needs agent setup, AGENTS.md added or made lean, CLAUDE.md audited, or agent instructions scored or pruned. Not for remote, credential, publish, deploy, or irreversible changes.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

OutlineDriven/odin-claude-plugin372026년 9월 29일 업데이트

OutlineDriven의 스킬 모두 보기

이 스킬의 문제 신고