Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
safer-dependencies — AI 코딩 어시스턴트를 위한 자동화된 의존성 보안 계층으로, npm, PyPI, RubyGems, Maven, Go 및 Rust 생태계 전반에서 패키지의 CVE, 타이포스쿼트, 유기, 버전 수명 문제 및 해시 무결성을 감사합니다. | Kitploit
도구/GitHubGitHub/robert-auger/safer-dependencies
Vulnerability ScannersDevSecOpsSecret DetectionSupply Chain Security
GitHubrobert-auger/safer-dependencies

safer-dependencies

AI 코딩 어시스턴트를 위한 자동화된 의존성 보안 계층으로, npm, PyPI, RubyGems, Maven, Go 및 Rust 생태계 전반에서 패키지의 CVE, 타이포스쿼트, 유기, 버전 수명 문제 및 해시 무결성을 감사합니다.

저장소 보기
30569일 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

Claude Code용 더 안전한 의존성

Claude와 같은 AI 코딩 어시스턴트가 프로젝트에 패키지를 추가할 때, 알려진 보안 취약점이 있는지, 패키지가 여전히 활발히 유지 관리되는지, 또는 이름이 악성 유사 패키지와 오타 하나 차이인지 확인하지 않고 그럴듯해 보이는 버전을 선택하는 경우가 많습니다.

safer-dependencies는 Claude Code용 보안 계층입니다. Claude와 매니페스트 파일 사이에 위치하여 보안 검사를 자동으로 실행합니다. 취약한 설치가 실행되기 전에 차단되고, 매니페스트에 기록된 위험한 버전은 기록 직후 디스크에서 수정됩니다. npm, PyPI, RubyGems, Maven, Go, Rust, PHP(Composer) 전반에 걸쳐 CVE, 타이포스쿼팅, 유지 관리 중단된 패키지, 버전 노후화 문제, 그리고 새로 출시된 버전에 대한 쿨다운 기간 등 위험한 의존성을 감지하고 수정합니다. 정확히 무엇이 포함되고 포함되지 않는지는 CAPABILITIES.md를 참조하세요.

처음이신가요? GETTING-STARTED.md가 약 5분 만에 설치 완료 상태까지 안내합니다.

보안 및 개인정보: SECURITY.md(취약점 공개), PRIVACY.md(데이터 외부 전송, 텔레메트리 없음), CAPABILITIES.md(도구가 방어하는 것과 방어하지 않는 것)를 참조하세요.

라이선스(소스 공개 — OSI "오픈소스" 아님): 자신의 목적을 위해 무료로 사용 및 수정할 수 있습니다. 영리 목적/회사 내부 사용 및 판매하는 제품 구축을 포함합니다. 별도의 유료 라이선스는 소프트웨어 자체를 수익화하는 경우에 만 필요합니다 — 판매, 판매되는 제품이나 서비스에 포함하여 배포, 또는 유료로 제3자에게 기능 제공(호스팅/SaaS/API 포함). 재배포 및 파생물은 라이선스를 유지하고 이 프로젝트를 출처로 표시해야 합니다. LICENSE 참조(상업적 제한은 섹션 4); 상업용 라이선스 요청은 github.com/robert-auger를 통해.

목차

  • 시작하기 — 약 5분 만에 설치 완료
  • 기능
  • 트리거 조건
  • 이 저장소의 구성
  • 지원 생태계
  • 설치
    • 구성
    • 쿨다운 기간 변경
  • 경고 수준
  • 작동 방식
    • 일반 모드(수동)
    • 차단 모드(자동)
    • 설치 전 모드(Bash 훅)
    • 설치 후 모드(Bash 훅)
    • 에이전트 후 모드(에이전트 훅 쌍)
  • 감사 로그
  • 요구 사항
  • FAQ
  • 시작하기

    **GETTING-STARTED.md**가 약 5분 만에 설치 완료 상태까지 안내합니다 — 사전 요구 사항, 대화형 설치, 검증. 전체 설치 참조(전역/프로젝트/수동 설치, Windows 관련 사항, 권한 허용 목록, 업데이트, 제거)는 **INSTALLATION.md**를 참조하세요.

    일상적인 사용: 훅이 설치되면 실행할 것이 없습니다 — safer-dependencies는 백그라운드에서 자동으로 작동합니다. Claude가 패키지를 추가하거나 설치할 때, 위험한 의존성에 플래그를 지정하고 취약한 버전을 안전한 버전으로 제자리에서 업그레이드하며 — 알려진 취약점이 있는 설치는 실행 전에 차단합니다 — 따라서 안전하지 않은 패키지는 요청하지 않아도 감지되고 수정됩니다. 언제든지 직접 호출할 수도 있습니다: "[email protected]이 안전한가요?", "safer-dependencies 설정 확인", "safer-dependencies 통계 표시".

    기능

    Claude가 프로젝트에 패키지를 추가하려고 할 때, safer-dependencies가 차단하고 5가지 검사를 실행합니다:

    1. 출처 -- 공식 레지스트리, 타이포스쿼팅 감지(npm/PyPI/RubyGems/Maven/crates.io), 패키지 연령
    2. 버전 노후화 -- 7일 이상 전에 게시된 최신 안정 버전을 선택합니다(쿨다운 기간)
    3. 취약점 스캔 -- OSV API, 가능한 경우 생태계 네이티브 도구(npm audit, pip-audit, bundle audit) 사용
    4. 해시 고정 무결성 -- --hash=sha256:... 고정이 있는 PyPI requirements.txt 줄의 경우, 선언된 해시가 PyPI의 게시된 해시와 대조 검증됩니다. 불일치 시 WARNING이 발생합니다
    5. 유지 관리 중단 및 오래된 패키지 -- 알려진 유지 관리 중단 패키지(예: paperclip, request, pycrypto, github.com/dgrijalva/jwt-go)는 대체 패키지 제안과 함께 즉시 하드 차단됩니다. 2년 이상 안정 릴리스가 없는 패키지는 권고 STALE: 경고를 받습니다. 하드 차단된 패키지는 매니페스트에서 제거되고 Claude가 진행 방법을 묻습니다. 오래된 패키지만 있는 경우는 그대로 둡니다.

    문제가 발견되면 Claude가 경고를 발생시키고 더 안전한 버전으로 되돌아갈 수 있습니다. 모든 검사는 ~/.claude/safer-dependencies-audit-YYYY-MM.log에 기록됩니다(월별 파일 하나).

    트리거 조건

    이 스킬은 Claude가 다음 작업을 수행할 때 자동으로 실행됩니다:

    매니페스트 / 설치 작업

    • package.json, requirements.txt, Gemfile, pom.xml, build.gradle, Cargo.toml, go.mod 또는 기타 지원되는 매니페스트에서 패키지를 추가하거나 업데이트
    • 매니페스트에 아직 선언되지 않은 패키지에 대한 import, require 또는 use 작성
    • 잠금 파일 생성 또는 업데이트(새 항목/변경 항목만 검사)
    • Bash를 통한 패키지 관리자 설치 실행(npm install, bundle install, poetry install, uv sync, go mod tidy 등) — 설치 전은 명령 인수를 감사하고, 설치 후는 결과 잠금 파일을 감사
    • 고정된 패키지 관리자 설치 단계가 포함된 Dockerfile 또는 CI 워크플로(.github/workflows/*.yml 등) 작성

    선택 및 추천 질문

    • 라이브러리/프레임워크 비교: "axios와 node-fetch 중 무엇을 사용해야 하나요?", "moment vs dayjs?", "X와 Y 중 어느 것이 더 나은가요?"
    • 추천 요청: "Python용 좋은 HTTP 클라이언트는 무엇인가요?", "Go용 로깅 라이브러리를 추천해 주세요", "Node에서 CSV를 처리하는 패키지는 무엇인가요?"
    • 버전 선택: "어떤 Django 버전을 사용해야 하나요?", "최신 안정 Flask?"

    사용 의도 표현(추가 전)

    • "이 프로젝트에 FastAPI를 사용하고 싶어요", "Celery를 추가할 생각이에요", "ORM으로 Prisma를 검토 중이에요", "Tailwind를 사용하자"

    패키지 상태 및 신뢰 질문

    • "moment.js가 아직 유지 관리되나요?", "이 gem이 아직 활성인가요?", "X가 유지 관리 중단되었나요?", "X가 EOL인가요?", "이 패키지를 신뢰할 수 있나요?", "faker가 마지막으로 업데이트된 것은 언제인가요?"

    스캐폴딩 명령

    • npx create-react-app, npm create vite@latest, django-admin startproject, rails new, cargo new + cargo add, "새 FastAPI 프로젝트 부트스트랩"

    암시적 패키지 추가(새 의존성을 암시하는 기능 요청)

    • "앱에 Redis 캐싱 추가", "Postgres에 연결", "JWT 인증 추가", "이메일 전송 코드 작성" — 해당 기능에 대한 패키지가 매니페스트에 아직 없는 경우 실행됩니다

    마이그레이션 및 포팅

    • "requests에서 httpx로 마이그레이션", "CRA에서 Vite로 이동", "moment에서 date-fns로 포팅" — 새로 도입되는 패키지를 감사합니다

    다음 경우에는 실행되지 않습니다:

    • 표준 라이브러리 임포트(os, fs, java.util.* 등)
    • 변경되지 않는 이미 선언된 의존성
    • 패키지 내부 작동 방식에 대한 학술적 논의("React의 reconciler 설명", "webpack의 모듈 해석이 어떻게 작동하나요?") — 비교 및 선택 질문은 여전히 실행됩니다
    • OS 수준 앱, 런타임 또는 IDE 확장 설치(Python 자체, Docker, Homebrew, VS Code 확장)

    이 저장소의 구성

    이것은 스킬 + 훅 번들이며, 단일 스킬 파일이 아닙니다. 완전한 설치는 다음 구성 요소를 배포합니다:

    파일역할
    skills/safer-dependencies.md스킬(설치 시 SKILL.md). 감사 절차를 설명하고 설치/통계를 위한 관리 모드를 포함합니다.
    skills/safer-dependencies-shim.shPostToolUse:Write/Edit 훅 — 매니페스트 및 잠금 파일 쓰기를 감사하고 취약한 버전을 제자리에서 자동 수정합니다(차단 모드).
    skills/safer-dependencies-pretooluse-bash.shPreToolUse:Bash 훅 — 패키지 관리자 설치 명령의 사전 OSV 감사. 설치가 실행되기 전에 취약한 구체적 고정을 거부합니다(설치 전 모드).
    skills/safer-dependencies-posttooluse-bash.shPostToolUse:Bash 훅 — Bash 명령 후 사후 감사. 새로 작성된 잠금 파일, sed/jq/스크립트로 편집된 매니페스트, 일반 pip install의 해석된 환경에서 전이적 CVE를 포착합니다(설치 후 모드).
    skills/safer-dependencies-pretooluse-agent.sh + skills/safer-dependencies-posttooluse-agent.shPreToolUse:Agent + PostToolUse:Agent 훅 쌍 — 하위 에이전트 커버리지 격차를 해소합니다. 모드 2~4는 루트 세션 도구 호출에만 실행되므로 하위 에이전트가 작성하는 매니페스트는 이를 우회합니다. Post-Agent는 각 Agent 도구 호출이 반환된 후 하위 에이전트가 작성한 내용을 감사합니다(에이전트 후 모드).
    skills/scripts/모든 훅이 사용하는 공유 Python 라이브러리(safedep/) 및 독립 실행형 해석기 스크립트.
    skills/scripts/safer_dependencies_manager.py대화형 설치, 사용 통계 및 설정 검증을 위한 관리 모듈.

    스킬 파일만으로는 충분하지 않습니다 — 훅이 없으면 자동 호출은 Claude가 스킬을 사용하기로 결정하는 데 의존합니다. 전체 커버리지를 위해 다섯 가지 구성 요소를 모두 설치하세요. 많은 스킬과 슬래시 명령이 내부적으로 하위 에이전트를 디스패치하므로, 명시적으로 하위 에이전트를 생성하지 않더라도 Post-Agent 쌍이 중요합니다. (스킬 단독으로 커버리지를 보장할 수 없는 이유는 FAQ.md를 참조하세요.)

    지원 생태계

    생태계매니페스트잠금 파일
    npmpackage.jsonpackage-lock.json, yarn.lock, pnpm-lock.yaml
    PyPIrequirements.txt, pyproject.toml, Pipfile, setup.py, setup.cfgPipfile.lock, poetry.lock, uv.lock
    RubyGemsGemfile, *.gemspecGemfile.lock
    Mavenpom.xml, build.gradle, libs.versions.toml--
    Gogo.modgo.sum
    RustCargo.tomlCargo.lock
    PHP(Composer)composer.jsoncomposer.lock

    설치

    프로젝트가 처음이신가요? **GETTING-STARTED.md**부터 시작하세요. 간단히 요약하면:```bash git clone https://github.com/robert-auger/safer-dependencies /tmp/safer-dependencies python3 /tmp/safer-dependencies/skills/scripts/safer_dependencies_manager.py interactive_install

    root@kitploit:~
    설치 프로그램은 범위(전역 vs 프로젝트)와 활성화할 훅을 묻고, 사용자를 위해 `settings.json`을 작성합니다 — 훅 항목 **및** 스킬의 검사 명령이 감사 때마다 승인 프롬프트 없이 실행되도록 하는 권한 허용 목록 모두를 포함합니다.
    
    설치와 관련된 그 외 모든 것은 **[INSTALLATION.md](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md)** 에 있습니다. 이 문서는 설치 메커니즘의 단일 참조 자료로, 수동 파일별 설치(전역 및 프로젝트 수준), Windows 관련 사항, Post-Agent 훅, [권한 허용 목록](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#permissions-allowlist), 설정 검증, 업데이트, 릴리스 태그 고정, 제거를 다룹니다.
    
    설치 후 일상적인 관리는 Claude에 자연어로 요청하여 수행합니다 — `install safer-dependencies`(재실행/훅 변경), `show safer-dependencies stats`, `check safer-dependencies setup` — 또는 `/safer-dependencies` 메뉴를 사용합니다. 업데이트도 세션 내에서 가능합니다: `/safer-dependencies update`는 최신 릴리스를 적용하며(`update --check`는 사전 점검, `update --rollback`은 되돌리기), 신뢰 모델은 [INSTALLATION.md](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#in-session-self-updater-safer-dependencies-update)를 참조하세요.
    
    > **플랫폼 참고:** macOS, Linux, Windows가 지원됩니다. Windows는 Git for Windows(bash 제공)와 `PATH`에 있는 Python 3이 필요합니다 — WSL은 필요 없습니다. 지금까지의 실사용 테스트는 **macOS와 Windows**에 집중되었습니다; Linux 지원은 자동화된 CI 매트릭스로 검증됩니다.
    
    ### 구성
    
    설치 후 구성할 수 있는 항목은 두 가지입니다:
    
    - **권한 허용 목록** — 스킬의 읽기 전용 검사 명령(정확한 형식의 `npm audit` / `bundle audit` 규칙과 스킬 자체의 리졸버 스크립트)을 사전 승인하여 감사가 매번 승인 프롬프트 없이 실행되도록 합니다; `curl`은 절대 사전 승인되지 않으며, `npm view` / `pip-audit`은 Convenience 프로필을 통해 선택적으로 활성화됩니다. 대화형 설치 프로그램이 핵심 항목을 자동으로 작성하며, 수동 설치는 전체 블록을 직접 추가합니다. 전체 블록과 근거: [INSTALLATION.md → 권한 허용 목록](https://github.com/robert-auger/safer-dependencies/blob/main/INSTALLATION.md#permissions-allowlist).
    - **보안 정책** — 릴리스 연령 쿨다운 기간/모드와 각 검사 유형별 `off`/`warn`/`block` 단계로, `/safer-dependencies config`로 편집하고 `~/.config/safer-dependencies/config.toml`에 저장합니다. 스키마 및 단계 의미론: [`skills/references/configuration.md`](https://github.com/robert-auger/safer-dependencies/blob/main/skills/references/configuration.md).
    
    ### 쿨다운 기간 변경
    
    쿨다운(구성에서는 **cooloff**라고 함)은 스킬이 릴리스를 선택하기 전에 도달해야 하는 최소 연령으로, 기본값은 **7일**입니다. 변경하려면 Claude에게 요청하거나 구성 명령을 직접 실행하세요:```
    /safer-dependencies config set cooloff.days 14     # require releases to be 14+ days old
    /safer-dependencies config set cooloff.mode block  # gate strength: off | warn | block (default: warn)
    /safer-dependencies config unset cooloff.days      # revert to the 7-day default
    /safer-dependencies config                         # show effective values and where each comes from
    

    The same verbs work outside a Claude session:```bash python3 skills/scripts/safer_dependencies_manager.py config set cooloff.days 14

    root@kitploit:~
    설정은 `~/.config/safer-dependencies/config.toml`(`[cooloff]` 섹션)에 유지되며, `SAFE_DEP_COOLOFF_DAYS` 및 `SAFE_DEP_COOLOFF_MODE` 환경 변수가 세션별로 파일을 재정의합니다. 알아야 할 세 가지 동작이 있습니다: `mode = "off"`는 버전 선택에서 연령 필터를 완전히 제거합니다. CVE 기반 재작성은 게이트를 우회하므로 보안 수정이 너무 새롭다는 이유로 보류되지 않습니다. 그리고 게이트는 npm, PyPI, RubyGems 및 crates.io를 포함합니다 — Maven과 Go는 의도적으로 게이트에 포함되지 않습니다. 전체 의미론: [`skills/references/configuration.md`](https://github.com/robert-auger/safer-dependencies/blob/main/skills/references/configuration.md).
    
    ## 경고 수준
    
    | 수준 | 의미 | 예시 |
    |-------|---------|---------|
    | CRITICAL | 중지하고 사용자에게 질문 | 타이포스쿼트 감지, 변조된 서명 |
    | HIGH | 경고 후 진행 | 알려진 CVE, 30일 미만 패키지 |
    | MEDIUM | 경고 후 진행 | 7일 미만 버전, 서명 누락 |
    | LOW | 경고 후 진행 | 서명되지 않은 Ruby gem(예상됨) |
    
    ## 작동 방식
    
    이 스킬은 다섯 가지 모드로 작동합니다(아래 요약; 가장 깊은 설계 근거는 `skills/safer-dependencies.md`에 있습니다):
    
    ### 일반 모드(수동)
    
    Claude가 `import`를 작성하거나, 매니페스트에 패키지를 추가하거나, 잠금 파일을 업데이트하려고 할 때, 스킬이 세션에서 인라인으로 실행됩니다:
    
    1. 패키지 레지스트리에서 안정 버전을 조회합니다
    2. 7일 이상 전에 게시된 최신 버전을 자동 선택합니다(결정적 — LLM 판단 없음)
    3. 생태계 도구와 OSV API를 통해 알려진 취약점을 확인합니다
    4. 가능한 경우 패키지 서명을 검증합니다
    5. 문제가 발견되면 경고를 내보내고 정확한 버전을 고정합니다
    6. 결과를 감사 추적 로그에 기록합니다
    
    버전 선택은 규칙을 해석하는 LLM이 아니라 스킬에 번들된 독립형 Python 스크립트가 처리합니다. 명령은 `SELECTED: <version>`을 출력하며 Claude는 해당 버전을 정확히 사용합니다.
    
    ### 인터셉트 모드(자동)
    
    `.claude/settings.json`에 `PostToolUse` 훅을 구성하여 자동적이고 투명한 패키지 검증을 활성화합니다:
    
    1. Claude가 원래 요청된 버전으로 매니페스트 파일(예: `package.json`)을 작성합니다 — 파일이 디스크에 저장됩니다
    2. `PostToolUse` 훅이 쓰기 완료 직후 실행되어 `safer-dependencies-shim.sh`를 호출합니다
    3. 셰임이 파일을 읽고 선언된 패키지를 파싱한 후 모든 보안 검사(타이포스쿼트, 유지보수 중단, CVE, 오래됨, 해시 고정)를 실행합니다
    4. 수정이 필요한 경우 셰임이 안전한 버전으로 **매니페스트를 제자리에서 재작성**합니다(또는 안전한 버전이 없는 항목을 제거합니다)
    5. 셰임은 stdout의 `hookSpecificOutput.additionalContext`를 통해 신호(`UPDATED:`, `BLOCKED:`, `WARNING:`, `STALE:`, `MAJOR-UPDATE-CONFIRM:`, `REFACTOR-REQUIRED:`, `REGRESSION:`, `TYPOSQUAT-CONFIRM:`, `VERIFY:`, `CLEAN:`)를 내보냅니다. 감사 로그에 동일한(파일, 패키지)이 이전에 동일한 안전 대상으로 수정된 기록이 표시되면 `REGRESSION:`이 `MAJOR-UPDATE-CONFIRM:`보다 먼저 옵니다 — 즉, 하위 에이전트나 오래된 계획이 알려진 취약 버전을 다시 도입한 것이며, 오케스트레이터는 주요 버전 업그레이드를 다시 결정하는 대신 이전에 승인된 버전을 복원해야 합니다.
    6. Claude는 해당 신호를 시스템 알림으로 수신하고 후속 작업(영향받는 import 찾기, 테스트 실행, 호환성 깨지는 변경 사항에 대한 리팩터링)을 수행합니다
    
    **설계 참고 — Shape C(쓰기 후 수정):** 훅은 쓰기를 차단하지 않습니다. 각 취약 버전이 먼저 디스크에 저장된 후 동일한 도구 사용 주기 내에서 자동 수정됩니다. 이는 `PreToolUse` 차단 설계보다 의도적으로 선택된 방식입니다 — 절충점은 [FAQ.md](https://github.com/robert-auger/safer-dependencies/blob/main/FAQ.md#why-posttooluse-post-write-corrective-instead-of-pretooluse-pre-write-blocking-for-the-manifest-path)를 참조하세요.
    
    **신호 예시:**```
    UPDATED: aiohttp 3.8.5 → 3.9.0 (HIGH: 33 CVEs fixed)
    

    상위 에이전트는 이러한 신호를 사용하여 영향을 받는 코드를 식별하고 필요에 따라 리팩터링합니다.

    사전 설치 모드 (Bash 훅)

    .claude/settings.json에 PreToolUse:Bash 훅을 구성하여 패키지 관리자 설치 명령에 대한 사전 점검 감사를 활성화합니다. 이는 인터셉트 모드를 보완하며(대체하지 않음) 함께 계층형 방어를 구성합니다.

    1. Claude가 Bash 도구 호출을 시도합니다(예: npm install [email protected])
    2. 호출이 실행되기 전에 PreToolUse 훅이 실행되어 safer-dependencies-pretooluse-bash.sh를 호출합니다
    3. 순수 bash 기반 조기 필터가 약 115ms 내에 패키지 관리자 명령이 아닌 것을 차단합니다(Python 호출 없음). 따라서 git status / ls / npm test는 핫 경로에서 무시할 수 있는 비용만 부담합니다
    4. 인식된 패키지 관리자 설치(npm/pnpm/yarn의 install/i/add)의 경우 헬퍼가 shlex로 토큰화하고 각 pkg@version 인수를 추출한 다음 OSV에 POST합니다
    5. 취약한 구체적 핀(pin)이 발견되면 훅은 발견 항목별 GHSA-ID + CVSS + 요약과 함께 permissionDecision: "deny"를 반환하고 safer-dependencies 스킬을 호출하라는 힌트를 제공합니다
    6. 설치가 실행되지 않습니다 — 네트워크 가져오기 없음, postinstall 스크립트 없음

    인터셉트 모드 외에 이 기능이 존재하는 이유: 쓰기 후 심(shim)은 Bash를 인식하지 못합니다. npm install [email protected]은 감사가 실행되기 전에 완료까지 실행되고(postinstall 스크립트도 실행됨) npm install -g typosquat-pkg는 프로젝트 매니페스트를 전혀 작성하지 않습니다. 사전 설치 모드는 이러한 공백을 구조적으로 메웁니다.

    사전 설치 모드는 사용자가 입력한 내용(명령줄의 pkg@version 인수)만 볼 수 있습니다. 리졸버가 실제로 설치할 전이적 트리는 볼 수 없습니다. 사후 설치 모드(아래)는 설치가 완료되면 잠금 파일을 감사합니다 — 두 모드는 중복이 아니라 상호 보완적입니다.

    범위: 여기서 다루는 패키지 관리자 CLI는 5개 생태계(npm/pnpm/yarn/bun/npx/deno, pip/pip3/pipx/pipenv/uv/uvx/poetry, gem/bundle, go, cargo)를 포괄하며, Maven은 인터셉트 모드를 통해 처리됩니다(Maven 종속성은 일반적으로 CLI 동사가 아닌 pom.xml/build.gradle에 선언됩니다).

    알려진 공백: Maven CLI는 mvn dependency:get -Dartifact=group:art:version 및 mvn dependency:copy를 통한 직접 다운로드를 지원합니다. 이 훅은 아직 이러한 호출을 인식하지 못합니다. 이를 정기적으로 사용하는 경우 기존 쓰기 후 심이 매니페스트에 기록되는 모든 것을 계속 포착하지만, 사전 가져오기 보호는 위에 나열된 생태계에만 적용됩니다. 후속 작업으로 추적됩니다.

    인식되는 생태계별 구문:

    PM동사구체적 핀 구문
    npm, pnpm, yarn, buninstall, i, add (및 yarn/pnpm dlx, bun x, yarn create)[email protected], @scope/[email protected]
    npx(동사 없음 — 패키지가 첫 번째 위치 인수)[email protected]
    denoadd, installnpm:[email protected] (npm 접두사 사양)
    pip, pip3, pipx, pipenv, uv, uvx, poetryinstall (pip/pip3/pipx/pipenv) / add (uv/poetry) / 동사 없음 (uvx)pkg==1.2.3 (extras pkg[extra]==X도 처리됨)
    gem, bundleinstall (gem) / add-v 1.2.3, --version 1.2.3, --version=1.2.3 (별도 플래그)
    goget, install[email protected] (Go 모듈 규칙에 따라 v 접두사 필수)
    cargoadd, install[email protected]

    범위 핀(npm ^4.17, pip >=, poetry ^/~, Go @latest) 및 버전 미지정은 설치 후 인터셉트 모드로 전달됩니다 — 쓰기 후 심이 리졸버가 선택한 항목을 감사합니다. 안전한 버전으로의 자동 재작성은 후속 작업으로 예약되어 있습니다.

    실패 모드: 실패 시 열림(fail-open). 모든 오류(Python 누락, 네트워크 일시 장애, 잘못된 입력)는 출력 없이 0으로 종료되어 bash가 계속 진행되도록 합니다. 인터셉트 모드는 설치 후에도 계속 실행되므로 사전 점검 실패 시 기존 보호 기능으로 원활하게 전환됩니다.

    거부 예시:``` safer-dependencies pre-flight audit blocked this install. Vulnerable pinned version(s) detected:

    • [email protected] → GHSA-35jh-r3h4-6jhm (CVSS:7.4): Command Injection in lodash Re-run with a patched version, or invoke the safer-dependencies skill for a recommended pin.
    root@kitploit:~
    ### 설치 후 모드 (Bash 훅)
    
    `.claude/settings.json`에 `PostToolUse:Bash` 훅을 구성하여 Bash 명령 실행 후
    사후 감사를 활성화하세요. 이 훅은 명령의 `cwd`를 대상으로 **세 가지 독립적인 스캔**을
    수행하며, 각 스캔은 다른 훅이 처리하지 못하는 공백을 메웁니다:
    
    - **스캔 A — 잠금 파일.** 성공적인 설치 동사(`npm install`,
      `bundle install`, `poetry install`, `uv sync`, `go mod tidy` 등) 이후,
      새로 수정된 잠금 파일(`package-lock.json`, `Gemfile.lock`,
      `poetry.lock`, `uv.lock`, `go.sum`, `yarn.lock`, `pnpm-lock.yaml`,
      `Pipfile.lock`)을 감사합니다. 이는 Pre-Install이 볼 수 없는
      **전이적 CVE 공백**을 메웁니다: 사용자가 `pkg@version`을 입력했지만,
      리졸버가 아무도 명명하지 않은 수십 개의 전이적 의존성을 끌어들였을 수 있습니다.
    - **스캔 B — 매니페스트.** 읽기 전용 차단 목록(`ls`, `cat`, `git status`, …)에
      *없는* Bash 명령 이후, 새로 수정된 매니페스트를 감사합니다.
      이는 `sed -i`, `jq` 또는 스크립트를 통해 이루어진 매니페스트 편집에 대한
      **유일한** 폴백입니다 — 이러한 편집은 Intercept Mode가 훅하는
      `Write`/`Edit` 도구를 우회합니다.
    - **스캔 C — 해석된 환경.** 일반 `pip install` /
      `pip install -r requirements.txt`는 잠금 파일을 작성하지 않으므로 스캔 A는
      해석된 트리를 볼 수 없습니다. pip 형태의 설치 이후, 스캔 C는 동일한
      pip을 읽기 전용 `list --format=json`으로 다시 호출하고 전체 해석된
      환경(직접 + 전이적)을 OSV 검사합니다.
    
    스캔 실행 방식:
    
    1. Claude가 Bash 도구 호출을 실행합니다
    2. `PostToolUse` 훅이 명령 완료 *후에* 실행되어
       `safer-dependencies-posttooluse-bash.sh`를 호출합니다
    3. 순수 Bash 조기 필터가 ~115ms 내에 스캔 게이트와 일치하지 않는 명령을
       단락시킵니다(Pre-Install과 동일한 고속 경로 규칙), 따라서 `ls` / `git` / `cat`은
       무시할 수 있는 비용만 부담합니다
    4. 각 스캔은 `find -maxdepth 5`로 `cwd`를 탐색하여(모노레포 레이아웃 포함;
       `node_modules`, `.git`, `.venv`, `venv` 제외) 지난 60초 내에 수정된 파일을
       찾습니다 — `SAFE_DEP_POSTINSTALL_MTIME_WINDOW`로 재정의 가능
    5. 새로 수정된 각 파일(스캔 A/B)에 대해 훅은 합성
       `PostToolUse:Write` 페이로드를 생성하여 기존 심(shim)으로 파이프합니다 —
       심의 잠금 파일 및 매니페스트 감사기는 변경 없이 실행되며, 중복 로직이 없습니다
    6. 파일별 신호가 연결되어 하나의 `hookSpecificOutput`
       JSON으로 상위 에이전트에 전달됩니다
    
    **Pre-Install이 놓치는 것을 잡아냅니다:** 전이적 취약점.
    깔끔해 보이는 `bundle install`이 `sinatra`의 전이적 의존성으로
    `[email protected]`(CVE-2025-27610)을 끌어들일 수 있습니다 — 사용자는 `rack`을
    입력한 적이 없으므로 Pre-Install은 이를 볼 수 없지만, Post-Install은 해석된
    `Gemfile.lock`을 읽고 CVE를 보고합니다.
    
    **범위:** 스캔 A는 해석된 버전을 재작성하지 않습니다 — 자동 수정
    계약은 Claude가 직접 작성한 매니페스트에만 적용됩니다. 전이적 CVE의 경우,
    수정 방법은 일반적으로 "전이적 의존성을 소유한 직접 의존성을 업데이트"하는 것이며,
    이는 인간의 판단이 필요합니다. 스캔 B는 Intercept Mode와 동일한 심 경로를 통해
    매니페스트를 감사하므로 *자동 수정을 수행합니다*. 스캔 A는
    `transitive` 검사 계층이 `off`로 설정된 경우(`config set checks.transitive off`)
    건너뜁니다.
    
    **실패 모드:** 다른 훅과 동일하게 fail-open입니다. 모든 오류(심 누락,
    잘못된 페이로드, Python 사용 불가)는 0으로 조용히 종료됩니다.
    
    **WARNING 예시:**```
    WARNING: [email protected] in lock file has GHSA-29mw-wpgm-hmr9, GHSA-35jh-r3h4-6jhm
    

    Post-Agent 모드 (Agent 훅 쌍)

    위의 네 가지 모드는 루트 세션 도구 호출에만 적용됩니다. 루트 세션이 하위 에이전트를 파견할 때(Agent 도구를 통해 — 많은 스킬과 슬래시 명령이 내부적으로 이 작업을 수행합니다), 하위 에이전트의 Write/Edit/Bash 호출은 이 모든 모드를 우회합니다. Post-Agent 모드는 이러한 공백에 대한 반응형 안전망입니다.

    1. PreToolUse:Agent 훅(safer-dependencies-pretooluse-agent.sh)이 각 Agent 파견 직전에 실행되어 /tmp/.safer-deps-agent-<PPID>-<session_id>.sentinel에 센티널 파일을 생성합니다(세션 ID를 사용할 수 없을 때는 PPID만 사용하는 이름으로 대체)
    2. 하위 에이전트가 실행되며 매니페스트 또는 잠금 파일을 작성할 수 있습니다
    3. PostToolUse:Agent 훅(safer-dependencies-posttooluse-agent.sh)이 Agent 호출이 반환된 후 실행되어, 센티널보다 최신인 모든 매니페스트와 잠금 파일을 find로 찾아 동일한 shim 경로를 통해 각각을 감사합니다
    4. 발견 사항은 루트 세션의 다음 턴에 additionalContext로 표시되며, 센티널은 제거됩니다

    중첩된 하위 에이전트는 자동으로 처리됩니다 — 루트의 PostToolUse:Agent 훅은 외부 에이전트의 모든 작업(자체가 파견한 모든 것을 포함)이 디스크에 기록된 후에만 실행됩니다. 유일한 공백은 매니페스트나 잠금 파일을 작성하지 않는 전역 설치(npm install -g …)입니다: 스캔할 대상이 없습니다. 다른 훅과 마찬가지로 실패 시 열림(fail open) 방식입니다 — 모든 오류(센티널 누락, shim 누락, 읽을 수 없는 페이로드)는 조용히 0으로 종료됩니다. 전체 설계 근거는 skills/safer-dependencies.md에 있습니다.

    감사 로그

    모든 검사는 ~/.claude/safer-dependencies-audit-YYYY-MM.log에 기록됩니다(달력 월별 파일 하나, YYYY-MM은 UTC 연도-월) — 단일 JSON 줄로 기록됩니다. 전체 경로를 SAFE_DEP_AUDIT_LOG 환경 변수로 재정의할 수 있습니다(설정 시 날짜 접미사는 추가되지 않습니다). 파일은 SAFE_DEP_LOG_MAX_BYTES(기본값 10 MiB, 0으로 설정하면 비활성화)를 초과할 때 크기 순환됩니다. SAFE_DEP_MODEL을 설정하여 각 항목의 source.model에 기록되는 모델 값을 재정의할 수 있습니다 — 모델 버전 간 A/B 비교에 유용합니다.

    다섯 가지 모드 모두 동일한 파일에 추가됩니다. 각 항목은 어떤 구성 요소가 기록했는지 식별하는 source 블록(스키마 2.2)을 포함합니다:

    source.component작성 주체트리거
    shim.posttooluseshim.sh매니페스트 또는 잠금 파일 쓰기(인터셉트 모드, 설치 후 파견)
    shim.install_errorshim.shshim 사전 점검 설치 실패
    bash.pretoolusepretooluse-bash.shBash 설치 명령(사전 설치 모드)
    bash.posttooluseposttooluse-bash.shPost-Install Bash 훅 자체가 shim에 도달하기 전에 실패 시 열림(fail-open)될 때
    agent.pretoolusepretooluse-agent.shPre-Agent 실패 시 열림 이벤트용 예약(훅 자체는 현재 성공 시 조용함)
    agent.posttooluseposttooluse-agent.shPost-Agent 훅 실패 시 열림 이벤트(예: shim 누락, python_missing)
    manual.skillNormal Mode로 실행 중인 Claude수동 감사 인라인 호출

    source.model은 세션에서 활성화된 Claude Code 모델(예: "claude-sonnet-4-6")을 기록합니다. 스키마 2.1+에 존재하며, 이전 설치로 작성된 항목은 이 필드를 생략합니다. stats 명령은 해당 필드가 없을 때 "unknown"으로 정상적으로 처리합니다.

    jq로 source.component별 필터링:```bash jq -r '.source.component' audit.log | sort | uniq -c | sort -rn jq -c 'select(.source.component == "bash.pretooluse")' audit.log

    Surface every silent fail-open across all hooks:

    jq -c 'select(.source.mode == "fail_open") | {component: .source.component, reason: .fail_open.reason, ts}' audit.log

    root@kitploit:~
    분석을 더 쉽게 하려면 로그를 수동으로 파싱하는 대신 Claude에게 사용 통계를 요청하세요:```
    "Show safer-dependencies stats for the last month"
    

    이 감사 로그에서 추출한 활동, 보안 영향 및 성능 지표에 대한 사람이 읽을 수 있는 요약을 제공합니다.

    항목 형태(스키마 2.2). 동일한 ts / schema / source 헤더를 공유하는 세 가지 서로 다른 형태가 있습니다:

    형태기록되는 시점구분 필드
    감사 항목매니페스트 / 잠금 파일 / bash 설치 감사file, ecosystem, checked, findings, abandoned, stale, typosquat, unknown, signatures, notes, clean
    설치 오류 항목Shim 사전 설치 오류(구성 요소 shim.install_error)install_error, shim_dir, scripts_dir
    Fail-open 항목helper_missing / shim_missing / python_missing으로 인해 모든 후크 진입점이 조기 종료됨. source.mode는 "fail_open"fail_open: { reason, detail? }

    감사 항목: 인터셉트 모드는 전체 파이프라인(출처, 버전 연식, OSV, abandoned/stale, typosquat, 서명)을 실행하므로 모든 배열이 채워질 수 있습니다. 사전 설치 모드는 현재 OSV만 실행하므로 abandoned / stale / typosquat / signatures는 항상 비어 있습니다. 설치 후 디스패치(잠금 파일 감사)는 shim.posttooluse 아래에 기록되며, findings는 잠금 파일 감사자의 WARNING: 문자열로 채워집니다. notes 배열은 정보성 NOTE: 신호(예: 매니페스트가 고정되지 않아 건너뜀)를 전달합니다.

    스키마 2.2는 잠금 파일 감사 항목에 네 가지 필드를 추가적으로(비파괴적으로) 추가했습니다: lockfile, manifest_ref, relation_summary(플래그된 각 패키지를 형제 매니페스트에 대해 직접/전이/알 수 없음으로 분류) 및 적용 중인 transitive 계층을 기록하는 policy 블록. 이 변경은 하위 호환됩니다: 2.1 항목의 읽는 쪽은 새 필드를 허용하며, source.model 필드는 2.1부터 계속 존재합니다.```json { "ts": "2026-04-19T12:34:56Z", "schema": "2.2", "source": { "component": "shim.posttooluse", "script": "shim.sh", "hook": "PostToolUse:Write", "tool": "Write", "mode": "intercept", "model": "claude-sonnet-4-6" }, "file": "/path/to/project/package.json", "ecosystem": "npm", "checked": ["[email protected]", "[email protected]"], "findings": ["UPDATED: express 4.18.2 → 4.22.1 (HIGH: 1 CVE fixed)"], "abandoned": [], "stale": [], "typosquat": [], "unknown": [], "signatures": [], "notes": [], "clean": ["[email protected]"] }

    root@kitploit:~
    Pre-Install 모드 예시(Bash 후크, 취약한 핀 거부됨):```json
    {
      "ts": "2026-04-23T06:56:21Z",
      "schema": "2.2",
      "source": {
        "component": "bash.pretooluse",
        "script": "pretooluse-bash.sh",
        "hook": "PreToolUse:Bash",
        "tool": "Bash",
        "mode": "intercept",
        "model": "claude-sonnet-4-6"
      },
      "file": "bash:npm install [email protected] [email protected]",
      "ecosystem": "npm",
      "checked": ["[email protected]", "[email protected]"],
      "findings": [
        "BLOCKED: [email protected] GHSA-35jh-r3h4-6jhm (CVSS:3.1/...): Command Injection in lodash"
      ],
      "abandoned": [],
      "stale": [],
      "typosquat": [],
      "unknown": [],
      "signatures": [],
      "notes": [],
      "clean": ["[email protected]"]
    }
    

    Fail-open 모드 예시(인접한 shim 없이 호출되는 설치 후 Bash 훅 — 손상된 설치):```json { "ts": "2026-05-03T07:14:11Z", "schema": "2.2", "source": { "component": "bash.posttooluse", "script": "safer-dependencies-posttooluse-bash.sh", "hook": "PostToolUse", "tool": "Bash", "mode": "fail_open", "model": "claude-sonnet-4-6" }, "fail_open": { "reason": "shim_missing", "detail": "/home/alice/.claude/skills/safer-dependencies" } }

    root@kitploit:~
    A fail-open 항목은 "이 훅이 실행되었지만 필수 전제 조건이 누락되어 감사 없이 조기 종료되었다"는 의미입니다. 위의 jq 필터(`select(.source.mode == "fail_open")`)를 사용하여 로그에서 모든 무음 보호 손실 이벤트를 표시하세요.
    
    shim이 드라이런 모드(`SAFE_DEP_DRY_RUN=1`)로 실행되면 항목에는 `"mode": "dry_run"`도 포함되므로 사후 분석에서 감사 전용 호출을 필터링할 수 있습니다.
    
    ## 요구 사항
    
    - Python 3.9+ (훅이 이를 감지하며 이전 인터프리터에서는 fail-open 처리됨)
    - `curl` (레지스트리 API 호출 및 OSV 취약점 검사용)
    - 에코시스템 도구(선택 사항, 누락 시 스킬이 OSV API로 대체됨):
      - npm 패키지용 `npm`
      - Python 패키지용 `pip-audit`
      - Ruby 패키지용 `bundle`
      - Java 패키지용 `dependency-check`
    
    ## FAQ
    
    설계 결정 근거(`PreToolUse` 대신 `PostToolUse`를 사용하는 이유, 서명이 검증되지 않는 이유, 스크립트와 shim이 중복되는 이유, 스킬 로딩 문제 등)는 [`FAQ.md`](https://github.com/robert-auger/safer-dependencies/blob/main/FAQ.md)에 문서화되어 있습니다.
    
    도구 다운로드