
guarddog v3.2.0
ð ð GuardDogã¯ãæªæã®ããPyPIããã³npmããã±ãŒãžãç¹å®ããCLIããŒã«ã§ãã
GuardDog
GuardDog ã¯ãæªæã®ãã PyPI ããã³ npm ããã±ãŒãžãGo ã¢ãžã¥ãŒã«ãRust ã¯ã¬ãŒããRubyGemsãGitHub ActionsããŸã㯠VSCode æ¡åŒµæ©èœãèå¥ãã CLI ããŒã«ã§ããããã±ãŒãžã®ãœãŒã¹ã³ãŒãïŒYARA ã«ãŒã«ã«ããïŒã«å¯ŸããŠéçè§£æãå®è¡ããããã±ãŒãžã®ã¡ã¿ããŒã¿ãåæããŠãµãã©ã€ãã§ãŒã³æ»æãæ€åºããŸãã
GuardDog ãä»ãšç°ãªãç¹: çããããã¿ãŒã³ãåæããã ãã§ã¯ãªããGuardDog ã¯èª¿æ»çµæãé¢é£ä»ããŠãæ»æãã§ãŒã³ã«åºã¥ãå®éã®ãªã¹ã¯ãç¹å®ããŸããããã±ãŒãžãé«ãªã¹ã¯ãšããŠãã©ã°ä»ããããã«ã¯ãåããã¡ã€ã«å ã«ã¢ã¯ã·ã§ã³ãå®è¡ããèœåïŒäŸ: ãããã¯ãŒã¯ã¢ã¯ã»ã¹ïŒãšè åšã€ã³ãã£ã±ãŒã¿ãŒïŒäŸ: äžå¯©ãªãã¡ã€ã³ïŒã®äž¡æ¹ãå¿ èŠã§ãã
以äžããã³ãŒããããŠã³ããŒãããŠã¹ãã£ã³ããŸã:
- NPM: npmjs.org ã§ãã¹ããããŠããããã±ãŒãž
- PyPI: PyPI.org ã§ãã¹ããããŠãããœãŒã¹ãã¡ã€ã« (tar.gz) ããã±ãŒãž
- Go: GitHub.com ã§ãã¹ããããŠãããªããžããªã® GoLang ãœãŒã¹ãã¡ã€ã«
- Rust: crates.io ã§ãã¹ããããŠããã¯ã¬ãŒã
- RubyGems: rubygems.org ã§ãã¹ããããŠãã Gem ããã±ãŒãž
- GitHub Actions: GitHub.com ã§ãã¹ããããŠãããªããžããªã® Javascript ãœãŒã¹ãã¡ã€ã«
- VSCode æ¡åŒµæ©èœ: marketplace.visualstudio.com ã§ãã¹ããããŠããæ¡åŒµæ©èœ (.vsix) ããã±ãŒãž

GuardDog ã®ä»çµã¿
GuardDog ã¯ãã³ãŒãã®èœåãšè åšã€ã³ãã£ã±ãŒã¿ãŒãé¢é£ä»ãããªã¹ã¯ããŒã¹ã®æ€åºã¢ãã«ã䜿çšããŸã:
- æ€åº: ã«ãŒã«ã¯èœåïŒã³ãŒãã å®è¡ã§ãã ããšïŒãŸãã¯è åšïŒäžå¯©ãªã€ã³ãã£ã±ãŒã¿ãŒïŒãèå¥ããŸã
- é¢é£ä»ã: åããã¡ã€ã«ã§èŠã€ãã£ãèœåãšè åšããªã¹ã¯ã圢æããŸãïŒãã¡ã€ã«ããŸããäžèŽããªã¹ã¯ã圢æããŸãããé倧床ã¯åŒãäžããããŸãïŒ
- ã¹ã³ã¢ãªã³ã°: ãªã¹ã¯ã¯ãæ»æãã§ãŒã³ã®å®å šæ§ãšå·§åŠãã«åºã¥ã㊠(0-10) ã§ã¹ã³ã¢ãªã³ã°ãããŸã
- ã¬ããŒã: ããã±ãŒãžã«ã¯ã詳现ãªãªã¹ã¯ã®å èš³ãšãšãã«é倧床è©äŸ¡ïŒäœ/äž/é«ïŒãä»äžãããŸã
ãã®ã¢ãããŒãã®çç±
åŸæ¥ã® SAST ããŒã«ã¯ãã¹ãŠã®çããããã¿ãŒã³ãåå¥ã«ãã©ã°ä»ããããããã¢ã©ãŒãç²ããåŒãèµ·ãããŸããGuardDog ã¯æ¬¡ã®ããšãçè§£ããŠããŸã:
- èœåã ãã§ã¯æªæã¯ãããŸããïŒãããã¯ãŒã¯ã©ã€ãã©ãªã¯ HTTP ãªã¯ãšã¹ããè¡ãã¹ãã§ãïŒ
- è åšã€ã³ãã£ã±ãŒã¿ãŒã ãã§ã¯èª€æ€ç¥ã®å¯èœæ§ããããŸãïŒãã¹ããã£ã¯ã¹ãã£ãããã¥ã¡ã³ãïŒ
- èœå + è åšã®çµã¿åãããå®éã®ãªã¹ã¯ã瀺ããŸãïŒæªæã®ããããšã å®è¡ã§ãããã€å®è¡ãã ã³ãŒãïŒ
ãªã¹ã¯ã¹ã³ã¢ãªã³ã°
ããã±ãŒãžã¯ã4 ã€ã®èŠçŽ ã«åºã¥ã㊠0-10 ã®ã¹ã³ã¢ãåãåããŸã:
| èŠçŽ | éã¿ | 説æ |
|---|---|---|
| é倧床 | 30% | æãé«ãéå€§åºŠã®æ€åºçµæïŒäœ/äž/é«ïŒ |
| æ»æãã§ãŒã³ | 20% | å®å šãªæ»æã¹ããŒãžã®ååšïŒåæ â äžæ/åŸæïŒ |
| ç¹ç°æ§ | 30% | ãã¿ãŒã³ããã«ãŠã§ã¢ç¹æã§ããããæ£åœãªã³ãŒãã«ãåœãŠã¯ãŸããã®åºŠåã |
| å·§åŠã | 20% | æè¡ã®é«åºŠã |
ã¹ã³ã¢ã©ãã«:
- 0: ãªã¹ã¯ãæ€åºãããŠããªã
- 0.1-3: äœãªã¹ã¯ïŒåäžã¹ããŒãžã®è åšãç¹ç°æ§ãäœãïŒ
- 3.1-7.5: äžãªã¹ã¯ïŒéšåçãªæ»æãã§ãŒã³ãã¡ã¿ããŒã¿ã®ã€ã³ãã£ã±ãŒã¿ãŒããŸãã¯åäžã¹ããŒãžã®ã³ãŒãæ€åºçµæïŒ
- 7.6-10: é«ãªã¹ã¯ïŒãœãŒã¹ã³ãŒãã®èšŒæ ã䌎ã倿®µéã®æ»æãã§ãŒã³ â 䟵害ã®å¯èœæ§ãã»ãŒç¢ºå®ïŒ
æ»æãã§ãŒã³ã®ã¹ããŒãžïŒMITRE ATT&CK ã«åºã¥ãïŒ:
- åæ: åæã¢ã¯ã»ã¹ãå®è¡èœå
- äžæ: æ°žç¶åãé²åŸ¡åé¿ãè³æ Œæ å ±ãžã®ã¢ã¯ã»ã¹
- åŸæ: ã³ãã³ã&ã³ã³ãããŒã«ãå€éšãžã®æã¡åºãã圱é¿
GuardDog åãã®æ°ãã Datadog Agent ã€ã³ãã°ã¬ãŒã·ã§ã³ ãš Cloud SIEM ã³ã³ãã³ããã㯠ããã§ãã¯ããŠãã ããã
ã¯ããã«
ã€ã³ã¹ããŒã«
GuardDog ãå®è¡ããæãç°¡åãªæ¹æ³ã¯ uvx ã䜿çšããããšã§ã:
uvx guarddog pypi scan requests
ããŒã«ã«ã«ã€ã³ã¹ããŒã«ããã«ã¯:
uv tool install guarddog
# or
pip install guarddog
ãŸã㯠Docker ã€ã¡ãŒãžã䜿çšããŸã:
docker pull ghcr.io/datadog/guarddog
alias guarddog='docker run --rm ghcr.io/datadog/guarddog'
泚: Windows ã§ãµããŒããããŠããã€ã³ã¹ããŒã«æ¹æ³ã¯ Docker ã®ã¿ã§ãã
䜿çšäŸ
# Scan the most recent version of the 'requests' package
guarddog pypi scan requests
# Scan a specific version of the 'requests' package
guarddog pypi scan requests --version 2.28.1
# Scan the 'request' package using 2 specific heuristics
guarddog pypi scan requests --rules exec-base64 --rules code-execution
# Scan the 'requests' package using all rules but one
guarddog pypi scan requests --exclude-rules exec-base64
# Scan a local package archive
guarddog pypi scan /tmp/triage.tar.gz
# Scan a local package directory
guarddog pypi scan /tmp/triage/
# Scan a package stored in S3 (a folder/prefix or a single archive object)
guarddog pypi scan s3://my-bucket/path/to/package/
guarddog pypi scan s3://my-bucket/path/to/package.tar.gz
# Scan every package referenced in a requirements.txt file of a local folder
guarddog pypi verify workspace/guarddog/requirements.txt
# Scan every package referenced in a requirements.txt file and output a sarif file - works only for verify
guarddog pypi verify --output-format=sarif workspace/guarddog/requirements.txt
# Output JSON to standard output - works for every command
guarddog pypi scan requests --output-format=json
# All the commands also work on npm, go, crates, rubygems
guarddog npm scan express
guarddog go scan github.com/DataDog/dd-trace-go
guarddog go verify /tmp/repo/go.mod
# Scan Rust crates
guarddog crates scan serde
guarddog crates verify /tmp/repo/Cargo.lock
# Scan RubyGems packages
guarddog rubygems scan rails
guarddog rubygems verify /tmp/repo/Gemfile.lock
# Additionally can support scanning GitHub actions that are implemented in JavaScript
guarddog github_action scan DataDog/synthetics-ci-github-action
guarddog github_action verify /tmp/repo/.github/workflows/main.yml
# Scan VSCode extensions from the marketplace
guarddog extension scan ms-python.python
# Scan a specific version of a VSCode extension
guarddog extension scan ms-python.python --version 2023.20.0
# Scan a local VSCode extension directory or VSIX archive
guarddog extension scan /tmp/my-extension/
# Run in debug mode
guarddog --log-level debug npm scan express
ãµã³ãããã¯ã¹ã¹ãã£ã³
ããã±ãŒãžãã¹ãã£ã³ããéãGuardDog ã¯ã«ãŒãã«ã¬ãã«ã®ãµã³ãããã¯ã¹ïŒLinux ã§ã¯ LandlockãmacOS ã§ã¯ Seatbelt ã nono ã䜿çšããŠå©çšïŒå ã§ãœãŒã¹ã³ãŒãè§£æãå®è¡ããŸãããµã³ãããã¯ã¹ã¯ãã¹ãŠã®ãããã¯ãŒã¯ã¢ã¯ã»ã¹ããããã¯ãããã¡ã€ã«ã·ã¹ãã æäœãè§£æã«å¿ èŠãªãã¹ã®ã¿ã«å¶éããŸããããã«ãããã¢ãŒã«ã€ãã®æœåºãã¹ãã£ã³äžã«ã³ãŒããå®è¡ããããšããæªæã®ããããã±ãŒãžããä¿è·ãããŸãã
ããã©ã«ãã§ã¯ãµã³ãããã¯ã¹ãå¿
é ã§ãããã©ãããã©ãŒã ã§å©çšã§ããªãå Žåãä¿è·ãªãã§å®è¡ãã代ããã«ã¹ãã£ã³ã¯å€±æããŸãããµã³ãããã¯ã¹ãªãã§ã¹ãã£ã³ããã«ã¯ãæç€ºçã« --no-sandbox ãæž¡ãå¿
èŠããããŸã:
# Default: require the sandbox, exit with an error if it's unavailable
guarddog pypi scan requests
# Explicitly disable the sandbox
guarddog pypi scan requests --no-sandbox
ãªã¢ãŒãããã±ãŒãžã®å Žåã3 ã€ã®ãã§ãŒãºãç°ãªãæš©éã¬ãã«ã§å®è¡ãããŸã:
- ããŠã³ããŒããšã¡ã¿ããŒã¿åæã¯ãµã³ãããã¯ã¹ãªãã§å®è¡ãããŸãïŒãããã¯ãŒã¯ã¢ã¯ã»ã¹ãå¿ èŠïŒ
- ã¢ãŒã«ã€ãã®æœåºã¯ãµã³ãããã¯ã¹åããããµãããã»ã¹ã§å®è¡ãããŸãïŒãããã¯ãŒã¯ã¯ãããã¯ããããã¡ã€ã«ã·ã¹ãã ã¯å¶éãããŸãïŒ
- ãœãŒã¹ã³ãŒãè§£æ (YARA) ã¯ãµã³ãããã¯ã¹ãé©çšãããåŸãã¡ã€ã³ããã»ã¹ã§å®è¡ãããŸãïŒãããã¯ãŒã¯ã¯ãããã¯ããããã¡ã€ã«ã·ã¹ãã ã¯æœåºããããã¡ã€ã«ã«å¶éãããŸãïŒ
ãµã³ãããã¯ã¹ã¯ãã¢ãŒã«ã€ãæœåºäžã®ãã¹ãã©ããŒãµã«ããã³ã³ãŒãå®è¡ã®è匱æ§ã軜æžããããã«å°å ¥ãããŸãã (CVE-2022-23530ãCVE-2022-23531ãCVE-2026-22870ãCVE-2026-22871)ã
S3 ããã®ããã±ãŒãžã¹ãã£ã³
GuardDog ã¯ãS3 ã«ä¿åãããŠããããã±ãŒãžãããã©ã«ããŒ/ãã¬ãã£ãã¯ã¹ãŸãã¯åäžã®ã¢ãŒã«ã€ããªããžã§ã¯ããšããŠã¹ãã£ã³ã§ããŸã:
guarddog npm scan s3://my-bucket/path/to/package/
guarddog npm scan s3://my-bucket/path/to/package.tar.gz
ããã¯æ¢åã® AWS èªèšŒæ
å ±ïŒç°å¢å€æ°ã~/.awsãSSOããŸã㯠IAM ããŒã«ïŒã䜿çšããŸããGuardDog ã¯äœããè¡ãåã« STS çµç±ã§èªèšŒãæ€èšŒããæå¹ãªèªèšŒæ
å ±ãèŠã€ãããªãå Žåã¯ãšã©ãŒã§çµäºããŸãããªããžã§ã¯ãã¯äžæãã£ã¬ã¯ããªã«åæãããä»ã®ä¿¡é Œã§ããªãã³ã³ãã³ããšåæ§ã«ãµã³ãããã¯ã¹äžã§ã¹ãã£ã³ãããåŸããã£ã¹ã¯ããåé€ãããŸãã
ã«ãŒã«
GuardDog ã¯ããªã¹ã¯ããŒã¹ã®ã¹ã³ã¢ãªã³ã°ãšã³ãžã³ã«åå ãã 2 çš®é¡ã®æ€åºã«ãŒã«ã䜿çšããŸã:
- ãœãŒã¹ã³ãŒãã«ãŒã« (YARA): ããã±ãŒãžã®ãœãŒã¹ã³ãŒãã®éçè§£æã«ãããèœåãšè åšãæ€åºããŸã
- ã¡ã¿ããŒã¿ã«ãŒã« (Python ãã£ãã¯ã¿ãŒ): ããã±ãŒãžã¬ãžã¹ããªã®ã¡ã¿ããŒã¿ã®åæã«ããããµãã©ã€ãã§ãŒã³æ»æã®ã€ã³ãã£ã±ãŒã¿ãŒãæ€åºããŸã
ãšã³ã·ã¹ãã ããšã®ã«ãŒã«ã®å®å šãªãªã¹ãã«ã€ããŠã¯ãRULES.md ãåç §ããŠãã ããã
æ°ããã«ãŒã«ã®äœæã«ã€ããŠã¯ãWRITING_RULES.md ãåç §ããŠãã ããã
GitHub Action ã§ã® GuardDog ã®å®è¡
CI ãã€ãã©ã€ã³ã« GuardDog ãçµ±åããæãç°¡åãªæ¹æ³ã¯ãSARIF åºå圢åŒã掻çšããGitHub ã® code scanning æ©èœã«ã¢ããããŒãããããšã§ãã
ããã«ãããæ¬¡ã®ãã®ãåŸãããŸã:
- GuardDog ã¹ãã£ã³åºåã«åºã¥ããã«ãªã¯ãšã¹ããžã®èªåã³ã¡ã³ã
- GitHub UI ã§ã®çµã¿èŸŒã¿ã®èª€æ€ç¥ç®¡ç
GuardDog ã䜿çšãã GitHub Action ã®ãµã³ãã«:
name: GuardDog
on:
push:
branches:
- main
pull_request:
branches:
- main
permissions:
contents: read
jobs:
guarddog:
permissions:
contents: read # for actions/checkout to fetch code
security-events: write # for github/codeql-action/upload-sarif to upload SARIF results
name: Scan dependencies
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v7
- run: uvx guarddog pypi verify requirements.txt --output-format sarif --exclude-rules repository_integrity_mismatch > guarddog.sarif
- name: Upload SARIF file to GitHub
uses: github/codeql-action/upload-sarif@v3
with:
category: guarddog-builtin
sarif_file: guarddog.sarif
éçº
GuardDog ã®ããŒã«ã«ããŒãžã§ã³ã®å®è¡
- poetry ã
python >=3.10ã® env ãæã£ãŠããããšã確èªããŸãpoetry env use 3.10.0 - äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸã
poetry install - guarddog ãå®è¡ããŸã
poetry run guarddogãŸãã¯poetry shellãå®è¡ããŠããguarddogãå®è¡ããŸã
ãŠããããã¹ã
ãã¹ãŠã®ãŠããããã¹ããå®è¡: make test
ããã±ãŒãžã¡ã¿ããŒã¿ã®ãã¥ãŒãªã¹ãã£ãã¯ã«å¯ŸãããŠããããã¹ããå®è¡: make test-metadata-rules (ãã¹ãã¯ãã¡ã)ã
ãã³ãããŒã¯
æ£åœãªããã±ãŒãžãšæªæã®ããããã±ãŒãžã«å¯Ÿã㊠GuardDog ãå®è¡ãã誀æ€ç¥ãšèŠéããç¹å®ã§ããŸãã./tests/samples ãåç §ããŠãã ããã
ã³ãŒãå質ãã§ãã¯
åãã§ãã«ãŒãå®è¡ããŸã:
mypy --install-types --non-interactive guarddog
ããã³ãªã³ã¿ãŒãå®è¡ããŸã:
flake8 guarddog --count --select=E9,F63,F7,F82 --show-source --statistics --exclude tests/analyzer/sourcecode,tests/analyzer/metadata/resources,evaluator/data
flake8 guarddog --count --max-line-length=120 --statistics --exclude tests/analyzer/sourcecode,tests/analyzer/metadata/resources,evaluator/data --ignore=E203,W503
ç°å¢å€æ°ã«ããèšå®
GuardDog ã®åäœã¯ç°å¢å€æ°ã䜿çšããŠã«ã¹ã¿ãã€ãºã§ããŸã:
äžè¬çãªèšå®
| ç°å¢å€æ° | 説æ | ããã©ã«ãå€ |
|---|---|---|
GUARDDOG_PARALLELISM | 䞊ååŠçã«äœ¿çšããã¹ã¬ããæ° | å©çšå¯èœãª CPU æ° |
GUARDDOG_VERIFY_EXHAUSTIVE_DEPENDENCIES | äŸåé¢ä¿ã®ãã¹ãŠã®å¯èœãªããŒãžã§ã³ãåæãã (true/false) | false |
GUARDDOG_NPM_INCLUDE_DEV_DEPENDENCIES | npm package.json ãã¡ã€ã«ãã¹ãã£ã³ãããšãã« devDependencies ãå«ãã (true/false)ãguarddog npm verify --include-dev-dependencies ã§åŒã³åºãããšã«åãæ¿ããããšãã§ããŸã | false |
GUARDDOG_TOP_PACKAGES_CACHE_LOCATION | ãããããã±ãŒãžã®ãã£ãã·ã¥ãã£ã¬ã¯ããªã®å Žæ | guarddog/analyzer/metadata/resources |
GUARDDOG_YARA_EXT_EXCLUDE | YARA ã¹ãã£ã³ããé€å€ãããã¡ã€ã«æ¡åŒµåã®ã«ã³ãåºåããªã¹ã | ini,md,rst,txt,lock,json,yaml,yml,toml,xml,html,csv,sql,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,changelog,readme,makefile,dockerfile,pkg-info,d.ts |
ã¡ã¿ããŒã¿ã«ãŒã«ã®èšå®
| ç°å¢å€æ° | 説æ | ããã©ã«ãå€ |
|---|---|---|
GUARDDOG_NEW_DEPENDENCY_RISK_THRESHOLD | æ°ãã«å°å
¥ãããäŸåé¢ä¿ã risky_new_dependency ã«ãŒã«ã§èŠªããã±ãŒãžããã©ã°ä»ãããããã®æå°ãªã¹ã¯ã¹ã³ã¢ | 5.0 |
ã¢ãŒã«ã€ãæœåºã®ã»ãã¥ãªãã£å¶é
GuardDog ã¯ãããã±ãŒãžã¢ãŒã«ã€ããæœåºããéã«ãå§çž®ç匟ïŒzip bombïŒããã¡ã€ã«ãã£ã¹ã¯ãªãã¿æ¯æžæ»æããä¿è·ããããã«è€æ°ã®ã»ãã¥ãªãã£ãã§ãã¯ãå®è£ ããŠããŸã:
| ç°å¢å€æ° | 説æ | ããã©ã«ãå€ |
|---|---|---|
GUARDDOG_MAX_UNCOMPRESSED_SIZE | 蚱容ãããæå€§éå§çž®ãµã€ãºïŒãã€ãåäœïŒïŒãã£ã¹ã¯å®¹éã®æ¯æžãé²ããŸãïŒ | 2147483648 (2 GB) |
GUARDDOG_MAX_COMPRESSION_RATIO | 蚱容ãããæå€§å§çž®çïŒäžå¯©ãªå§çž®ãã¿ãŒã³ãæ€åºããŸãïŒ | 100 (100:1) |
GUARDDOG_MAX_FILE_COUNT | ã¢ãŒã«ã€ãã§èš±å¯ãããæå€§ãã¡ã€ã«æ°ïŒãã¡ã€ã«ãã£ã¹ã¯ãªãã¿/inode ã®æ¯æžãé²ããŸãïŒ | 100000 |
ã¡ã³ãããŒ
èè
è¬èŸ
ã€ã³ã¹ãã¬ãŒã·ã§ã³:
- Backstabberâs Knife Collection: A Review of Open Source Software Supply Chain Attacks
- What are Weak Links in the npm Supply Chain?
- A Survey on Common Threats in npm and PyPi Registries
- A Benchmark Comparison of Python Malware Detection Approaches
- Towards Measuring Supply Chain Attacks on Package Managers for Interpreted Languages