AI-native code security scanner: runtime sandbox-validated remediation. Confirm exploits, auto-patch, replay against the fix — all at machine scale.
Project description
Argus Scanner
Verified vulnerability remediation at machine scale. Static scanners give CISOs more findings to triage; Argus closes them. Argus stacks three layers — deterministic preprocessing, semantic LLM reasoning, runtime sandbox validation — each doing what it's fastest at, so a vulnerability goes from detection to verified, sandbox-tested patch in minutes instead of weeks. The LLM designs the exploit; a Firecracker microVM proves it fires. The LLM writes the patch; the same sandbox replays the same exploit against the patched code. You ship kernel-evidence-verified fixes, not tickets that pile up.
Open source. BYOK. Apache 2.0.
Install
pip install argus-ai-scanner
export ANTHROPIC_API_KEY=sk-ant-...
argus scan path/to/file.py # single file
argus scan-repo . # whole repo
That's it. With just an Anthropic key, Argus runs the L1 cascade. Add a Fly.io sandbox (see docs/dast-setup.md, 10 min one-time) to turn on Validation + Remediation.
What a scan looks like
$ argus scan samples/regression_v1/high_with_vuln.py
high_with_vuln.py → suspicious (2 CONFIRMED, 0 NEUTRALIZED, 1 STILL_EXPLOITABLE, 1 UNVERIFIABLE)
cost: $0.31 time: 5m 50s
H001 CWE-78 command_injection critical CONFIRMED
function: run_user_command (line 7)
evidence: sandbox executed `; whoami` via shell=True interpolation
▼ Remediation: STILL_EXPLOITABLE
patch swapped shell=True for sh -c -- "$input" — still shell injection
manual review required
H002 CWE-78 command_injection critical CONFIRMED
function: list_directory (line 16)
evidence: sandbox executed `; cat /etc/passwd` via f-string interpolation
▼ Remediation: UNVERIFIABLE
sandbox couldn't decisively replay; manual review
Every CONFIRMED row has a kernel-level event trace. Every Remediation row has a generated patch + a sandbox-replay verdict on whether the patch actually closed the bug. Verbose output, JSON, and SARIF for GitHub Code Scanning all available via --output.
Architecture
The composition is the engineering. Each layer is structurally best-in-class for one job; skipping work the other layers can absorb is what makes the pipeline both fast and verified.
- Deterministic preprocessing — hash dedup, AST parsing, deobfuscation, known-malware hash lookup. Free, byte-deterministic. Argus never burns a token on what a hash match can decide.
- Semantic LLM — reads intent, designs exploits, writes patches, judges sandbox traces. The only layer that can answer "is this function supposed to take untrusted input?" Two role-based tiers: a scan tier (default Sonnet 4.6 — triage + L1 + DAST probe inference) and a deep-reasoning tier (default Opus 4.6 — borderline escalation, adversarial reasoning, adjudication). Both defaults are overridable to any model in the Anthropic ecosystem — bump to a newer Opus, run Opus in both slots for a high-precision audit, or point either tier at a future Anthropic-API-compatible model — via
--scan-model/--reasoning-model. No code edits, no lock-in. - Runtime sandbox (Firecracker microVM + kernel-syscall observation via bpftrace) — the ground-truth oracle. The only layer that can prove an exploit actually fired or a patch actually closed the hole.
Pure-SAST tools have no runtime. Classic DAST tools have no semantic reasoning. Pattern-based remediation tools generate patches without verification. Argus closes all three gaps in one pipeline.
File
↓
Preprocessing (deterministic, free — hash, deobfuscation, attack-vector flags)
↓
Triage (Sonnet 4.6 default — CLEAN / LOW / HIGH)
↓
L1 analysis (Sonnet 4.6 → Opus 4.6 escalation on borderline)
↓
[default ON]
Finding Validation (each L1 finding re-run in Firecracker microVM)
↓
Remediation (auto-patch + sandbox replay against original exploit)
↓
[opt-in]
Exploit Discovery (hunts for exploits L1 didn't see — `--enable-runtime-probe`)
Behavioral Profiling (runtime behavior capture — `--enable-phase-3-discovery`)
Adversarial Reasoning (model-designed hypotheses anchored on the profile — `--enable-phase-3-loop`)
↓
FP-defense oracle stack (structured assertions / downstream-cap / syscall-sink)
Engine guards (intent cap, findings-floor invariant)
↓
Final verdict
Default cost on a typical scan: $0.10–$0.40 per suspicious file. Opt-in zero-day hunting adds ~$0.30–$1.50/file. Cap with --max-cost.
Coverage
Static + LLM cascade (every supported format):
- Code: Python · JavaScript · TypeScript · shell · Java bytecode (
.class,.jar) - Supply-chain manifests:
package.json·requirements.txt·Cargo.lock·go.mod·Gemfile·composer.json·pyproject.toml·Pipfile· Dockerfile · Makefile ·.npmrc·.pypirc - AI-agent configs:
CLAUDE.md·mcp.json·.cursorrules·claude_desktop_config.json·AGENTS.md·devcontainer.json - Doc / web attack surface: Markdown · RST · AsciiDoc · HTML · SVG · XML
Sandbox (Validation + Remediation): Python · JS/TS · shell · Java bytecode. Non-executable formats stay cascade-only.
Dynamic MCP server scanning (argus mcp): black-box probing of live Model Context Protocol servers over stdio (sandboxed) or HTTP / SSE — SSRF (incl. cloud IMDS + alt IP encodings), redirect-to-internal, fail-open validation, and authorization bypass. Findings come from runtime evidence (sandbox network captures or out-of-band callbacks), not static guesses. See docs/mcp.md.
Roadmap: Go · Rust · .NET.
Per-finding statuses
| Status | Meaning |
|---|---|
CONFIRMED |
Sandbox observed the exploit firing. Patch generated by default. |
BLOCKED |
Attack was tested; the file's own code defended (sanitization, escaping). |
UNREACHED |
Attack was tested; the code path is genuinely unreachable. |
NOT_TESTED |
Sandbox couldn't execute the test. Sub-reason: infra_stub / inconclusive / not_planned. |
SUPPRESSED |
FP-defense oracle (structured assertion / downstream-cap / syscall-sink) refuted the static match. Audit trail preserved. |
For CONFIRMED findings, the Remediation block adds a post-patch status:
| Post-patch | Meaning |
|---|---|
NEUTRALIZED |
Sandbox replay shows the exploit no longer fires. Ship the patch. |
STILL_EXPLOITABLE |
Patch was insufficient. Sandbox still observes the original exploit firing. |
UNVERIFIABLE |
Sandbox couldn't decisively replay. Manual review. |
Enterprise invariants
- BYOK. You pay Anthropic + Fly directly. Argus collects nothing.
- Zero telemetry. Cascade-only mode: nothing leaves your machine. DAST mode: file content goes only to a Fly.io app you own and control — never to Argus-operated infrastructure.
- Hardware isolation. Detonation happens in Firecracker microVMs (KVM hardware virtualization), ephemeral per-run, strict egress control.
- Local execution. Self-contained pipeline; no SaaS dependency.
CLI essentials
# Skip patch generation (compliance / CI / read-only audits)
argus scan-repo . --no-enable-remediation
# Add zero-day hunting on top of the default cascade
argus scan path/to/file.py \
--enable-runtime-probe \
--enable-phase-3-discovery \
--enable-phase-3-loop
# CI mode — only files changed vs main, SARIF for GitHub Code Scanning
argus scan-repo . --diff origin/main --output sarif --output-file argus.sarif
# Cap per-file API spend
argus scan path/to/file.py --max-cost 0.50
# Swap the model on either tier — defaults are Sonnet 4.6 (scan) + Opus 4.6 (reasoning).
# Pass any Anthropic-ecosystem model_id; same id on both = high-precision audit mode.
argus scan path/to/file.py --scan-model claude-opus-4-8 --reasoning-model claude-opus-4-8
# Scan a live MCP server (no API key needed — probes are deterministic)
argus mcp enumerate --stdio "python -m my_mcp_server" # recon only
argus mcp scan --stdio "python -m my_mcp_server" # active probes, sandboxed
argus mcp scan --url https://mcp.example.com/mcp --authorized # remote (consent-gated)
Full reference: argus scan --help, argus scan-repo --help, argus install --help, argus mcp enumerate --help.
Documentation
| Topic | Page |
|---|---|
| Install + first scan | docs/install.md |
| MCP server scanning | docs/mcp.md |
| DAST sandbox setup (Fly.io) | docs/dast-setup.md |
| Architecture deep dive | docs/architecture.md |
| Cost guide | docs/cost-guide.md |
| API key sourcing | docs/api-keys.md |
| Roadmap | ROADMAP.md |
| Contributing | CONTRIBUTING.md |
| Security disclosures | SECURITY.md |
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file argus_ai_scanner-1.12.0.tar.gz.
File metadata
- Download URL: argus_ai_scanner-1.12.0.tar.gz
- Upload date:
- Size: 1.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf8d8ffbe9ad8e3a2e76f6f49f167cf8143014ac035e8cbddf5c0811dd23499c
|
|
| MD5 |
70f94fff8b20703785a156fde5cad6ab
|
|
| BLAKE2b-256 |
328982189f5b5361553885d8ba03570522be7c9e02baf06465de6f1b94baacb8
|
Provenance
The following attestation bundles were made for argus_ai_scanner-1.12.0.tar.gz:
Publisher:
release.yml on dshochat/Argus_Scanner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
argus_ai_scanner-1.12.0.tar.gz -
Subject digest:
bf8d8ffbe9ad8e3a2e76f6f49f167cf8143014ac035e8cbddf5c0811dd23499c - Sigstore transparency entry: 1695678928
- Sigstore integration time:
-
Permalink:
dshochat/Argus_Scanner@749db6941261ebdb5b6fda737c8a45bcda17cb7f -
Branch / Tag:
refs/tags/v1.12.0 - Owner: https://github.com/dshochat
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@749db6941261ebdb5b6fda737c8a45bcda17cb7f -
Trigger Event:
push
-
Statement type:
File details
Details for the file argus_ai_scanner-1.12.0-py3-none-any.whl.
File metadata
- Download URL: argus_ai_scanner-1.12.0-py3-none-any.whl
- Upload date:
- Size: 1.0 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59708a32b82f4a477a043f3a2b5308e0d0f195a70cf4eddfee03679905d57856
|
|
| MD5 |
b5486f44fb68cc7d2af22335fa468524
|
|
| BLAKE2b-256 |
36b5f8e2afb0593dc875e04e1c2c209a920db1b0ae02efcc0bd5b360e67280ea
|
Provenance
The following attestation bundles were made for argus_ai_scanner-1.12.0-py3-none-any.whl:
Publisher:
release.yml on dshochat/Argus_Scanner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
argus_ai_scanner-1.12.0-py3-none-any.whl -
Subject digest:
59708a32b82f4a477a043f3a2b5308e0d0f195a70cf4eddfee03679905d57856 - Sigstore transparency entry: 1695679072
- Sigstore integration time:
-
Permalink:
dshochat/Argus_Scanner@749db6941261ebdb5b6fda737c8a45bcda17cb7f -
Branch / Tag:
refs/tags/v1.12.0 - Owner: https://github.com/dshochat
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@749db6941261ebdb5b6fda737c8a45bcda17cb7f -
Trigger Event:
push
-
Statement type: