Um scanner de segurança de código universal e rápido, escrito em Rust. Baterias incluídas: suporta 14 linguagens, TUI para triagem, segredos, auditorias pós-quânticas, varreduras com detecção de diferenças e mais 𓃥
<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>Verificação de segurança local rápida para código, segredos, dependências e risco criptográfico.</strong> <br /> <sub>Integrado no <a href="https://github.com/0sec-labs/0sec">0sec</a>, o harness de cibersegurança open source.</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> ## Porquê - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/checklist.png" alt=""> Mais de 200 regras incorporadas em 12 linguagens de programação, além de verificações de configuração e manifestos - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/git-branch.png" alt=""> Rastreamento de taint para 14 linguagens, com análise entre ficheiros para 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=""> Verificações locais e de CI rápidas, com modo diff para "o que é que este branch adicionou?" - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/key.png" alt=""> Verificação de segredos, verificação de dependências com suporte OSV e auditoria de criptografia pós-quântica - <img height="14" src="https://raw.githubusercontent.com/0sec-labs/.github/main/profile/assets/icons/plug.png" alt=""> Ponte YAML compatível com Semgrep/OpenGrep que carrega ~98% do registo público ([relatório de cobertura](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=""> Saída em terminal, JSON, SARIF, CycloneDX 1.6 CBOM e JSON compatível com Semgrep ## Instalação ```sh npx foxguard . # sem instalação pipx install foxguard # CLI pré-compilada do PyPI curl -fsSL https://foxguard.dev/install.sh | sh # binário pré-compilado (macOS/Linux) cargo install foxguard # a partir do código-fonte ``` Os instaladores de binário autónomo verificam os binários de release do GitHub contra `checksums.txt`. Os binários de release também publicam atestações de artefactos do GitHub; use `gh attestation verify` para verificação manual, ou consulte [proveniência de release](https://github.com/0sec-labs/foxguard/blob/main/docs/release-provenance.md). Os wheels do PyPI suportam Python 3.9+ em Linux glibc 2.28+ (x86_64/ARM64), macOS (Intel/Apple Silicon) e Windows x86_64. Num ambiente virtual Python existente, use `python -m pip install foxguard` em vez disso. Estes instalam a CLI nativa sem um compilador Rust ou um download de binário em tempo de execução; não é fornecida nenhuma API Python. Utilizadores de Alpine/musl devem usar os binários de release Linux autónomos. **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 ``` Integrações: [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 [servidor MCP](https://github.com/0sec-labs/foxguard/blob/main/docs/mcp-server.md). ### Operações do GitHub App alojado `foxguard-github-app` escreve logs JSON delimitados por nova linha. As verificações concluídas e falhadas usam `event=foxguard.scan.completed` e `event=foxguard.scan.failed`, com campos de entrega, instalação, repositório, PR, commit, duração e `usage_scope` para correlação. Mantenha os identificadores como campos de log, não como etiquetas de métricas. Defina `FOXGUARD_INTERNAL_ACCOUNTS` como uma lista separada por vírgulas das suas próprias contas e organizações do GitHub. A correspondência não distingue maiúsculas de minúsculas. Outros proprietários são classificados como `external`; uma lista não definida ou um proprietário em falta produz `unknown`. A atividade externa não é prova de um cliente pagante, e as verificações não são pessoas. O registo de instalações é reconciliado com todas as páginas da API de instalações do GitHub App no arranque e de hora a hora. Atualizações falhadas mantêm o estado existente; webhooks concorrentes têm precedência. Metadados de webhook esparsos preservam detalhes de conta conhecidos e nomes de repositórios observados. Esses nomes não são um inventário completo dos repositórios acessíveis de uma instalação. Persista `FOXGUARD_INSTALLATIONS_PATH` e `FOXGUARD_PULL_REQUEST_JOBS_PATH` em armazenamento durável. Monitorize `foxguard.installations.reconcile_failed` juntamente com falhas de verificação; `foxguard.installations.reconciled` reporta o total e as contagens de instalações internas/externas/desconhecidas após uma atualização bem-sucedida. Dimensione `FOXGUARD_PR_WORKERS` com base na memória de pico medida do scanner e no limite de memória do contentor: mortes por OOM de processos filhos podem ocorrer sem reiniciar a aplicação alojada. ## Início Rápido ```sh foxguard . # verificar tudo foxguard diff main . # apenas novos achados vs main foxguard tui . # revisão interativa no terminal foxguard secrets . # credenciais e chaves expostas foxguard sca . # vulnerabilidades de dependências do OSV foxguard pqc . # auditoria de criptografia pós-quântica foxguard --format sarif . > results.sarif foxguard --format semgrep-json . # JSON compatível com a CLI do Semgrep ``` Use `foxguard --fix src/` ou `foxguard --fix src/app.py` para aplicar correções de taint suportadas no local. Os alvos são verificados contra o diretório de verificação canónico ou o ficheiro selecionado; achados fora desse âmbito são ignorados. As correções de injeção de comandos em Python adicionam `import subprocess` quando necessário, preservando docstrings de módulo e imports futuros. Reveja as alterações geradas antes de fazer commit. Falhas de leitura de ficheiros, metadados e travessia de diretórios no scanner de código nativo terminam com `2` em vez de produzir um relatório bem-sucedido ou sobrescrever uma baseline. Exclusões intencionais e ficheiros não suportados, binários ou demasiado grandes continuam a ser ignorados; inspecione os avisos de ficheiros ignorados ao verificar a cobertura da verificação. ## Revisão no Terminal Execute `foxguard tui .` e escolha **Scan**, **Diff**, **Secrets** ou **PQC** com as setas ou Tab. No modo Diff, escreva o branch alvo antes de premir Enter. Os terminais largos mostram os achados ao lado do seu detalhe; os terminais mais pequenos usam uma lista com uma vista de detalhe expansível. O contexto do código-fonte, o fluxo de dados e as correções permanecem deslocáveis sempre que o achado os fornece. O cabeçalho separa as estatísticas da verificação das categorias de baseline. Os intervalos de código-fonte selecionados são realçados inline, sem linhas de anotação extra. Os controlos de abertura permanecem abaixo do painel de detalhe em tempo real enquanto o seu conteúdo se desloca, e as localizações de ficheiro encurtadas mantêm os seus sufixos de linha e coluna. A pesquisa e os diálogos são donos dos seus atalhos enquanto estão ativos. Se o contexto do código-fonte não puder ser carregado, o excerto do achado guardado permanece disponível. Os segredos usam excertos redigidos em vez de carregar o código-fonte em bruto no painel de detalhe. O cartão de carregamento mostra atividade indeterminada e o tempo decorrido real, não uma estimativa percentual. Ctrl+C sai durante a verificação. | Tecla | Ação | |-----|--------| | `j` / `k`, setas, Home / End | Mover entre achados | | `v` | Expandir detalhe ou voltar à vista de lista/dividida | | PageUp / PageDown | Paginar a lista, ou deslocar o detalhe visível | | `/`, Enter | Editar e aplicar uma pesquisa | | Ctrl+U | Limpar a pesquisa em edição | | Esc | Fechar um modal, cancelar edições de pesquisa, sair do detalhe expandido ou limpar filtros aplicados | | `0`–`4`, `c`, Shift+C | Severidade mínima, limiar de confiança e ordem de ordenação | | `f` | Alternar All → Unreviewed → Todo → Reviewed → Ignore | | `i` | Pré-visualizar e aplicar ações de triagem | | Space, `a`, `x` | Marcar um achado, alternar seleções visíveis e pré-visualizar uma ação em lote | | Shift+F | Guardar, carregar, substituir ou eliminar filtros nomeados; recuperar o armazenamento de revisão | | `b` | Alternar categorias de baseline quando uma comparação está disponível | | Tab, Enter / `o` | Escolher finding/source/sink e abri-lo no seu editor | | `w`, `[` / `]` | Mostrar avisos e deslocar o seu histórico; os avisos mais recentes aparecem primeiro | | `e` | Exportar CBOM, JSON ou SARIF | | `?`, `q` / Ctrl+C | Ajuda e sair; Ctrl+C também funciona dentro de todos os modais | Enter e `o` usam um `$VISUAL` não vazio, depois `$EDITOR`. Sem nenhuma das definições, o foxguard procura `nvim`, `vim`, `nano` ou `vi` no `PATH` antes de considerar um abridor de desktop disponível. Os terminais headless não requerem `xdg-open`. Por exemplo, execute `VISUAL="nvim" foxguard tui .` ou defina `EDITOR='code --wait'`. Uma definição de editor explícita inválida é reportada em vez de silenciosamente substituída; se nenhum editor estiver disponível, a TUI permanece aberta com orientações de configuração. Os editores suportados saltam para a linha do achado/source/sink selecionado. As marcas de revisão persistem automaticamente no armazenamento por utilizador, com âmbito na raiz canónica do projeto e no modo de verificação (incluindo o alvo no modo Diff). Os filtros nomeados restauram a pesquisa, severidade, confiança, estado de revisão, ordenação e categoria de baseline quando carregados com Shift+F. Não alteram a configuração de verificação do repositório. A lista mostra achados visíveis/totais e o progresso da revisão; alterar filtros ou ordenação mantém o mesmo achado selecionado quando este permanece visível. Cancelar edições de pesquisa restaura a consulta aplicada anteriormente. Os achados marcados sobrevivem a alterações de filtros. `x` abre ações em lote; Enter mostra os alvos exatos, a contagem de seleções ocultas, o destino e o âmbito do efeito. Apenas `y` aplica a pré-visualização; Enter novamente não a confirma, e Esc cancela sem escrever. As ações de baseline adicionam impressões digitais exatas. As ações de configuração de regra/ficheiro e de projeto inteiro também podem afetar achados não selecionados, como a pré-visualização avisa. Se um alvo de configuração falhar, as escritas bem-sucedidas permanecem e os resultados são reportados; o lote não é uma transação. O armazenamento usa `$XDG_STATE_HOME/foxguard/tui` (ou `~/.local/state/foxguard/tui`) no Linux, Application Support no macOS e `%LOCALAPPDATA%` no Windows. Escritas atómicas e verificações de revisão impedem que um terminal sobrescreva silenciosamente outro. Erros de armazenamento deixam as alterações locais visivelmente **UNSAVED**. Em Shift+F, `w` tenta novamente guardar, `r` recarrega explicitamente do disco e Shift+R confirma um backup-e-reset do projeto/modo atual. Recarregar/reset pode descartar alterações não guardadas; o reset preserva os bytes anteriores em disco, não as marcas não guardadas. O armazenamento de revisão contém impressões digitais e definições de filtros, não código-fonte. As exportações incluem os resultados da verificação atual, não apenas as linhas filtradas visíveis, e são escritas no diretório de trabalho atual. Ficheiros regulares existentes requerem uma confirmação explícita com `y`; Esc cancela. As escritas são atómicas e os links simbólicos de destino, incluindo links pendentes, são rejeitados. Use `foxguard tui --baseline .foxguard/baseline.json .` para rever uma comparação de baseline guardada. Ao contrário da supressão da CLI, a revisão no terminal retém os achados atuais e separa entradas **introduced**, **recurring** e **resolved**. Resolved significa ausente da saída da verificação atual, não remediação verificada: compare âmbito, regras e limiares equivalentes. A identidade da baseline inclui o ficheiro e a localização no código-fonte, pelo que mover um achado pode aparecer como introduced mais resolved. As linhas resolved são metadados históricos apenas de leitura; apenas a pesquisa se aplica, e `v` expande os seus detalhes deslocáveis. Volte a uma categoria de achados atuais para triar ou exportar a verificação atual. O Git Diff continua a ser uma comparação separada contra um branch. ## Cobertura de Linguagens | Linguagem | Regras incorporadas | Rastreamento de taint | Regras cientes de frameworks | |----------|:-:|:-:|---| | JavaScript / TypeScript | Sim | Sim | Express, Next.js | | Python | Sim | Sim | Django, Flask, FastAPI | | Go | Sim | Sim | Gin | | Kotlin | Sim | Sim | Spring | | Java | Sim | Sim | Spring | | Ruby | Sim | Sim | Rails | | PHP | Sim | Sim | Laravel | | Rust | Sim | -- | -- | | C# | Sim | Sim | .NET | | Swift | Sim | Sim | iOS | | Haskell | Sim | -- | Regras de seed Cardano | O rastreamento de taint também cobre C, Bash e Solidity. As verificações de configuração, manifestos e regras externas cobrem Dockerfile, Nginx, Apache, HAProxy, HCL/Terraform, YAML/JSON/XML/HTML, C via Semgrep YAML/Coccinelle, e mais. ## Modos de Segurança ```sh foxguard sca . foxguard pqc . foxguard --rules ./semgrep-rules . ``` O SCA suporta `Cargo.lock`, `package-lock.json`, `pnpm-lock.yaml`, `requirements.txt`, `poetry.lock` e `Pipfile.lock`. A auditoria PQC é um cartão de pontuação de dois lados: sinaliza primitivas vulneráveis a quantum (RSA, ECDSA/DSA, ECDH/DH) com prazos de migração CNSA 2.0, e também deteta algoritmos pós-quânticos já em uso (ML-KEM, ML-DSA, SLH-DSA, FN-DSA, HQC e híbridos como X25519MLKEM768) como inventário informativo, resistente a quantum — reportando uma percentagem de prontidão para migração. Ambos os lados exportam para um CycloneDX 1.6 CBOM, onde os algoritmos pós-quânticos aparecem como ativos resistentes a quantum em vez de vulnerabilidades. ## Configuração O foxguard descobre automaticamente `.foxguard.yml` a partir do caminho de verificação para cima. ```yaml scan: baseline: .foxguard/baseline.json disable_rules: [py/no-eval] secrets: exclude_paths: [fixtures, testdata] ``` Suprima um achado aceite inline com `// foxguard: ignore[rule-id]`. ## Documentação Comece pelo [índice de documentação](https://github.com/0sec-labs/foxguard/blob/main/docs/README.md). Referências principais: [arquitetura](https://github.com/0sec-labs/foxguard/blob/main/docs/architecture.md), [compatibilidade Semgrep/OpenGrep](https://github.com/0sec-labs/foxguard/blob/main/docs/compatibility.md) e o [runbook de release](https://github.com/0sec-labs/foxguard/blob/main/docs/releasing.md). ## Benchmarks | 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** | Reproduza com `./benchmarks/run.sh`; os resultados variam consoante a máquina. Consulte [`benchmarks/README.md`](https://github.com/0sec-labs/foxguard/blob/main/benchmarks/README.md). ## Contribuir Consulte [`CONTRIBUTING.md`](https://github.com/0sec-labs/foxguard/blob/main/CONTRIBUTING.md) para autoria de regras, testes e configuração de desenvolvimento. ## Licença MIT OR Apache-2.0 -- [0sec Labs](https://0sec.ai)