Uno scanner di sicurezza del codice universale e veloce, scritto in Rust. Batterie incluse: supporta 14 linguaggi, TUI per triage, segreti, audit post-quantistici, scansioni differenziali e altro ancora 𓃥
<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>Scansione di sicurezza locale veloce per codice, segreti, dipendenze e rischio crittografico.</strong> <br /> <sub>Integrato in <a href="https://github.com/0sec-labs/0sec">0sec</a>, l'harness open per la cybersecurity.</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> ## Perché - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/checklist.png" alt=""> Oltre 200 regole integrate in 12 linguaggi sorgente, più controlli su configurazioni e manifest - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/git-branch.png" alt=""> Taint tracking per 14 linguaggi, con analisi cross-file per Python, JavaScript, Go, Java, Ruby, PHP, C# e Kotlin - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/zap.png" alt=""> Scansioni locali e CI veloci, con modalità diff per "cosa ha aggiunto questo branch?" - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/key.png" alt=""> Scansione dei segreti, scansione delle dipendenze basata su OSV e audit crittografico post-quantum - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/plug.png" alt=""> Bridge YAML compatibile con Semgrep/OpenGrep che carica circa il 98% del registry pubblico ([report di copertura](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=""> Output in terminale, JSON, SARIF, CycloneDX 1.6 CBOM e JSON compatibile con Semgrep ## Installazione ```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 ``` Gli installer binari standalone verificano i binari delle release GitHub rispetto a `checksums.txt`. I binari delle release pubblicano anche le attestazioni degli artefatti GitHub; usa `gh attestation verify` per la verifica manuale, oppure consulta [release provenance](https://github.com/0sec-labs/foxguard/blob/main/docs/release-provenance.md). I wheel PyPI supportano Python 3.9+ su Linux glibc 2.28+ (x86_64/ARM64), macOS (Intel/Apple Silicon) e Windows x86_64. In un ambiente virtuale Python esistente, usa `python -m pip install foxguard` invece. Questi installano la CLI nativa senza un compilatore Rust o un download del binario a runtime; non è fornita alcuna API Python. Gli utenti Alpine/musl dovrebbero usare i binari standalone delle release Linux. **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 ``` Integrazioni: [GitHub App](https://github.com/apps/foxguard-app/installations/new), [VS Code](https://marketplace.visualstudio.com/items?itemName=peaktwilight.foxguard), [plugin Claude Code](https://github.com/0sec-labs/foxguard/blob/main/docs/claude-code-integration.md) e [server MCP](https://github.com/0sec-labs/foxguard/blob/main/docs/mcp-server.md). ### Operazioni della GitHub App ospitata `foxguard-github-app` scrive log JSON delimitati da newline. Le scansioni completate e fallite usano `event=foxguard.scan.completed` e `event=foxguard.scan.failed`, con campi delivery, installation, repository, PR, commit, duration e `usage_scope` per la correlazione. Mantieni gli identificatori come campi di log, non come etichette di metrica. Imposta `FOXGUARD_INTERNAL_ACCOUNTS` su un elenco separato da virgole dei tuoi account e organizzazioni GitHub. La corrispondenza non distingue maiuscole/minuscole. Gli altri owner sono classificati come `external`; un elenco non impostato o un owner mancante produce `unknown`. L'attività esterna non è prova di un cliente pagante, e le scansioni non sono persone. Il registry delle installazioni viene riconciliato rispetto a tutte le pagine dell'API delle installazioni della App di GitHub all'avvio e ogni ora. I refresh falliti mantengono lo stato esistente; i webhook concorrenti hanno la precedenza. I metadati sparsi dei webhook preservano i dettagli noti dell'account e i nomi dei repository osservati. Quei nomi non sono un inventario completo dei repository accessibili di un'installazione. Persisti `FOXGUARD_INSTALLATIONS_PATH` e `FOXGUARD_PULL_REQUEST_JOBS_PATH` su storage durevole. Monitora `foxguard.installations.reconcile_failed` insieme ai fallimenti delle scansioni; `foxguard.installations.reconciled` riporta il totale e i conteggi delle installazioni internal/external/unknown dopo un refresh riuscito. Dimensiona `FOXGUARD_PR_WORKERS` in base alla memoria di picco misurata dello scanner e al limite di memoria del container: le terminazioni OOM dei processi figli possono verificarsi senza riavviare l'applicazione ospitata. ## Avvio rapido ```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 ``` Usa `foxguard --fix src/` o `foxguard --fix src/app.py` per applicare sul posto le correzioni di taint supportate. I target vengono verificati rispetto alla directory di scansione canonica o al file selezionato; i finding al di fuori di tale ambito vengono saltati. Le correzioni di command-injection in Python aggiungono `import subprocess` quando necessario, preservando le docstring del modulo e gli import futuri. Rivedi le modifiche generate prima di committare. I fallimenti di lettura file, metadati e attraversamento directory nello scanner di codice nativo escono con `2` invece di produrre un report riuscito o sovrascrivere una baseline. Le esclusioni intenzionali e i file non supportati, binari o sovradimensionati restano skip; ispeziona gli avvisi sui file saltati quando verifichi la copertura della scansione. ## Revisione in terminale Esegui `foxguard tui .` e scegli **Scan**, **Diff**, **Secrets** o **PQC** con le frecce o Tab. In modalità Diff, digita il branch di destinazione prima di premere Enter. I terminali larghi mostrano i finding accanto al loro dettaglio; i terminali più piccoli usano una lista con una vista di dettaglio espandibile. Il contesto sorgente, il dataflow e le correzioni restano scorrevoli ogni volta che il finding li fornisce. L'intestazione separa le statistiche della scansione dalle categorie della baseline. Gli intervalli sorgente selezionati sono evidenziati inline, senza righe di annotazione aggiuntive. I controlli di apertura restano sotto il pannello di dettaglio live mentre il suo contenuto scorre, e le posizioni file abbreviate mantengono i loro suffissi di riga e colonna. La ricerca e i dialoghi possiedono le proprie scorciatoie mentre sono attivi. Se il contesto sorgente non può essere caricato, lo snippet del finding salvato resta disponibile. I segreti usano snippet redatti invece di caricare il sorgente grezzo nel pannello di dettaglio. La card di caricamento mostra attività indeterminata e il tempo effettivo trascorso, non una stima percentuale. Ctrl+C esce durante la scansione. | Tasto | Azione | |-----|--------| | `j` / `k`, frecce, Home / End | Sposta tra i finding | | `v` | Espandi il dettaglio o torna alla vista lista/split | | PageUp / PageDown | Scorri la lista a pagine, o scorri il dettaglio visibile | | `/`, Enter | Modifica e applica una ricerca | | Ctrl+U | Cancella la ricerca in fase di modifica | | Esc | Chiudi un modale, annulla le modifiche alla ricerca, esci dal dettaglio espanso o cancella i filtri applicati | | `0`–`4`, `c`, Shift+C | Severità minima, soglia di confidenza e ordinamento | | `f` | Cicla All → Unreviewed → Todo → Reviewed → Ignore | | `i` | Anteprima e applica azioni di triage | | Space, `a`, `x` | Seleziona un finding, attiva/disattiva le selezioni visibili e visualizza l'anteprima di un'azione batch | | Shift+F | Salva, carica, sostituisci o elimina filtri con nome; recupera lo storage di revisione | | `b` | Cicla le categorie della baseline quando è disponibile un confronto | | Tab, Enter / `o` | Scegli finding/source/sink e aprilo nel tuo editor | | `w`, `[` / `]` | Mostra gli avvisi e scorri la loro cronologia; gli avvisi più recenti appaiono per primi | | `e` | Esporta CBOM, JSON o SARIF | | `?`, `q` / Ctrl+C | Aiuto ed esci; Ctrl+C funziona anche dentro ogni modale | Enter e `o` usano un `$VISUAL` non vuoto, poi `$EDITOR`. Senza nessuna delle due impostazioni, foxguard cerca `nvim`, `vim`, `nano` o `vi` nel `PATH` prima di considerare un opener desktop disponibile. I terminali headless non richiedono `xdg-open`. Ad esempio, esegui `VISUAL="nvim" foxguard tui .` o imposta `EDITOR='code --wait'`. Un'impostazione esplicita di editor non funzionante viene segnalata invece che sostituita silenziosamente; se nessun editor è disponibile, la TUI resta aperta con indicazioni di configurazione. Gli editor supportati saltano alla riga del finding/source/sink selezionato. I contrassegni di revisione persistono automaticamente nello storage per utente, con ambito la root canonica del progetto e la modalità di scansione (incluso il target in modalità Diff). I filtri con nome ripristinano ricerca, severità, confidenza, stato di revisione, ordinamento e categoria della baseline quando caricati con Shift+F. Non modificano la configurazione di scansione del repository. La lista mostra i finding visibili/totali e il progresso della revisione; cambiare filtri o ordinamento mantiene selezionato lo stesso finding quando resta visibile. Annullare le modifiche alla ricerca ripristina la query precedentemente applicata. I finding selezionati sopravvivono ai cambi di filtro. `x` apre le azioni batch; Enter mostra i target esatti, il conteggio delle selezioni nascoste, la destinazione e l'ambito dell'effetto. Solo `y` applica l'anteprima; Enter di nuovo non la conferma, e Esc annulla senza scrivere. Le azioni sulla baseline aggiungono fingerprint esatti. Le azioni di configurazione per regola/file e a livello di progetto possono anche influenzare finding non selezionati, come avverte l'anteprima. Se un target di configurazione fallisce, le scritture riuscite restano e gli esiti vengono riportati; il batch non è una transazione. Lo storage usa `$XDG_STATE_HOME/foxguard/tui` (o `~/.local/state/foxguard/tui`) su Linux, Application Support su macOS e `%LOCALAPPDATA%` su Windows. Scritture atomiche e controlli di revisione impediscono a un terminale di sovrascrivere silenziosamente un altro. Gli errori di storage lasciano le modifiche locali visibilmente **UNSAVED**. In Shift+F, `w` ritenta il salvataggio, `r` ricarica esplicitamente dal disco e Shift+R conferma un backup-and-reset del progetto/modalità corrente. Il reload/reset può scartare modifiche non salvate; il reset preserva i byte precedenti su disco, non i contrassegni non salvati. Lo storage di revisione contiene fingerprint e impostazioni dei filtri, non il codice sorgente. Le esportazioni includono i risultati della scansione corrente, non solo le righe filtrate visibili, e vengono scritte nella directory di lavoro corrente. I file regolari esistenti richiedono una conferma esplicita con `y`; Esc annulla. Le scritture sono atomiche e i symlink di destinazione, inclusi i link pendenti, vengono rifiutati. Usa `foxguard tui --baseline .foxguard/baseline.json .` per rivedere un confronto con baseline salvata. A differenza della soppressione da CLI, la revisione in terminale mantiene i finding correnti e separa le voci **introduced**, **recurring** e **resolved**. Resolved significa assente dall'output della scansione corrente, non remediation verificata: confronta ambito, regole e soglie equivalenti. L'identità della baseline include file e posizione sorgente, quindi spostare un finding può apparire come introduced più resolved. Le righe resolved sono metadati storici di sola lettura; si applica solo la ricerca, e `v` espande i loro dettagli scorrevoli. Torna a una categoria di finding corrente per fare triage o esportare la scansione corrente. Git Diff resta un confronto separato rispetto a un branch. ## Copertura linguaggi | Linguaggio | Regole integrate | Taint tracking | Regole framework-aware | |----------|:-:|:-:|---| | JavaScript / TypeScript | Sì | Sì | Express, Next.js | | Python | Sì | Sì | Django, Flask, FastAPI | | Go | Sì | Sì | Gin | | Kotlin | Sì | Sì | Spring | | Java | Sì | Sì | Spring | | Ruby | Sì | Sì | Rails | | PHP | Sì | Sì | Laravel | | Rust | Sì | -- | -- | | C# | Sì | Sì | .NET | | Swift | Sì | Sì | iOS | | Haskell | Sì | -- | Regole seed Cardano | Il taint tracking copre anche C, Bash e Solidity. Le scansioni di configurazione, manifest e regole esterne coprono Dockerfile, Nginx, Apache, HAProxy, HCL/Terraform, YAML/JSON/XML/HTML, C tramite Semgrep YAML/Coccinelle e altro ancora. ## Modalità di sicurezza ```sh foxguard sca . foxguard pqc . foxguard --rules ./semgrep-rules . ``` SCA supporta `Cargo.lock`, `package-lock.json`, `pnpm-lock.yaml`, `requirements.txt`, `poetry.lock` e `Pipfile.lock`. L'audit PQC è una scorecard a due lati: segnala le primitive vulnerabili ai quanti (RSA, ECDSA/DSA, ECDH/DH) con le scadenze di migrazione CNSA 2.0, e rileva anche gli algoritmi post-quantum già in uso (ML-KEM, ML-DSA, SLH-DSA, FN-DSA, HQC e ibridi come X25519MLKEM768) come inventario informativo, resistente ai quanti — riportando una percentuale di prontezza alla migrazione. Entrambi i lati esportano in un CycloneDX 1.6 CBOM, dove gli algoritmi post-quantum appaiono come asset resistenti ai quanti anziché vulnerabilità. ## Configurazione foxguard scopre automaticamente `.foxguard.yml` dal percorso di scansione verso l'alto. ```yaml scan: baseline: .foxguard/baseline.json disable_rules: [py/no-eval] secrets: exclude_paths: [fixtures, testdata] ``` Sopprimi un finding accettato inline con `// foxguard: ignore[rule-id]`. ## Documentazione Inizia dall'[indice della documentazione](https://github.com/0sec-labs/foxguard/blob/main/docs/README.md). Riferimenti chiave: [architettura](https://github.com/0sec-labs/foxguard/blob/main/docs/architecture.md), [compatibilità Semgrep/OpenGrep](https://github.com/0sec-labs/foxguard/blob/main/docs/compatibility.md) e il [runbook di rilascio](https://github.com/0sec-labs/foxguard/blob/main/docs/releasing.md). ## Benchmark | Repo | LoC | foxguard | Semgrep | Speedup | |------|-----|----------|---------|---------| | 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** | Riproduci con `./benchmarks/run.sh`; i risultati variano da macchina a macchina. Vedi [`benchmarks/README.md`](https://github.com/0sec-labs/foxguard/blob/main/benchmarks/README.md). ## Contribuire Vedi [`CONTRIBUTING.md`](https://github.com/0sec-labs/foxguard/blob/main/CONTRIBUTING.md) per la scrittura delle regole, i test e la configurazione di sviluppo. ## Licenza MIT OR Apache-2.0 -- [0sec Labs](https://0sec.ai)