업데이트로 돌아가기
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

관리자

저자

감사의 글

영감:

카테고리