Ein schneller universeller Code-Sicherheitsscanner, geschrieben in Rust. Inklusive aller Werkzeuge: Unterstützt 14 Sprachen, TUI für Triage, Geheimnisse, Post-Quanten-Audits, diff-bewusste Scans und mehr 𓃥
<p align="center"> <img src="https://raw.githubusercontent.com/0sec-labs/foxguard/main/www/public/foxguard-logo.png" width="128" alt="foxguard" /> </p> <h1 align="center">foxguard</h1> <p align="center"> <strong>Schnelles lokales Sicherheitsscanning für Code, Secrets, Abhängigkeiten und Krypto-Risiken.</strong> <br /> <sub>Integriert in <a href="https://github.com/0sec-labs/0sec">0sec</a>, den offenen Cybersecurity-Harness.</sub> </p> <p align="center"> <a href="https://github.com/0sec-labs/foxguard/actions/workflows/ci.yml"><img src="https://github.com/0sec-labs/foxguard/actions/workflows/ci.yml/badge.svg" alt="CI" /></a> <a href="https://github.com/0sec-labs/foxguard"><img src="https://img.shields.io/badge/foxguard-clean-3fb950" alt="foxguard: clean" /></a> <a href="https://crates.io/crates/foxguard"><img src="https://img.shields.io/crates/v/foxguard?color=d97706&label=crates.io" alt="crates.io" /></a> <a href="https://www.npmjs.com/package/foxguard"><img src="https://img.shields.io/npm/v/foxguard?color=d97706&label=npm" alt="npm" /></a> <a href="https://pypi.org/project/foxguard/"><img src="https://img.shields.io/pypi/v/foxguard?color=d97706&label=PyPI" alt="PyPI" /></a> <a href="https://github.com/apps/foxguard-app/installations/new"><img src="https://img.shields.io/badge/GitHub_App-Install-2ea44f?logo=github" alt="Install GitHub App" /></a> </p> ```sh npx foxguard . ``` <p align="center"> <img src="https://assets.kitploit.com/production/public/readmes/13909/2ce579a58299a47cd3e965f13b97bf1c5dcaf020496d4a4eb2141d414ff7bd0c.gif" alt="foxguard scan demo" width="640" /> </p> ## Warum - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/checklist.png" alt=""> Über 200 integrierte Regeln für 12 Quellsprachen, plus Konfigurations- und Manifest-Prüfungen - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/git-branch.png" alt=""> Taint-Tracking für 14 Sprachen, mit dateiübergreifender Analyse für Python, JavaScript, Go, Java, Ruby, PHP, C# und Kotlin - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/zap.png" alt=""> Schnelle lokale und CI-Scans, mit Diff-Modus für „Was hat dieser Branch hinzugefügt?“ - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/key.png" alt=""> Secrets-Scanning, OSV-gestütztes Abhängigkeits-Scanning und Post-Quanten-Krypto-Audit - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/plug.png" alt=""> Semgrep/OpenGrep-kompatible YAML-Bridge, die ~98 % der öffentlichen Registry lädt ([Abdeckungsbericht](https://github.com/0sec-labs/foxguard/blob/main/docs/parity/registry-coverage.md)) - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/file-code.png" alt=""> Terminal-, JSON-, SARIF-, CycloneDX 1.6 CBOM- und Semgrep-kompatible JSON-Ausgabe ## Installation ```sh npx foxguard . # zero install pipx install foxguard # prebuilt CLI from PyPI curl -fsSL https://foxguard.dev/install.sh | sh # prebuilt binary (macOS/Linux) cargo install foxguard # from source ``` Eigenständige Binary-Installer verifizieren GitHub-Release-Binaries gegen `checksums.txt`. Release-Binaries veröffentlichen außerdem GitHub-Artefakt-Attestierungen; verwenden Sie `gh attestation verify` zur manuellen Verifikation oder siehe [Release-Provenienz](https://github.com/0sec-labs/foxguard/blob/main/docs/release-provenance.md). PyPI-Wheels unterstützen Python 3.9+ unter Linux glibc 2.28+ (x86_64/ARM64), macOS (Intel/Apple Silicon) und Windows x86_64. In einer bestehenden Python-Virtual- Umgebung verwenden Sie stattdessen `python -m pip install foxguard`. Diese installieren die native CLI ohne Rust-Compiler oder Laufzeit-Binary-Download; es wird keine Python-API bereitgestellt. Alpine/musl-Nutzer sollten die eigenständigen Linux-Release-Binaries verwenden. **GitHub Action:** ```yaml - uses: 0sec-labs/foxguard/[email protected] with: path: . severity: medium fail-on-findings: "true" upload-sarif: "true" ``` **pre-commit:** ```yaml repos: - repo: https://github.com/0sec-labs/foxguard rev: v0.14.0 hooks: - id: foxguard ``` Integrationen: [GitHub App](https://github.com/apps/foxguard-app/installations/new), [VS Code](https://marketplace.visualstudio.com/items?itemName=peaktwilight.foxguard), [Claude Code Plugin](https://github.com/0sec-labs/foxguard/blob/main/docs/claude-code-integration.md) und [MCP-Server](https://github.com/0sec-labs/foxguard/blob/main/docs/mcp-server.md). ### Betrieb der gehosteten GitHub App `foxguard-github-app` schreibt zeilengetrennte JSON-Logs. Abgeschlossene und fehlgeschlagene Scans verwenden `event=foxguard.scan.completed` und `event=foxguard.scan.failed`, mit Feldern für Delivery, Installation, Repository, PR, Commit, Dauer und `usage_scope` zur Korrelation. Behalten Sie Identifikatoren als Log-Felder bei, nicht als Metrik-Labels. Setzen Sie `FOXGUARD_INTERNAL_ACCOUNTS` auf eine kommagetrennte Liste Ihrer eigenen GitHub- Konten und Organisationen. Die Übereinstimmung ist case-insensitive. Andere Inhaber werden als `external` klassifiziert; eine nicht gesetzte Liste oder ein fehlender Inhaber ergibt `unknown`. Externe Aktivität ist kein Beweis für einen zahlenden Kunden, und Scans sind keine Personen. Die Installations-Registry wird beim Start und stündlich gegen alle Seiten von GitHubs App- Installations-API abgeglichen. Fehlgeschlagene Aktualisierungen behalten den bestehenden Zustand bei; gleichzeitige Webhooks haben Vorrang. Spärliche Webhook-Metadaten bewahren bekannte Kontodetails und beobachtete Repository-Namen. Diese Namen sind kein vollständiges Inventar der zugänglichen Repositories einer Installation. Persistieren Sie `FOXGUARD_INSTALLATIONS_PATH` und `FOXGUARD_PULL_REQUEST_JOBS_PATH` auf dauerhaftem Speicher. Überwachen Sie `foxguard.installations.reconcile_failed` zusammen mit Scan-Fehlern; `foxguard.installations.reconciled` meldet die Gesamtzahl und die Anzahl interner/externer/unbekannter Installationen nach einer erfolgreichen Aktualisierung. Dimensionieren Sie `FOXGUARD_PR_WORKERS` anhand des gemessenen Spitzen-Speicherverbrauchs des Scanners und des Container-Speicherlimits: OOM-Kills von Kindprozessen können auftreten, ohne die gehostete Anwendung neu zu starten. ## Schnellstart ```sh foxguard . # scan everything foxguard diff main . # only new findings vs main foxguard tui . # interactive terminal review foxguard secrets . # leaked credentials and keys foxguard sca . # dependency vulnerabilities from OSV foxguard pqc . # post-quantum crypto audit foxguard --format sarif . > results.sarif foxguard --format semgrep-json . # Semgrep CLI-compatible JSON ``` Verwenden Sie `foxguard --fix src/` oder `foxguard --fix src/app.py`, um unterstützte Taint- Fixes direkt anzuwenden. Ziele werden gegen das kanonische Scan-Verzeichnis oder die ausgewählte Datei geprüft; Funde außerhalb dieses Bereichs werden übersprungen. Python-Command-Injection- Fixes fügen bei Bedarf `import subprocess` hinzu und bewahren Modul-Docstrings und Future- Imports. Überprüfen Sie generierte Änderungen, bevor Sie sie committen. Datei-Lese-, Metadaten- und Verzeichnisdurchlauf-Fehler im nativen Code-Scanner beenden den Vorgang mit `2`, anstatt einen erfolgreichen Bericht zu erzeugen oder eine Baseline zu überschreiben. Beabsichtigte Ausschlüsse sowie nicht unterstützte, binäre oder übergroße Dateien bleiben Überspringungen; prüfen Sie die Hinweise zu übersprungenen Dateien, wenn Sie die Scan-Abdeckung kontrollieren. ## Terminal-Review Führen Sie `foxguard tui .` aus und wählen Sie **Scan**, **Diff**, **Secrets** oder **PQC** mit den Pfeiltasten oder Tab. Im Diff-Modus geben Sie den Ziel-Branch ein, bevor Sie Enter drücken. Breite Terminals zeigen Funde neben ihren Details; kleinere Terminals verwenden eine Liste mit einer erweiterbaren Detailansicht. Quellkontext, Datenfluss und Fixes bleiben scrollbar, wann immer der Fund sie bereitstellt. Der Header trennt Scan-Statistiken von Baseline-Kategorien. Ausgewählte Quell- bereiche werden inline hervorgehoben, ohne zusätzliche Anmerkungszeilen. Öffnende Steuerelemente bleiben unterhalb des Live-Detailbereichs, während dessen Inhalt scrollt, und verkürzte Datei- positionen behalten ihre Zeilen- und Spalten-Suffixe. Suche und Dialoge besitzen ihre Tastenkürzel, solange sie aktiv sind. Wenn der Quellkontext nicht geladen werden kann, bleibt der gespeicherte Fund-Ausschnitt verfügbar. Secrets verwenden redigierte Ausschnitte, anstatt rohen Quellcode in den Detailbereich zu laden. Die Ladekarte zeigt unbestimmte Aktivität und die tatsächlich verstrichene Zeit an, nicht eine prozentuale Schätzung. Ctrl+C beendet während des Scannens. | Taste | Aktion | |-----|--------| | `j` / `k`, Pfeiltasten, Home / End | Zwischen Funden wechseln | | `v` | Detail erweitern oder zur Listen-/Split-Ansicht zurückkehren | | PageUp / PageDown | Die Liste seitenweise durchblättern oder sichtbares Detail scrollen | | `/`, Enter | Eine Suche bearbeiten und anwenden | | Ctrl+U | Die gerade bearbeitete Suche löschen | | Esc | Ein Modal schließen, Suchbearbeitungen abbrechen, erweitertes Detail verlassen oder angewendete Filter löschen | | `0`–`4`, `c`, Shift+C | Mindest-Severity, Konfidenzschwelle und Sortierreihenfolge | | `f` | Zyklus Alle → Unreviewed → Todo → Reviewed → Ignore | | `i` | Triage-Aktionen in der Vorschau anzeigen und anwenden | | Space, `a`, `x` | Einen Fund markieren, sichtbare Auswahlen umschalten und eine Batch-Aktion in der Vorschau anzeigen | | Shift+F | Benannte Filter speichern, laden, ersetzen oder löschen; Review-Speicher wiederherstellen | | `b` | Baseline-Kategorien durchschalten, wenn ein Vergleich verfügbar ist | | Tab, Enter / `o` | Finding/Source/Sink auswählen und im Editor öffnen | | `w`, `[` / `]` | Hinweise anzeigen und deren Verlauf scrollen; neueste Hinweise erscheinen zuerst | | `e` | CBOM, JSON oder SARIF exportieren | | `?`, `q` / Ctrl+C | Hilfe und Beenden; Ctrl+C funktioniert auch in jedem Modal | Enter und `o` verwenden ein nicht leeres `$VISUAL`, dann `$EDITOR`. Ohne eine dieser Einstellungen sucht foxguard nach `nvim`, `vim`, `nano` oder `vi` im `PATH`, bevor ein verfügbarer Desktop-Öffner in Betracht gezogen wird. Headless-Terminals erfordern kein `xdg-open`. Führen Sie beispielsweise `VISUAL="nvim" foxguard tui .` aus oder setzen Sie `EDITOR='code --wait'`. Eine fehlerhafte explizite Editor-Einstellung wird gemeldet, anstatt stillschweigend ersetzt zu werden; wenn kein Editor verfügbar ist, bleibt die TUI mit Einrichtungs- anleitung geöffnet. Unterstützte Editoren springen zur ausgewählten Finding/Source/Sink-Zeile. Review-Markierungen werden automatisch im benutzerspezifischen Speicher persistiert, begrenzt auf das kanonische Projekt-Root und den Scan-Modus (einschließlich des Ziels im Diff-Modus). Benannte Filter stellen Suche, Severity, Konfidenz, Review-Status, Sortierung und Baseline-Kategorie wieder her, wenn sie mit Shift+F geladen werden. Sie ändern nicht die Repository-Scan-Konfiguration. Die Liste zeigt sichtbare/gesamte Funde und den Review-Fortschritt; das Ändern von Filtern oder der Sortierung behält denselben Fund ausgewählt, wenn er sichtbar bleibt. Das Abbrechen von Such- bearbeitungen stellt die zuvor angewendete Abfrage wieder her. Markierte Funde überleben Filteränderungen. `x` öffnet Batch-Aktionen; Enter zeigt die exakten Ziele, die Anzahl ausgeblendeter Auswahlen, das Ziel und den Wirkungsbereich. Nur `y` wendet die Vorschau an; erneutes Enter bestätigt sie nicht, und Esc bricht ab, ohne zu schreiben. Baseline-Aktionen fügen exakte Fingerprints hinzu. Regel-/Datei- und projektweite Konfigurationsaktionen können auch nicht ausgewählte Funde betreffen, wie die Vorschau warnt. Wenn ein Konfigurationsziel fehlschlägt, bleiben erfolgreiche Schreibvorgänge bestehen und die Ergebnisse werden gemeldet; der Batch ist keine Transaktion. Der Speicher verwendet `$XDG_STATE_HOME/foxguard/tui` (oder `~/.local/state/foxguard/tui`) unter Linux, Application Support unter macOS und `%LOCALAPPDATA%` unter Windows. Atomare Schreibvorgänge und Revisionsprüfungen verhindern, dass ein Terminal einen anderen stillschweigend überschreibt. Speicherfehler hinterlassen lokale Änderungen sichtbar als **UNSAVED**. In Shift+F versucht `w` das Speichern erneut, `r` lädt explizit von der Festplatte neu, und Shift+R bestätigt ein Backup-und-Reset des aktuellen Projekts/Modus. Neu laden/Zurücksetzen kann ungespeicherte Änderungen verwerfen; das Zurücksetzen bewahrt die vorherigen On-Disk-Bytes, nicht ungespeicherte Markierungen. Der Review-Speicher enthält Fingerprints und Filtereinstellungen, keinen Quellcode. Exporte enthalten die Ergebnisse des aktuellen Scans, nicht nur die sichtbaren gefilterten Zeilen, und werden in das aktuelle Arbeitsverzeichnis geschrieben. Bestehende reguläre Dateien erfordern eine explizite `y`-Bestätigung; Esc bricht ab. Schreibvorgänge sind atomar und Ziel- Symlinks, einschließlich hängender Links, werden abgelehnt. Verwenden Sie `foxguard tui --baseline .foxguard/baseline.json .`, um einen gespeicherten Baseline-Vergleich zu überprüfen. Anders als die CLI-Unterdrückung behält die Terminal-Review aktuelle Funde bei und trennt **introduced**, **recurring** und **resolved** Einträge. Resolved bedeutet, dass sie in der Ausgabe des aktuellen Scans fehlen, nicht verifizierte Behebung: Vergleichen Sie äquivalenten Umfang, Regeln und Schwellenwerte. Die Baseline-Identität umfasst die Datei und den Quellort, sodass das Verschieben eines Fundes als introduced plus resolved erscheinen kann. Resolved-Zeilen sind schreibgeschützte historische Metadaten; nur die Suche gilt, und `v` erweitert ihre scrollbaren Details. Wechseln Sie zurück zu einer Kategorie aktueller Funde, um den aktuellen Scan zu triagieren oder zu exportieren. Git Diff bleibt ein separater Vergleich gegen einen Branch. ## Sprachabdeckung | Sprache | Integrierte Regeln | Taint-Tracking | Framework-bewusste Regeln | |----------|:-:|:-:|---| | JavaScript / TypeScript | Ja | Ja | Express, Next.js | | Python | Ja | Ja | Django, Flask, FastAPI | | Go | Ja | Ja | Gin | | Kotlin | Ja | Ja | Spring | | Java | Ja | Ja | Spring | | Ruby | Ja | Ja | Rails | | PHP | Ja | Ja | Laravel | | Rust | Ja | -- | -- | | C# | Ja | Ja | .NET | | Swift | Ja | Ja | iOS | | Haskell | Ja | -- | Cardano seed rules | Taint-Tracking deckt außerdem C, Bash und Solidity ab. Konfigurations-, Manifest- und External-Rule-Scans decken Dockerfile, Nginx, Apache, HAProxy, HCL/Terraform, YAML/JSON/XML/HTML, C via Semgrep YAML/Coccinelle und mehr ab. ## Sicherheitsmodi ```sh foxguard sca . foxguard pqc . foxguard --rules ./semgrep-rules . ``` SCA unterstützt `Cargo.lock`, `package-lock.json`, `pnpm-lock.yaml`, `requirements.txt`, `poetry.lock` und `Pipfile.lock`. Das PQC-Audit ist eine zweiseitige Scorecard: Es markiert quantengefährdete Primitive (RSA, ECDSA/DSA, ECDH/DH) mit CNSA 2.0-Migrationsfristen und erkennt außerdem bereits verwendete Post-Quanten-Algorithmen (ML-KEM, ML-DSA, SLH-DSA, FN-DSA, HQC und Hybride wie X25519MLKEM768) als informatives, quantenresistentes Inventar — und meldet einen Migrationsbereitschaftsprozentsatz. Beide Seiten exportieren in ein CycloneDX 1.6 CBOM, in dem Post-Quanten-Algorithmen als quantenresistente Assets statt als Schwachstellen erscheinen. ## Konfiguration foxguard entdeckt `.foxguard.yml` automatisch vom Scan-Pfad aufwärts. ```yaml scan: baseline: .foxguard/baseline.json disable_rules: [py/no-eval] secrets: exclude_paths: [fixtures, testdata] ``` Unterdrücken Sie einen akzeptierten Fund inline mit `// foxguard: ignore[rule-id]`. ## Dokumentation Beginnen Sie mit dem [Dokumentationsindex](https://github.com/0sec-labs/foxguard/blob/main/docs/README.md). Wichtige Referenzen: [Architektur](https://github.com/0sec-labs/foxguard/blob/main/docs/architecture.md), [Semgrep/OpenGrep-Kompatibilität](https://github.com/0sec-labs/foxguard/blob/main/docs/compatibility.md) und das [Release-Runbook](https://github.com/0sec-labs/foxguard/blob/main/docs/releasing.md). ## Benchmarks | Repo | LoC | foxguard | Semgrep | Beschleunigung | |------|-----|----------|---------|---------| | express | 15K JS | 0.28s | 6.09s | **22x** | | flask | 14K Py | 0.33s | 6.51s | **20x** | | gin | 18K Go | 0.50s | 4.95s | **10x** | | sentry | 1.3M Py | 35s | 194s | **5x** | Reproduzieren Sie dies mit `./benchmarks/run.sh`; die Ergebnisse variieren je nach Maschine. Siehe [`benchmarks/README.md`](https://github.com/0sec-labs/foxguard/blob/main/benchmarks/README.md). ## Mitwirken Siehe [`CONTRIBUTING.md`](https://github.com/0sec-labs/foxguard/blob/main/CONTRIBUTING.md) für Regel-Autorenschaft, Tests und Entwicklungseinrichtung. ## Lizenz MIT OR Apache-2.0 -- [0sec Labs](https://0sec.ai)