์—…๋ฐ์ดํŠธ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
New releaseAug 12, 2026

guarddog v3.2.0

๐Ÿ ๐Ÿ” GuardDog๋Š” ์•…์„ฑ PyPI ๋ฐ npm ํŒจํ‚ค์ง€๋ฅผ ์‹๋ณ„ํ•˜๋Š” CLI ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

๊ณต์œ 

GuardDog

Test OpenSSF Scorecard OpenSSF Best Practices

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 Extensions: marketplace.visualstudio.com์— ํ˜ธ์ŠคํŒ…๋œ ํ™•์žฅ(.vsix) ํŒจํ‚ค์ง€

GuardDog demo usage

GuardDog ์ž‘๋™ ๋ฐฉ์‹

GuardDog๋Š” ์ฝ”๋“œ ๊ธฐ๋Šฅ๊ณผ ์œ„ํ˜‘ ์ง€ํ‘œ๋ฅผ ์—ฐ๊ด€์‹œํ‚ค๋Š” ์œ„ํ—˜ ๊ธฐ๋ฐ˜ ํƒ์ง€ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

  1. ํƒ์ง€: ๊ทœ์น™์€ ๊ธฐ๋Šฅ(์ฝ”๋“œ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ) ๋˜๋Š” ์œ„ํ˜‘(์˜์‹ฌ์Šค๋Ÿฌ์šด ์ง€ํ‘œ)์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
  2. ์—ฐ๊ด€ ๋ถ„์„: ๋™์ผํ•œ ํŒŒ์ผ์—์„œ ๋ฐœ๊ฒฌ๋œ ๊ธฐ๋Šฅ๊ณผ ์œ„ํ˜‘์€ ์œ„ํ—˜์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค (ํŒŒ์ผ ๊ฐ„ ์ผ์น˜๋„ ์œ„ํ—˜์„ ๊ตฌ์„ฑํ•˜๋˜ ์‹ฌ๊ฐ๋„๋Š” ๋‚ฎ์•„์ง‘๋‹ˆ๋‹ค).
  3. ์ ์ˆ˜ํ™”: ์œ„ํ—˜์€ ๊ณต๊ฒฉ ์ฒด์ธ์˜ ์™„์„ฑ๋„์™€ ์ •๊ตํ•จ์— ๋”ฐ๋ผ 0-10์ ์œผ๋กœ ์ ์ˆ˜ํ™”๋ฉ๋‹ˆ๋‹ค.
  4. ๋ณด๊ณ : ํŒจํ‚ค์ง€๋Š” ์ƒ์„ธ ์œ„ํ—˜ ๋ถ„์„๊ณผ ํ•จ๊ป˜ ์‹ฌ๊ฐ๋„ ๋“ฑ๊ธ‰(๋‚ฎ์Œ/์ค‘๊ฐ„/๋†’์Œ)์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์™œ ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ธ๊ฐ€?

๊ธฐ์กด SAST ๋„๊ตฌ๋Š” ๋ชจ๋“  ์˜์‹ฌ์Šค๋Ÿฌ์šด ํŒจํ„ด์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ”Œ๋ž˜๊ทธํ•˜์—ฌ ์•Œ๋ฆผ ํ”ผ๋กœ๋ฅผ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. GuardDog๋Š” ๋‹ค์Œ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค:

  • ๊ธฐ๋Šฅ๋งŒ์œผ๋กœ๋Š” ์•…์„ฑ์œผ๋กœ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (๋„คํŠธ์›Œํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” HTTP ์š”์ฒญ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค)
  • ์œ„ํ˜‘ ์ง€ํ‘œ๋งŒ์œผ๋กœ๋Š” ์˜คํƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (ํ…Œ์ŠคํŠธ ํ”ฝ์Šค์ฒ˜, ๋ฌธ์„œ)
  • ๊ธฐ๋Šฅ + ์œ„ํ˜‘์ด ํ•จ๊ป˜ ์žˆ์œผ๋ฉด ์‹ค์ œ ์œ„ํ—˜์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค (์•…์˜์ ์ธ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๊ณ  ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•  ์ฝ”๋“œ)

์œ„ํ—˜ ์ ์ˆ˜ํ™”

ํŒจํ‚ค์ง€๋Š” ๋„ค ๊ฐ€์ง€ ์š”์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ 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

์›๊ฒฉ ํŒจํ‚ค์ง€์˜ ๊ฒฝ์šฐ ์„ธ ๋‹จ๊ณ„๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ถŒํ•œ ์ˆ˜์ค€์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค:

  1. ๋‹ค์šด๋กœ๋“œ ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ถ„์„์€ ์ƒŒ๋“œ๋ฐ•์Šค ์—†์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค(๋„คํŠธ์›Œํฌ ์ ‘๊ทผ ํ•„์š”)
  2. ์•„์นด์ด๋ธŒ ์ถ”์ถœ์€ ์ƒŒ๋“œ๋ฐ•์Šค๋œ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค(๋„คํŠธ์›Œํฌ ์ฐจ๋‹จ, ํŒŒ์ผ ์‹œ์Šคํ…œ ์ œํ•œ)
  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๋Š” ์œ„ํ—˜ ๊ธฐ๋ฐ˜ ์ ์ˆ˜ํ™” ์—”์ง„์— ๋ชจ๋‘ ์ฐธ์—ฌํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ํƒ์ง€ ๊ทœ์น™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

  • ์†Œ์Šค ์ฝ”๋“œ ๊ทœ์น™(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 ํ™˜๊ฒฝ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š” 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_DEPENDENCIESnpm package.json ํŒŒ์ผ ์Šค์บ” ์‹œ devDependencies ํฌํ•จ (true/false); guarddog npm verify --include-dev-dependencies๋กœ ํ˜ธ์ถœ๋ณ„๋กœ ์ „ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์Œfalse
GUARDDOG_TOP_PACKAGES_CACHE_LOCATION์ƒ์œ„ ํŒจํ‚ค์ง€ ์บ์‹œ ๋””๋ ‰ํ„ฐ๋ฆฌ ์œ„์น˜guarddog/analyzer/metadata/resources
GUARDDOG_YARA_EXT_EXCLUDEYARA ์Šค์บ”์—์„œ ์ œ์™ธํ•  ํŒŒ์ผ ํ™•์žฅ์ž์˜ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก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_THRESHOLDrisky_new_dependency ๊ทœ์น™์—์„œ ์ƒˆ๋กœ ๋„์ž…๋œ ์ข…์†์„ฑ์ด ์ƒ์œ„ ํŒจํ‚ค์ง€๋ฅผ ํ”Œ๋ž˜๊ทธํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ์œ„ํ—˜ ์ ์ˆ˜5.0

์•„์นด์ด๋ธŒ ์ถ”์ถœ ๋ณด์•ˆ ์ œํ•œ

GuardDog๋Š” ์••์ถ• ํญํƒ„ ๋ฐ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ณ ๊ฐˆ ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํŒจํ‚ค์ง€ ์•„์นด์ด๋ธŒ ์ถ”์ถœ ์‹œ ์—ฌ๋Ÿฌ ๋ณด์•ˆ ๊ฒ€์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค:

ํ™˜๊ฒฝ ๋ณ€์ˆ˜์„ค๋ช…๊ธฐ๋ณธ๊ฐ’
GUARDDOG_MAX_UNCOMPRESSED_SIZEํ—ˆ์šฉ๋˜๋Š” ์ตœ๋Œ€ ์••์ถ• ํ•ด์ œ ํฌ๊ธฐ(๋ฐ”์ดํŠธ) (๋””์Šคํฌ ๊ณต๊ฐ„ ๊ณ ๊ฐˆ ๋ฐฉ์ง€)2147483648 (2 GB)
GUARDDOG_MAX_COMPRESSION_RATIOํ—ˆ์šฉ๋˜๋Š” ์ตœ๋Œ€ ์••์ถ• ๋น„์œจ (์˜์‹ฌ์Šค๋Ÿฌ์šด ์••์ถ• ํŒจํ„ด ๊ฐ์ง€)100 (100:1)
GUARDDOG_MAX_FILE_COUNT์•„์นด์ด๋ธŒ์— ํ—ˆ์šฉ๋˜๋Š” ์ตœ๋Œ€ ํŒŒ์ผ ์ˆ˜ (ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ/inode ๊ณ ๊ฐˆ ๋ฐฉ์ง€)100000

๊ด€๋ฆฌ์ž

์ €์ž

๊ฐ์‚ฌ์˜ ๊ธ€

์˜๊ฐ:

์นดํ…Œ๊ณ ๋ฆฌ