
foxguard v0.13.0
é«éãªãŠãããŒãµã«ã³ãŒãã»ãã¥ãªãã£ã¹ãã£ããŒãRustã§èšè¿°ãããããªãŒå梱ïŒ14èšèªå¯Ÿå¿ãããªã¢ãŒãžçšTUIãã·ãŒã¯ã¬ããããã¹ãéåç£æ»ãdiff察å¿ã¹ãã£ã³ãªã© ð¥
foxguard
ã³ãŒããã·ãŒã¯ã¬ãããäŸåé¢ä¿ãæå·ãªã¹ã¯ã«å¯Ÿããé«éãªããŒã«ã«ã»ãã¥ãªãã£ã¹ãã£ã³ã
ãªãŒãã³ãµã€ããŒã»ãã¥ãªãã£ããŒãã¹ 0sec ã«çµ±åãããŠããŸãã
npx foxguard .
ãªã
 12 ã®ãœãŒã¹èšèªã«ããã 200 以äžã®çµã¿èŸŒã¿ã«ãŒã«ãããã«èšå®ãã¡ã€ã«ãšãããã§ã¹ãã®ãã§ãã¯
 14 èšèªã®ãã€ã³ã远跡ãPythonãJavaScriptãGoãJavaãRubyãPHPãC#ãKotlin ã®ã¯ãã¹ãã¡ã€ã«è§£æã«å¯Ÿå¿
 é«éãªããŒã«ã«ããã³ CI ã¹ãã£ã³ãããã®ãã©ã³ãã¯äœã远å ãããïŒãã®ããã® diff ã¢ãŒãä»ã
 ã·ãŒã¯ã¬ããã¹ãã£ã³ãOSV ã«åºã¥ãäŸåé¢ä¿ã¹ãã£ã³ãèéåæå·ç£æ»
 å
¬éã¬ãžã¹ããªã®çŽ 98% ãèªã¿èŸŒã Semgrep/OpenGrep äºæ YAML ããªããžïŒã«ãã¬ããžã¬ããŒãïŒ
 ã¿ãŒããã«ãJSONãSARIFãCycloneDX 1.6 CBOMãSemgrep äºæ JSON åºå
ã€ã³ã¹ããŒã«
npx foxguard . # ã€ã³ã¹ããŒã«äžèŠ
pipx install foxguard # PyPI ããã®ãã«ãæžã¿ CLI
curl -fsSL https://foxguard.dev/install.sh | sh # ãã«ãæžã¿ãã€ã㪠(macOS/Linux)
cargo install foxguard # ãœãŒã¹ãã
ã¹ã¿ã³ãã¢ãã³ãã€ããªã€ã³ã¹ããŒã©ãŒã¯ GitHub ãªãªãŒã¹ãã€ããªã checksums.txt ãšç
§åããŠæ€èšŒããŸãããªãªãŒã¹ãã€ããªã¯ GitHub ã¢ãŒãã£ãã¡ã¯ãã¢ãã¹ããŒã·ã§ã³ãå
¬éããŠããŸããæåæ€èšŒã«ã¯ gh attestation verify ã䜿çšãããããªãªãŒã¹ã®æ¥æŽãåç
§ããŠãã ããã
PyPI ãã€ãŒã«ã¯ Linux glibc 2.28+ (x86_64/ARM64)ãmacOS (Intel/Apple Silicon)ãWindows x86_64 äžã® Python 3.9+ ããµããŒãããŸããæ¢åã® Python ä»®æ³ç°å¢ã§ã¯ã代ããã« python -m pip install foxguard ã䜿çšããŠãã ãããããã㯠Rust ã³ã³ãã€ã©ãå®è¡æãã€ããªã®ããŠã³ããŒããªãã§ãã€ãã£ã CLI ãã€ã³ã¹ããŒã«ããŸããPython API ã¯æäŸãããŸãããAlpine/musl ãŠãŒã¶ãŒã¯ã¹ã¿ã³ãã¢ãã³ã® Linux ãªãªãŒã¹ãã€ããªã䜿çšããŠãã ããã
GitHub Action:
- uses: 0sec-labs/foxguard/[email protected]
with:
path: .
severity: medium
fail-on-findings: "true"
upload-sarif: "true"
pre-commit:
repos:
- repo: https://github.com/0sec-labs/foxguard
rev: v0.14.0
hooks:
- id: foxguard
çµ±å: GitHub AppãVS CodeãClaude Code ãã©ã°ã€ã³ãMCP ãµãŒããŒã
ãã¹ãå GitHub App ã®éçš
foxguard-github-app ã¯æ¹è¡åºåãã® JSON ãã°ãæžã蟌ã¿ãŸããå®äºããã¹ãã£ã³ãšå€±æããã¹ãã£ã³ã¯ãããã event=foxguard.scan.completed ãš event=foxguard.scan.failed ã䜿çšããçžé¢çšã« deliveryãinstallationãrepositoryãPRãcommitãdurationãusage_scope ãã£ãŒã«ããå«ã¿ãŸããèå¥åã¯ã¡ããªã¯ã¹ã©ãã«ã§ã¯ãªããã°ãã£ãŒã«ããšããŠä¿æããŠãã ããã
FOXGUARD_INTERNAL_ACCOUNTS ã«ãèªçµç¹ã® GitHub ã¢ã«ãŠã³ããšçµç¹ã®ã«ã³ãåºåããªã¹ããèšå®ããŸãããããã³ã°ã¯å€§æåå°æåãåºå¥ããŸããããã以å€ã®ãªãŒããŒã¯ external ã«åé¡ãããŸãããªã¹ããæªèšå®ãŸãã¯ãªãŒããŒãæ¬ èœããŠããå Žå㯠unknown ã«ãªããŸããå€éšã¢ã¯ãã£ããã£ã¯ææé¡§å®¢ã®èšŒæã§ã¯ãªããã¹ãã£ã³ã¯äººã§ã¯ãããŸããã
ã€ã³ã¹ããŒã«ã¬ãžã¹ããªã¯ãèµ·åæã𿝿ãGitHub ã® App ã€ã³ã¹ããŒã« API ã®å šããŒãžãšç §åãããŸããæŽæ°ã«å€±æããå Žåã¯æ¢åã®ç¶æ ãä¿æãããåæå®è¡ã® webhook ãåªå ãããŸããç㪠webhook ã¡ã¿ããŒã¿ã¯æ¢ç¥ã®ã¢ã«ãŠã³ã詳现ãšèŠ³æž¬ããããªããžããªåãä¿æããŸãããããã®ååã¯ãã€ã³ã¹ããŒã«ãã¢ã¯ã»ã¹å¯èœãªãªããžããªã®å®å šãªã€ã³ãã³ããªã§ã¯ãããŸããã
FOXGUARD_INSTALLATIONS_PATH ãš FOXGUARD_PULL_REQUEST_JOBS_PATH ã¯æ°žç¶ã¹ãã¬ãŒãžã«ä¿åããŠãã ãããã¹ãã£ã³å€±æãšäœµã㊠foxguard.installations.reconcile_failed ãç£èŠããŠãã ãããfoxguard.installations.reconciled ã¯ãæŽæ°æååŸã®åèšããã³ internal/external/unknown ã®ã€ã³ã¹ããŒã«æ°ãå ±åããŸããFOXGUARD_PR_WORKERS ã¯ã枬å®ãããã¹ãã£ããŒã®ããŒã¯ã¡ã¢ãªãšã³ã³ããã®ã¡ã¢ãªå¶éã«åºã¥ããŠãµã€ãºèšå®ããŠãã ãããåããã»ã¹ã® OOM kill ã¯ããã¹ãåã¢ããªã±ãŒã·ã§ã³ãåèµ·åããã«çºçããå¯èœæ§ããããŸãã
ã¯ã€ãã¯ã¹ã¿ãŒã
foxguard . # ãã¹ãŠãã¹ãã£ã³
foxguard diff main . # main ã«å¯Ÿããæ°èŠæ€åºã®ã¿
foxguard tui . # 察話åã¿ãŒããã«ã¬ãã¥ãŒ
foxguard secrets . # æŒæŽ©ããèªèšŒæ
å ±ãšéµ
foxguard sca . # OSV ããã®äŸåé¢ä¿è匱æ§
foxguard pqc . # èéåæå·ç£æ»
foxguard --format sarif . > results.sarif
foxguard --format semgrep-json . # Semgrep CLI äºæ JSON
foxguard --fix src/ ãŸã㯠foxguard --fix src/app.py ã䜿çšããŠããµããŒããããŠãããã€ã³ãä¿®æ£ããã®å Žã§é©çšããŸããã¿ãŒã²ããã¯æ£èŠã®ã¹ãã£ã³ãã£ã¬ã¯ããªãŸãã¯éžæãããã¡ã€ã«ãšç
§åããããã®ç¯å²å€ã®æ€åºã¯ã¹ããããããŸããPython ã®ã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³ä¿®æ£ã¯ãå¿
èŠã«å¿ã㊠import subprocess ã远å ããã¢ãžã¥ãŒã«ã® docstring ãš future import ãä¿æããŸããã³ãããããåã«çæããã倿Žã確èªããŠãã ããã
ãã€ãã£ãã³ãŒãã¹ãã£ããŒã§ã®ãã¡ã€ã«èªã¿åããã¡ã¿ããŒã¿ããã£ã¬ã¯ããªãã©ããŒãµã«ã®å€±æã¯ãæåã¬ããŒããçæãããããŒã¹ã©ã€ã³ãäžæžãããããã代ããã« 2 ã§çµäºããŸããæå³çãªé€å€ãããã³æªãµããŒãããã€ããªããŸãã¯ãµã€ãºè¶
éã®ãã¡ã€ã«ã¯ã¹ãããã®ãŸãŸã§ããã¹ãã£ã³ã«ãã¬ããžã確èªããéã¯ãã¹ãããããããã¡ã€ã«ã®éç¥ãæ€æ»ããŠãã ããã
ã¿ãŒããã«ã¬ãã¥ãŒ
foxguard tui . ãå®è¡ããç¢å°ããŒãŸã㯠Tab ã§ ScanãDiffãSecretsãPQC ãéžæããŸããDiff ã¢ãŒãã§ã¯ãEnter ãæŒãåã«å¯Ÿè±¡ãã©ã³ããå
¥åããŸããã¯ã€ããªã¿ãŒããã«ã§ã¯æ€åºããã®è©³çŽ°ã®æšªã«è¡šç€ºãããããå°ããªã¿ãŒããã«ã§ã¯å±éå¯èœãªè©³çްãã¥ãŒä»ãã®ãªã¹ãã䜿çšããŸãããœãŒã¹ã³ã³ããã¹ããããŒã¿ãããŒãä¿®æ£ã¯ãæ€åºãããããæäŸããéãã¹ã¯ããŒã«å¯èœã§ãã
ããããŒã¯ã¹ãã£ã³çµ±èšãšããŒã¹ã©ã€ã³ã«ããŽãªãåé¢ããŸããéžæããããœãŒã¹ç¯å²ã¯ãäœåãªæ³šéè¡ãªãã§ã€ã³ã©ã€ã³ã§ãã€ã©ã€ããããŸããéããã³ã³ãããŒã«ã¯ãã³ã³ãã³ããã¹ã¯ããŒã«ããéãã©ã€ã詳现ãã€ã³ã®äžã«çãŸããççž®ããããã¡ã€ã«äœçœ®ã¯è¡ãšåã®ãµãã£ãã¯ã¹ãä¿æããŸããæ€çŽ¢ãšãã€ã¢ãã°ã¯ãã¢ã¯ãã£ããªéã¯ç¬èªã®ã·ã§ãŒãã«ãããææããŸãã
ãœãŒã¹ã³ã³ããã¹ããèªã¿èŸŒããªãå Žåãä¿åãããæ€åºã¹ãããããåŒãç¶ãå©çšå¯èœã§ããã·ãŒã¯ã¬ããã¯ãçã®ãœãŒã¹ã詳现ãã€ã³ã«èªã¿èŸŒãã®ã§ã¯ãªãããã¹ã¯ãããã¹ããããã䜿çšããŸãã
ããŒãã£ã³ã°ã«ãŒãã¯ãããŒã»ã³ããŒãžæšå®ã§ã¯ãªããäžç¢ºå®ãªã¢ã¯ãã£ããã£ãšå®éã®çµéæéã衚瀺ããŸããã¹ãã£ã³äžã¯ Ctrl+C ã§çµäºããŸãã
| ã㌠| ã¢ã¯ã·ã§ã³ |
|---|---|
j / kãç¢å°ãHome / End | æ€åºéãç§»å |
v | 詳现ãå±éããŸãã¯ãªã¹ã/åå²ãã¥ãŒã«æ»ã |
| PageUp / PageDown | ãªã¹ããããŒãžã³ã°ããŸãã¯è¡šç€ºäžã®è©³çްãã¹ã¯ããŒã« |
/ãEnter | æ€çŽ¢ãç·šéããŠé©çš |
| Ctrl+U | ç·šéäžã®æ€çŽ¢ãã¯ãªã¢ |
| Esc | ã¢ãŒãã«ãéãããæ€çŽ¢ç·šéããã£ã³ã»ã«ãå±éããã詳现ãé¢ããããŸãã¯é©çšããããã£ã«ã¿ãŒãã¯ãªã¢ |
0â4ãcãShift+C | æå°é倧床ãä¿¡é ŒåºŠãããå€ã䞊ã³é |
f | All â Unreviewed â Todo â Reviewed â Ignore ãåŸªç° |
i | ããªã¢ãŒãžã¢ã¯ã·ã§ã³ããã¬ãã¥ãŒããŠé©çš |
Spaceãaãx | 1 ã€ã®æ€åºããã§ãã¯ã衚瀺äžã®éžæããã°ã«ããããã¢ã¯ã·ã§ã³ããã¬ãã¥ãŒ |
| Shift+F | ååä»ããã£ã«ã¿ãŒã®ä¿åãèªã¿èŸŒã¿ã眮æãåé€ãã¬ãã¥ãŒã¹ãã¬ãŒãžã®åŸ©æ§ |
b | æ¯èŒãå©çšå¯èœãªå Žåã«ããŒã¹ã©ã€ã³ã«ããŽãªãåŸªç° |
TabãEnter / o | finding/source/sink ãéžæãããšãã£ã¿ã§éã |
wã[ / ] | éç¥ã衚瀺ãããã®å±¥æŽãã¹ã¯ããŒã«ãææ°ã®éç¥ãæåã«è¡šç€ºããã |
e | CBOMãJSONããŸã㯠SARIF ããšã¯ã¹ããŒã |
?ãq / Ctrl+C | ãã«ããšçµäºãCtrl+C ã¯ãã¹ãŠã®ã¢ãŒãã«å ã§ãæ©èœ |
Enter ãš o ã¯ã空çœã§ãªã $VISUALãæ¬¡ã« $EDITOR ã䜿çšããŸããã©ã¡ããèšå®ãããŠããªãå Žåãfoxguard ã¯å©çšå¯èœãªãã¹ã¯ããããªãŒãããŒãæ€èšããåã«ãPATH äžã® nvimãvimãnanoããŸã㯠vi ãæ¢ããŸãããããã¬ã¹ã¿ãŒããã«ã¯ xdg-open ãå¿
èŠãšããŸãããããšãã°ãVISUAL="nvim" foxguard tui . ãå®è¡ããããEDITOR='code --wait' ãèšå®ããŸããå£ããæç€ºçãªãšãã£ã¿èšå®ã¯ãé»ã£ãŠçœ®ãæããããã®ã§ã¯ãªãå ±åãããŸãããšãã£ã¿ãå©çšã§ããªãå ŽåãTUI ã¯ã»ããã¢ããã¬ã€ãã³ã¹ãšãšãã«éãããŸãŸã«ãªããŸãããµããŒããããŠãããšãã£ã¿ã¯ãéžæããã finding/source/sink ã®è¡ã«ãžã£ã³ãããŸãã