Import VulnHunter as a forge-agnostic security-audit capability (exploratory) #64
Labels
No labels
blocked
bug
decision
duplicate
enhancement
help wanted
invalid
landed?
question
ready-to-merge
stale
wontfix
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
allod/strategy#64
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Import VulnHunter into Allod as a self-hosted, forge-agnostic security-audit capability, decoupled from GitHub and from a Docker-based exploit sandbox. This is exploratory: the goal below is settled, but the design decisions in "Open questions" are not, and no component should be called implementation-ready until they are answered.
VulnHunter (Neal Bridges' maintained fork of Capital One's original, Apache-2.0) is an agentic security auditor delivered almost entirely as harness-portable prompt files. A core
/vulnhuntscanner orchestrates subagents that inventory every attacker-controllable input, trace each forward to dangerous sinks through five gates, adversarially try to disprove each candidate, and ship only findings backed by an executable exploit test plus a class-level fix. Two sibling skills close the loop:/vulnhunter-fix(test-driven remediation that opens PRs) and/vulnhunt-fix-verify(a read-only independent verifier). A Pythonvulnhunter-agentruns the scanner headlessly and files issues; aharness/package does batch scans and benchmarking.Primary goals:
ghcoupling in the fixer and the headless agent with Forgejo via ourforgeCLI, so the hunt → fix → verify loop runs against Allod repos end to end.Current state: where it is coupled
GitHub/
ghcoupling is concentrated in two components, not the core scanner:vulnhunter-fixdrivesghdirectly throughout:gh auth status/gh api userpreflight (vulnhunter-fix/SKILL.md:153),gh api repos/.../branches/mainfor the version check (vulnhunter-fix/SKILL.md:123),gh issue list --repo owner/repoto harvestvulnhunter-labeled findings (vulnhunter-fix/prompts/parse_issues.md:76), andgh pr createwithCloses #Nauto-close keywords at delivery (vulnhunter-fix/SKILL.md:279,337). The fork/in-place mode detection assumes a GitHub checkout.vulnhunter-agentis a Python runtime with a dedicatedGitHubConfigandVULNHUNT_GITHUB_*token contract (vulnhunter-agent/agent/config.py:12-14,123), posts one GitHub issue per finding (vulnhunter-agent/agent/config.py:215), and gates token injection on agithub.hostmatch. It drives the scanner through the Claude Agent SDK and a bundled Claude Code CLI.The core
/vulnhuntscanner,/vulnhunt-fix-verify, and the newvulnhunter-runoperator skill are prompt-only and effectively VCS-neutral already; the scanner only references Docker as a build-config file it deliberately ignores (vulnhunt/SKILL.md:92). The real Docker dependency is the fork's roadmap direction, "sandbox-first exploit validation — Docker-first runtime provisioning," where Medium+ findings must execute against a containerized runtime;vulnhunter-agent/agent/verify_runner.py:87already assumes it can run inside a Docker image.Why Docker is in question
Allod already sandboxes each agent inside a dedicated dev VM (the architecture principle that the VM is the cage). Nested Docker for exploit execution is therefore either redundant with the VM boundary or unavailable, depending on whether the dev VM permits the needed kernel features and nested virtualization. The decision is not "port the Docker layer" but "choose the sandbox the VM model actually gives us."
Open questions (settle before implementation)
These are the design decisions to resolve in the interview; each materially changes the work.
allod/vulnhunterrepo holding the vendored fork, or vendored into an existing repo? A new repo is the default given it is a self-contained subtree with its own Python packages.ghoperations (auth check, issue list, PR create, branch SHA) toforge/Forgejo equivalents, versus a full provider-pluggable interface. The shim is smaller and matches our one-forge reality; the interface keeps upstream-merge friction lower.Scope
In scope here: the import plan and the forge-agnostic and sandbox decisions for the whole suite. Out of scope until the open questions are answered: any code edits, the choice of which model actually runs it, and the benchmarking
harness/package (keep as-is initially; it is developer tooling, not the runtime). Labels and any cross-repo child issues to be added by the owner once the landing site is chosen.this issue was written by Opus 4.8 because
ARRRRGGGGGGHHHHHH