
npm/yarn 및 Python(pip/poetry/uv) 전반에서 공급망 공격을 탐지, 평가 및 대응합니다. Claude Code 스킬 + 독립 실행형 스크립트. axios RAT(2026-03-31) 및 Starlette BadHost CVE-2026-48710(2026-05-22) 기간 중에 구축됨.
npm/yarn 및 Python (pip/poetry/uv) 공급망 공격 대응을 위한 인시던트 대응 도구 키트 — 무료, 로컬 실행, 종속성 없음.
SCG는 상용 도구와 커버리지에서 경쟁하는 스캐닝 엔진이 아닙니다. 이는 Claude Code 스킬이자 독립형 셸 도구 키트로, 세 가지 작업을 잘 수행합니다: (1) 특정 인시던트가 발생했을 때 빠르고 반복 가능한 초기 대응을 제공하며("내 머신이 지금 영향을 받고 있는가?"), (2) 기존 OSS 스캐너(npm audit, osv-scanner, pip-audit)를 하나의 구조화된 패스로 오케스트레이션하고, (3) 특히 AI 개발 환경에서 일반 스캐너가 다루지 않는 설계 위생 교훈을 문서화합니다.
실제 인시던트 중에 구축 및 강화되었으며, 다음 사례를 포함합니다:
scripts/project-scan-py.sh2026년 3월 31일, 널리 사용되는 axios npm 패키지(v1.14.1 및 v0.30.4)가 UNC1069/DPRK-APT(Google Threat Intelligence Group 추정)로 인한 관리자 계정 탈취를 통해 손상되었습니다. 이 공격은 postinstall 스크립트를 통해 합법적인 시스템 프로세스로 위장한 교차 플랫폼 RAT을 배포하는 팬텀 종속성([email protected])을 주입했습니다.
**Supply Chain Guard (SCG)**는 인시던트 중에 다음을 제공하기 위해 구축되었습니다:
SCG는 기존 보안 도구를 대체하지 않습니다. 여러 탐지 계층을 구조화된 검증 프레임워크 및 안내된 문제 해결과 결합하여, 활성 인시던트 중에 사용하거나 기존 도구와 함께 정기 점검으로 사용하도록 설계되었습니다.
| 도구 | 기능 | SCG와의 관계 |
|---|---|---|
npm audit | 레지스트리에서 알려진 취약점 확인 | SCG는 npm audit을 L1 계층으로 포함한 후, IOC 파일시스템/네트워크 스캐닝, 악성 패키지 탐지 및 상단의 구조화된 대응 워크플로우를 추가합니다 |
osv-scanner | Google의 OSV 데이터베이스에 대한 잠금 파일 스캔 | SCG는 OSV를 L2 계층으로 포함합니다. osv-scanner는 파일시스템의 RAT 아티팩트나 활성 C2 연결을 확인하지 않습니다 |
| Snyk / Socket.dev | 실시간 모니터링, PR 검사, 라이선스 스캐닝을 갖춘 상용 SaaS | SCG는 무료이며, 로컬 우선, 계정 불필요, 제3자에게 데이터 전송 없음. 지속적인 모니터링보다 즉각적인 인시던트 대응을 위해 설계됨 |
| 수동 IR | 사용자 지정 스크립트를 사용한 임시 조사 | SCG는 인시던트마다 달라지는 일회성 체크리스트 대신 반복 가능한 프레임워크(8개 검증 게이트, 수렴 루프, 심각도 매트릭스)를 제공합니다 |
SCG를 사용해야 하는 경우:
다른 것을 사용해야 하는 경우:
경계를 솔직히 밝히는 것이 과장 판매보다 낫습니다. SCG는 세 가지입니다:
코드로 작성된 인시던트 대응 플레이북. 명명된 인시던트(axios RAT, Shai-Hulud, 새로운 CVE)가 발생하면 SCG는 "내가 영향을 받았는가, 그렇다면 어떻게 해야 하는가?"를 실행 가능한 체크리스트(8개 검증 게이트, 심각도 매트릭스, 모든 파괴적 작업에 명시적인 [y/N] 확인이 필요한 문제 해결 스크립트)로 전환합니다. 이것이 주요 가치입니다: 상용 모니터링 도구가 제공하지 않는 빠르고 구조화된 초기 대응입니다.
기존 OSS 스캐너의 오케스트레이터. L1/L2 계층은 npm audit / pip-audit / osv-scanner를 래핑합니다. 원시 탐지 성능의 대부분은 차용되었습니다. SCG의 기여는 이를 하나의 패스로 묶고, 레지스트리 도구가 수행하지 않는 파일시스템/IOC 검사를 추가하며, 출력을 읽기 쉽고 실행 가능하게 만드는 것입니다.
실제 설계 위생 교훈 문서화 (SKILL.md §D.7) — 실제로 직면하거나 조사한 사항: MCP 전송 선택, GCP 기본-SA 강화, 설치 시 실행 벡터, AI 개발 도구를 표적으로 하는 위협(Shai-Hulud가 .claude/settings.json 읽기, SANDWORM_MODE가 MCP 구성 오염). 이 틈새 — AI 지원 개발을 위한 공급망 위생 — 가 SCG가 진정으로 차별화되는 부분입니다.
SKILL.md D.2, L3 정적 목록)는 수동 유지 관리됩니다 — 우리가 읽은 인시던트를 보유하며, 라이브 상용 피드가 추적하는 수만 개의 악성 패키지를 보유하지 않습니다. 수동 선별 목록은 실제 새로운 위협의 속도를 따라잡을 수 없으며, 우리는 그렇게 할 수 있다고 주장하지 않습니다.수동 선별 데이터베이스는 커버리지에서 이길 수 없기 때문에, 항상 뒤처지는 영역보다는 SCG가 대체하기 어려운 부분에 의도적으로 투자하고 있습니다:
정적 위협 데이터베이스(#2)는 주목할 만한 인시던트가 발생할 때마다 계속 업데이트되지만, 경쟁하려는 방향이 아님을 명시적으로 밝힙니다.
SCG는 세 가지 계층으로 도메인 주도 설계(DDD) 아키텍처를 따릅니다:``` +-----------------------------------------------------+ | Domain Layer | | Threat models, known threats DB, severity matrix, | | Devil Gate definitions | +-----------------------------------------------------+ | Application Layer | | Use cases, scan pipeline, response protocols, | | Devil execution loop | +-----------------------------------------------------+ | Infrastructure Layer | | Scanner scripts (npm audit, OSV, static list, | | IOC filesystem, network, lockfile integrity) | +-----------------------------------------------------+
### 스캔 파이프라인
동일한 5계층 파이프라인이 두 생태계 모두에 적용되며, 각 계층에는 생태계별 스캐너가 있습니다:```
L1 ──→ L2 ──→ L3 ──→ IOC ──→ LF ──→ assess(SeverityMatrix) ──→ VERDICT
| 계층 | npm/yarn (project-scan.sh) | Python (project-scan-py.sh) |
|---|---|---|
| L1 | npm audit | pip-audit |
| L2 | osv-scanner / OSV.dev API | osv-scanner |
| L3 | 정적 목록 (악성 + 오타스쿼팅) | 정적 목록 (악성/오타스쿼팅 + CVE 플래그 지정 버전) |
| IOC | 파일시스템 + 네트워크 아티팩트 | 파일시스템 + 프로세스 아티팩트 (Python 스타일) |
| LF | npm ci --dry-run + 무결성 수 | 잠금파일 무결성 (uv.lock / poetry.lock / requirements*.txt) |
두 파이프라인 모두 동일한 SeverityMatrix 및 Devil Gate Framework에 연결됩니다.
SKILL.md 파일을 Claude Code 스킬 디렉토리에 복사하세요:```bash
cp SKILL.md ~/.claude/skills/supply-chain-guard.md
mkdir -p .claude/skills cp SKILL.md .claude/skills/supply-chain-guard.md
그런 다음 Claude Code에서 호출하십시오:```
> /supply-chain-guard
> "Check this project for supply chain issues"
> "Is my machine affected by the axios compromise?"
./scripts/env-scan.sh
./scripts/project-scan.sh
./scripts/project-scan-py.sh
./scripts/ioc-scan.sh
./scripts/respond.sh --critical # Full RAT cleanup (npm + Python) ./scripts/respond.sh --high axios 1.14.0 # Pin npm package to safe version ./scripts/respond.sh --high urllib3 2.7.0 # Pin Python package (auto-detects pip/poetry/uv)
> **Python 수정은 기본적으로 보수적으로 설계되었습니다.** npm의 경우 `--high`가 자동으로 재정의를 적용합니다. Python의 경우 *안내*합니다: 사용 중인 패키지 관리자(pip/poetry/uv)를 감지하여 정확한 고정 명령을 출력하고 안전한 단계만 적용합니다. 잠금 파일 변경 및 venv 재구축 명령은 실행할 수 있도록 표시만 됩니다. 이는 분열된 Python 패키징 생태계에서 오탐이 연쇄적인 강제 재설치를 유발하는 것을 방지합니다.
다중 언어 저장소(npm + Python)의 경우 관련 하위 디렉터리에서 순차적으로 두 프로젝트 스캐너를 실행하세요.
> **안전 설계:** 모든 스캔 스크립트는 엄격히 읽기 전용입니다. 어떤 것도 수정, 삭제 또는 설치하지 않습니다. 수정 스크립트(`respond.sh`)만이 파괴적인 작업을 수행하며, **모든 단일 작업에는 기본값이 NO인 명시적인 `[y/N]` 확인**이 필요합니다.
---
## 스캔 모드
### 환경 스캔 (`env_scan`)
개발 머신 전체를 침해 지표에 대해 스캔합니다.
| 검사 항목 | 설명 |
|-------|-------------|
| **IOC: 파일시스템** | RAT 바이너리, 지속성 메커니즘, 스테이징 파일 |
| **IOC: 네트워크** | 활성 C2 연결 (IP + 도메인) |
| **IOC: 프로세스** | 실행 중인 악성 프로세스 |
| **프로젝트 간** | 모든 `package-lock.json` 파일에서 손상된 버전 스캔 |
| **악성 패키지** | 모든 잠금 파일 내 알려진 악성 패키지 이름 |
**트리거:** "이 PC", "환경 검사", "머신 전체"
### 프로젝트 스캔 — npm/yarn (`project_scan`)
단일 npm/yarn 프로젝트의 심층 스캔. `package.json`이 포함된 디렉터리에서 실행합니다.
| 계층 | 스캐너 | 설명 |
|-------|---------|-------------|
| **L1** | `npm audit` | npm 레지스트리를 통한 알려진 취약점 |
| **L2** | `osv-scanner` / OSV.dev API | Google의 오픈소스 취약점 데이터베이스 |
| **L3** | 정적 목록 | 하드코딩된 알려진 악성 패키지 확인 |
| **IOC** | 파일시스템 + 네트워크 | RAT 아티팩트 탐지 |
| **LF** | 잠금 파일 무결성 | `npm ci --dry-run` + 무결성 해시 개수 |
**트리거:** "이 프로젝트", "npm audit", 또는 현재 작업 디렉터리에 `package.json`이 있는 경우
### 프로젝트 스캔 — Python (`project_scan_py`, v4에서 추가됨)
단일 Python 프로젝트의 심층 스캔. `pyproject.toml`, `requirements*.txt`, `poetry.lock`, 또는 `uv.lock`이 포함된 디렉터리에서 실행합니다.
| 계층 | 스캐너 | 설명 |
|-------|---------|-------------|
| **L1** | `pip-audit` | PyPI Advisory DB를 통한 알려진 취약점 (선택 사항 — 설치되지 않은 경우 SKIP; `pip install pip-audit` 권장) |
| **L2** | `osv-scanner` | Google의 오픈소스 취약점 데이터베이스, `uv.lock` / `poetry.lock` / `requirements*.txt` 대상 (선택 사항 — 설치되지 않은 경우 SKIP) |
| **L3-MAL** | 정적 악성 목록 (`_L3_LIST`) | 알려진 하이재킹/타이포스쿼팅 패키지 이름. PEP 621 목록, Poetry 인라인, requirements 스타일 선언과 일치합니다 ([PR #4](https://github.com/eris-ths/supply-chain-guard/pull/4) 참고). 적중 시 FAIL |
| **L3-CVE** | 정적 CVE 플래그 버전 목록 (`_L3_CVE_LIST`) | 합법적인 패키지의 알려진 취약한 버전 (예: [BadHost CVE-2026-48710](https://cryptobriefing.com/starlette-badhost-vulnerability-ai-agents/)에 대한 `starlette<1.0.1`). Python의 `packaging` 라이브러리를 통한 엄격한 semver 평가. 확인된 일치 시 FAIL. 패키지가 선언되었지만 잠금 파일이 없는 경우 경고 (버전을 평가할 수 없음) |
| **IOC** | 파일시스템 + 프로세스 | Python 특화 아티팩트 확인 (불량 스크립트, 의심스러운 프로세스) |
| **LF** | 잠금 파일 무결성 | `uv.lock` / `poetry.lock` / `requirements*.txt`가 깔끔하게 파싱되고 고정된 버전을 포함하는지 확인 |
**트리거:** Python 파일이 있는 "이 프로젝트" 또는 현재 작업 디렉터리에 `pyproject.toml` / `requirements*.txt` / `poetry.lock` / `uv.lock` 중 하나가 있는 경우
> **의존성 참고:** L1(`pip-audit`) 및 L2(`osv-scanner`)는 각 CLI가 없을 경우 힌트와 함께 정상적으로 SKIP합니다. L3는 항상 활성화된 계층이며 외부 도구가 필요하지 않지만, 정확한 L3-CVE 평가는 `pip install packaging`이 필요합니다.
---
## 위협 인텔리전스
### 알려진 위협 데이터베이스
| ID | 날짜 | 패키지 | 위협 행위자 | 벡터 |
|----|------|---------|-------------|--------|
| **T001** | 2026-03-31 | `[email protected]`, `[email protected]` | UNC1069/DPRK-APT | 유지 관리자 손상 → 유령 의존성 → RAT |
| **T002** | 2018-11 | `[email protected]` | 알 수 없음 | 의존성 주입 → 암호화폐 도난 |
| **T003** | 지속 중 | `crossenv`, `loadsh`, `crypto-js-esm` | 다양함 | 타이포스쿼팅 → 설치 후 데이터 유출 |
### T001 킬 체인 (axios RAT)```
Credential theft → npm publish (bypass CI) → Inject phantom dep (plain-crypto-js)
→ postinstall exec → RAT drop → C2 beacon (sfrclak.com:8000) → Persist
| 패키지 | 안전 버전 | 손상된 버전 |
|---|---|---|
| axios (latest) | 1.14.0 (정확히) 또는 >=1.14.2 | 1.14.1 |
| axios (legacy) | 0.30.3 (정확히) | 0.30.4 |
SCG는 8개의 게이트로 구성된 검증 프레임워크를 사용하며, 4개의 카테고리로 구성되어 있으며, 수렴 루프를 포함한 직렬 체인으로 실행됩니다.
| # | 게이트 | 카테고리 | 질문 |
|---|---|---|---|
| G1 | 직접 종속성 | 의존성 중독 | 직접 종속성 중 손상된 버전이 있습니까? |
| G2 | 전이 종속성 | 의존성 중독 | 전이 (간접) 종속성이 손상되었습니까? |
| G3 | RAT 아티팩트 | 런타임 손상 | 파일 시스템에 RAT 흔적이 있습니까? |
| G4 | Postinstall 스크립트 | 런타임 손상 | 의심스러운 postinstall 스크립트가 있습니까? |
| G5 | Lockfile 무결성 | 무결성 | lockfile이 변조되었습니까? |
| G6 | 출처 | 무결성 | 패키지가 합법적인 출처/유지 관리자의 것입니까? |
| G7 | 네트워크 | 환경 | 의심스러운 아웃바운드 연결이 있습니까? |
| G8 | CI/CD 강화 | 환경 | CI/CD가 postinstall을 우회하거나 frozen lockfile을 강제합니까? |
S1: Dependency (G1+G2) → S2: Runtime (G3+G4) → S3: Integrity (G5+G6) → S4: Environment (G7+G8) → Any fail? → Fix → Re-run entire chain → All pass? → "No concerns" → Done → 3 rounds without convergence? → Escalate to user
### 심각도 매트릭스
| 수준 | 조건 | 조치 |
|-------|-----------|--------|
| **심각** | RAT 아티팩트 발견 또는 악성 패키지 설치됨 | 네트워크 격리 → 프로세스 종료 → 지속성 제거 → 재설치 |
| **높음** | 손상된 버전 사용 중 | 안전한 버전 고정 → 재정의 → `npm ci` → 확인 |
| **중간** | 의심스러운 설치 후 스크립트 | 수동 검토 → 허용 목록에 추가 또는 제거 |
| **낮음** | 락파일 차이 | `npm ci` 재동기화 |
| **정상** | 모든 검사 통과 | 조치 불필요 |
> **안전:** 심각/높음 응답은 파괴적인 작업을 수반합니다. SCG는 항상 결과를 제시하고, 사용자에게 명시적 확인을 요청한 후에야 수정을 실행합니다.
---
## 독립 실행형 스크립트
### `scripts/env-scan.sh`
전체 환경 검사. IOC 아티팩트를 확인하고, `$HOME`(구성 가능) 아래의 모든 락파일을 스캔하며, 손상된 패키지를 보고합니다.```bash
./scripts/env-scan.sh [scan_root_dir]
# Default: $HOME
scripts/project-scan.sh프로젝트 수준 스캔. package.json이 포함된 디렉토리에서 실행하세요.```bash
cd my-project
/path/to/scripts/project-scan.sh
### `scripts/ioc-scan.sh`
IOC 전용 스캔. 파일 시스템 아티팩트, 실행 중인 프로세스 및 네트워크 연결을 알려진 C2 지표와 비교하여 확인합니다. 크로스 플랫폼 (PowerShell을 통한 macOS/Linux/Windows).```bash
./scripts/ioc-scan.sh
scripts/respond.sh대화형 수정. 모든 파괴적 작업에는 [y/N] 확인이 필요합니다 (기본값: 아니오).```bash
./scripts/respond.sh --critical
./scripts/respond.sh --high axios 1.14.0 # npm ./scripts/respond.sh --high event-stream 3.3.5 # npm ./scripts/respond.sh --high urllib3 2.7.0 # python (pip/poetry/uv auto-detected)
`--critical` 모드의 단계:
1. 네트워크 격리 (`/etc/hosts`를 통해 C2 도메인 차단)
2. RAT 프로세스 종료
3. 지속성 제거 (LaunchAgents / crontab / 예약된 작업)
4. `node_modules` 및 Lockfile 삭제, npm 캐시 정리
- **4b (Python):** pip 캐시 제거 (안전, 자동); venv 재구축은 수동 단계로 표시
5. 의존성 재설치
6. 확인 스캔 프롬프트 (`project-scan.sh` 및/또는 `project-scan-py.sh`)
각 단계는 작업이 실제로 필요한지 확인합니다 (예: 실행 중인 RAT 프로세스가 없으면 "kill"을 건너뜁니다). 그리고 확인을 요청하기 전에 실행될 내용을 정확히 보여줍니다.
**HIGH** 모드의 경우, npm은 자동으로 오버라이드를 적용합니다. Python은 안내됩니다 (관리자 감지 → pin 명령어 출력 → 안전한 단계만 적용). [빠른 시작](#quick-start)의 Python 수정 참고 사항을 확인하세요.
---
## CI/CD 통합
### GitHub Actions```yaml
name: Supply Chain Guard
on:
pull_request:
paths:
- 'package.json'
- 'package-lock.json'
- 'yarn.lock'
jobs:
scg-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies (hardened)
run: npm ci --ignore-scripts
- name: Run SCG project scan
run: |
chmod +x ./scripts/project-scan.sh
./scripts/project-scan.sh
- name: Run IOC scan
run: |
chmod +x ./scripts/ioc-scan.sh
./scripts/ioc-scan.sh
npm ci --ignore-scripts # Block postinstall execution
yarn install --frozen-lockfile --ignore-scripts
> **SHA로 고정하고, 태그로 고정하지 마십시오.** 위 예제는 가독성을 위해 `actions/checkout@v4`를 사용했지만, 태그는 이동될 수 있습니다. 프로덕션에서는 전체 커밋 SHA로 고정하여 공급망 공격을 방지하십시오:
> ```yaml
> - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
> - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
> ```
---
## 대응 플레이북
### CRITICAL (RAT 탐지됨) 시
> **당황하지 마십시오.** 다음 단계를 순서대로 수행하십시오. 각 단계마다 명시적 확인이 필요합니다.
1. **네트워크 격리** — `/etc/hosts`를 통해 C2 도메인 차단
2. **프로세스 종료** — RAT 프로세스 종료 (`com.apple.act.mond`, `ld.py`, `wt.exe`)
3. **지속성 제거** — LaunchAgents, crontabs, 예약된 작업 삭제
4. **npm 정리** — `node_modules` 및 `package-lock.json` 제거, npm 캐시 비우기
5. **재설치** — 신규 `npm install && npm ci`
6. **재스캔** — 전체 파이프라인 재실행, CLEAR 예상
### HIGH (손상된 버전 설치됨) 시
1. `respond.sh`를 사용하여 **안전한 버전으로 고정**: ```bash
./scripts/respond.sh --high axios 1.14.0
This adds overrides (npm) or resolutions (yarn) to package.json, reinstalls, and prompts for verification.
package.json: ```json
{ "overrides": { "axios": "1.14.0" } }
Yarn: { "resolutions": { "axios": "1.14.0" } }
npm ci| 플랫폼 | 경로 | 유형 |
|---|---|---|
| macOS | /Library/Caches/com.apple.act.mond | RAT binary |
| macOS | ~/Library/LaunchAgents/com.apple.act.mond.plist | Persistence |
| Windows | %PROGRAMDATA%\wt.exe | RAT binary (disguised as Windows Terminal) |
| Windows | %TEMP%\6202033.vbs | Dropper |
| Windows | %TEMP%\6202033.ps1 | Dropper |
| Linux | /tmp/ld.py | RAT script |
| Linux | /tmp/.npm-cache/ | Staging directory |
| 플랫폼 | 메커니즘 | 식별자 |
|---|---|---|
| macOS | LaunchAgent | com.apple.act.mond |
| Windows | Scheduled Task | WindowsTerminalUpdate |
| Linux | Crontab entry | References ld.py or .npm-cache |
| 유형 | 값 |
|---|---|
| C2 Domain | sfrclak.com |
| C2 IP | 142.11.206.73 |
| C2 Port | 8000 |
| 플랫폼 | 위장 대상 |
|---|---|
| macOS | Apple system process (com.apple.act.mond) |
| Windows | Windows Terminal (wt.exe in ProgramData) |
SCG ────────────────────────────────── [L1:audit] CLEAR|!!sev [L2:osv] CLEAR|!!vuln-ids [L3:static] CLEAR|!!pkg [IOC:fs] CLEAR|!!C:artifact [IOC:net] CLEAR|!!C:c2 [LF:integ] CLEAR|!!drift ─── Devil Gate(8) ──────────────────── G1:direct_dep G2:transitive G3:rat_fs G4:postinstall G5:lockfile G6:provenance G7:network G8:cicd ─── Devil Chain(R.N) ───────────────── S1:dependency → S2:runtime → S3:integrity → S4:environment ─── Loop ───────────────────────────── R.N → converge|continue [VERDICT] CLEAR|HIGH|CRITICAL ───────────────────────────────────────
---
## 참고 자료
| 출처 | 설명 |
|--------|-------------|
| [Zenn (JP)](https://zenn.dev/gunta/articles/0152eadf05d173) | 일본어 초기 보고서 |
| [Elastic Security Labs](https://elastic.co/security-labs/axios-one-rat-to-rule-them-all) | 기술 분석 (RAT 디스어셈블리, C2 프로토콜, 타임라인) |
| [SANS](https://sans.org/blog/axios-npm-supply-chain-compromise-malicious-packages-remote-access-trojan) | 기업 IR 절차 |
| [Huntress](https://huntress.com/blog/supply-chain-compromise-axios-npm-package) | YARA 시그니처 |
| [Elastic Detections](https://elastic.co/security-labs/axios-supply-chain-compromise-detections) | SIEM 탐지 규칙 (YARA/osquery/KQL) |
| [Semgrep](https://semgrep.dev/blog/2026/axios-supply-chain-incident-indicators-of-compromise-and-how-to-contain-the-threat/) | 정적 분석 규칙, 차단 가이드 |
| [SOCRadar](https://socradar.io/blog/axios-npm-supply-chain-attack-2026-ciso-guide/) | IOC 타임라인이 포함된 CISO 가이드 |
| [Wiz](https://wiz.io/blog/axios-npm-compromised-in-supply-chain-attack) | 클라우드 영향 분석, 컨테이너 스캐닝 |
| [NVD CVE-2026-48710](https://nvd.nist.gov/vuln/detail/CVE-2026-48710) | **기본** — NVD 정식 항목 (게시일 2026-05-26, CVSS 3.1 기본 점수 6.5 MEDIUM, AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N) |
| [GHSA-86qp-5c8j-p5mr](https://github.com/Kludex/starlette/security/advisories/GHSA-86qp-5c8j-p5mr) | **기본** — `Kludex/starlette`에 대한 GitHub Security Advisory (게시일 2026-05-21): "누락된 Host 헤더 검증으로 인해 request.url.path가 오염되어 경로 기반 보안 검사를 우회합니다." |
| [Starlette v1.0.1 릴리스 노트](https://github.com/Kludex/starlette/releases/tag/1.0.1) | **기본** — 수정 릴리스 (게시일 2026-05-21). `starlette>=1.0.1` (그리고 전이적 해결을 위해 `fastapi>=0.119`) 고정 |
| [Starlette BadHost 보도 (KuCoin)](https://kucoin.com/news/flash/starlette-vulnerability-exposes-millions-of-ai-agents-to-hackers) | 보조 — Python 생태계 영향, AI 에이전트 프레이밍 |
| [BadHost AI 에이전트 분석 (CryptoBriefing)](https://cryptobriefing.com/starlette-badhost-vulnerability-ai-agents/) | 보조 — FastAPI / vLLM / LiteLLM 다운스트림 영향 프레이밍 |
---
## Guild-CLI Devil 통합
만약 [guild-cli](https://github.com/eris-ths/guild-cli)(또는 Devil 렌즈 워크플로우를 노출하는 프로젝트)를 사용한다면, SCG는 리뷰 과정에서 보안 렌즈 중 하나로 호출될 수 있습니다.
### 권장 호출 패턴```bash
# Inside a guild-cli review session, in the project root:
~/path/to/supply-chain-guard/scripts/project-scan.sh # for npm/yarn projects
~/path/to/supply-chain-guard/scripts/project-scan-py.sh # for Python projects
# Capture the scan output as evidence for a judgment:
SCG_OUTPUT=$(~/path/to/supply-chain-guard/scripts/project-scan.sh 2>&1 || true)
# (a) Record it as a new judgment (fast-track — no prior review needed):
gate fast-track --from "$USER" \
--action "SCG supply-chain scan (Devil lense)" \
--reason "$SCG_OUTPUT"
# (b) Or attach it as the Devil lense on an existing review request <id>:
gate review <id> --lense devil --verdict concern --note "$SCG_OUTPUT"
플래그 노트 (guild-cli로 확인):
gate review필수 필요 는 기존<id>,--lense(guild-cli에서는 "lense"로 표기), 그리고--verdict(ok/concern/reject) 가 필요합니다.--area플래그는 없습니다. 검토 객체가 없는 신규 발견 사항을 기록하려면 (a)에서처럼gate fast-track을 사용하세요.
Devil's Advocate ("壊しにいく")와 SCG는 동일한 태도를 공유합니다: 최악을 가정하고, 체계적으로 스캔한 후, 수렴합니다. SCG는 Devil pass의 공급망 차원을 제공합니다 — 프로젝트의 의존성이 사용자 모르게 무엇을 하고 있는지 — 보안/정확성/아키텍처/사용자/운영과 같은 다른 렌즈와 함께 제공됩니다.
respond.sh를 별도로 사용하세요 (명시적 사용자 확인 포함)tail -50을 통해 파이프하세요project-scan.sh와 project-scan-py.sh를 모두 실행하고 결과를 병합하세요SCG는 탐지 도구이지 보안을 보장하지 않습니다. 이 도구가 할 수 있는 것과 없는 것에 대해 솔직하게 밝히는 것이 설계의 일부입니다.
이 소프트웨어는 어떠한 종류의 보증 없이 "있는 그대로" 제공됩니다. Supply Chain Guard를 사용함으로써 귀하는 다음 사항을 인지하고 동의하는 것으로 간주됩니다:
CLEAR 판정은 도구의 알려진 위협 패턴과 일치하는 항목이 발견되지 않았음을 의미합니다. 이는 시스템이나 프로젝트가 손상되지 않았다는 것을 의미하지 않습니다. 새로운, 알려지지 않은, 또는 변형된 공격은 탐지되지 않을 수 있습니다.respond.sh)는 특정 위협의 알려진 지표를 해결합니다. 정교한 손상의 모든 흔적을 완전히 제거하지 못할 수 있습니다. 활성 손상이 의심되는 경우 전문 사고 대응 팀에 문의하십시오.SCG가 할 수 없는 일을 이해하는 것은 할 수 있는 일을 아는 것만큼 중요합니다.
| SCG가 확인하는 항목 | SCG가 확인하지 않는 항목 |
|---|---|
| 알려진 손상된 패키지 버전 (하드코딩된 DB) | 공개 권고가 없는 제로데이 공급망 공격 |
| 알려진 악성 패키지 이름 | 정적 목록에 아직 없는 타이포스쿼팅 |
| 알려진 위협에 대한 특정 IOC 파일 경로 | 비표준 경로에 드롭된 임의의 악성코드 |
| 알려진 C2 IP 주소 및 도메인 | 회전 또는 변경된 C2 인프라 |
직접 의존성의 postinstall 스크립트 | 정상으로 보이는 스크립트 내 난독화된 악성 코드 |
알려진 위협 데이터베이스(SKILL.md의 D.2)는 수동으로 유지 관리됩니다. 실시간 위협 피드와 연결되어 있지 않습니다. 새로운 공급망 사고가 발견된 후 이 데이터베이스가 업데이트될 때까지 지연 시간이 존재합니다.
_L3_CVE_LIST 항목과 엄격한 semver 평가를 통해 일치하는 패키지만 플래그하며, 정확한 버전 일치를 위해 packaging이 설치되어 있어야 합니다.항상 npm advisories, OSV.dev 및 참조 섹션에 나열된 공급업체 보안 블로그와 같은 실시간 소스와 교차 참조하십시오.
다음 IOC 경로는 드물게 합법적인 소프트웨어와 충돌할 수 있습니다:
| IOC 경로 | 잠재적 위양성 |
|---|---|
/tmp/.npm-cache/ | 비표준 구성에서의 합법적인 npm 캐싱 |
/tmp/ld.py | 동일한 파일 이름을 가진 관련 없는 Python 스크립트 |
프로세스 이름 wt.exe | ProgramData에 있는 합법적인 Windows 터미널 |
수정을 실행하기 전에 항상 IOC 결과를 확인하십시오. ioc-scan.sh 스크립트는 사람이 검토할 수 있도록 결과를 보고합니다 — 어떤 조치도 취하지 않습니다. respond.sh 스크립트는 모든 파괴적 작업에 대해 명시적 확인을 요구합니다 (기본값: 아니오). 바로 이러한 위험 때문입니다.
lsof 기반 네트워크 검사는 현재 활성화된 연결만 탐지합니다. 간헐적으로 연결되는 C2 비콘은 스캔 시점에 활성화되지 않을 수 있습니다.SCG 사본이 변조되지 않았는지 확인하십시오. 다음 SHA-256 체크섬을 로컬 파일과 비교하십시오:
```67ac6216cbe18fdf7050fd267bce4157c016e5c60cd4f84f63b8cf71e80ae3b9 scripts/env-scan.sh da01f8362563b55b1553f923a748f07d24f24522366e0545e6ba0c09801f8e54 scripts/project-scan.sh 77e7ebba6d44ea020e511a49bc2cbc974d01495de40d35e8dfb7fcc93008954b scripts/project-scan-py.sh 82aaa4ed898ce354addc064ccf84cca9a498ef4e90fe58613e1110146577609f scripts/ioc-scan.sh 72ed333838b5584c3b1faf889edc81b0e3195c27396c3b36c62aaebf5f952117 scripts/ioc-scan.ps1 0e6b30e57c959180e22e0ba16f860e9fdc7304045947995084703fb14381d12e scripts/respond.sh a44be79d909058c9d216e7cbc5cca736cf8816a492c8d35a6b90c74c042abf5b SKILL.md
<!-- CHECKSUMS-END -->
검증하려면:```bash
shasum -a 256 scripts/*.sh scripts/*.ps1 SKILL.md
참고: 이 체크섬은 최신 릴리스에 해당합니다. 로컬에서 파일을 수정한 경우 체크섬이 달라집니다. SCG가 업데이트되면 이 섹션도 코드 변경과 함께 업데이트됩니다.
제작: Eris — 당신의 의존성이 다른 사람의 공격 표면이 되어서는 안 되기 때문입니다.