
ship-safe v9.7.5
AI가 작성한 소프트웨어를 위한 독립형 보안 에이전트. 문제를 찾아내고, 그것이 실제인지 조사하며, 증거를 보여줍니다. 결정론적 코어, API 키 불필요, JSON 및 SARIF 출력.
AI가 작성한 소프트웨어를 위한 독립형 보안 에이전트. 문제를 찾아내고, 그것이 실제인지 조사하며, 증거를 보여줍니다.
웹사이트 · 문서 · 보안 및 데이터 흐름 · 벤치마크 · 가격 · 블로그 · 기여하기
Ship Safe CLI
Ship Safe는 저장소에서 로컬로 실행되며 두 계층으로 동작합니다.
결정적 엔진은 애플리케이션 코드, AI 에이전트, MCP 구성, 프롬프트, 의존성, CI/CD, 시크릿, 클라우드 인접 구성을 아우르며 문제를 찾아냅니다. 빠르고 반복 가능하며 벤치마크된 — 이것이 센서 계층입니다.
그다음 조사 계층이 발견의 가치를 판단합니다. 싱크에 도달하는 값을 추적하고, 규칙이 누락되었다고 말하는 제어를 프로젝트에서 검색하며, 단일 파일에는 담기지 않은 구성 전반에 걸쳐 공격 체인을 구축하고 — 요청하면 — 유출된 키를 해당 제공자에 대해 검증합니다. 모든 결론에는 그것에 도달한 패스와 읽은 줄이 함께 제공됩니다:
CONFIRMED — traced end to end (10)
NoSQL Injection via $where [high]
app/data/allocations-dao.js:78 NOSQL_INJECTION_WHERE
why: threshold is assigned from the HTTP request and reaches the sink without validation on that path.
decided by: dataflow
1. value reaches NOSQL_INJECTION_WHERE here app/data/allocations-dao.js:78
2. getByUserIdAndThreshold is called here with threshold app/routes/allocations.js:23
3. threshold is assigned here app/routes/allocations.js:20
fix: Replace $where with standard MongoDB operators ($eq, $gt, $regex, etc.)
OWASP NodeGoat에 대해 ship-safe investigate를 실행한 실제 출력입니다. 오염된 값은 라우트 파일에서 구조 분해되고 세 디렉터리 떨어진 DAO로 전달됩니다.
다음 한 가지 명령으로 시작하세요:
npx ship-safe
가입이 필요 없습니다. 스캔에 API 키가 필요하지 않습니다. 핵심 검사는 오프라인에서 작동합니다. AI 기반 레드팀 모드는 사용 가능한 경우 구성된 제공자를 사용합니다.
--no-ai를 사용하면 완전히 로컬 스캔을 보장합니다. 제공자 기반 분류, 심층 분석, GPT-Red는 최선의 자격 증명 마스킹 후 제한된 컨텍스트를 선택한 제공자에게 직접 전송합니다. 정확한 경계와 컨텍스트 제한은 Security & Data Flow를 참조하세요.
Quick Start
# Interactive REPL: scan, fix, and ask questions in one session
npx ship-safe
# Full audit: secrets + 30 agents + deps + remediation plan
npx ship-safe audit .
# Investigate: confirmed / likely / unresolved / refuted, with the evidence
npx ship-safe investigate .
npx ship-safe investigate . --all # also detail unresolved and refuted
npx ship-safe investigate . --verify # probe leaked keys against their providers
# Before you open an unfamiliar folder with an agent: what runs on open?
npx ship-safe trust ~/Downloads/take-home
npx ship-safe trust . --json
# What can an AI agent working in this repo actually reach?
npx ship-safe capabilities .
# AI agent red-team scenarios for agent-readable content
npx ship-safe red-team . --gpt-red
# Interactive fix agent: plan, diff, approve, verify the path closed
npx ship-safe agent .
npx ship-safe agent . --severity critical # critical findings only
npx ship-safe agent . --branch --pr # fix on a branch + open a PR
# Undo the last fix
npx ship-safe undo
# CI/CD mode — fails on any critical finding
npx ship-safe ci . --sarif results.sarif
npx ship-safe ci . --fail-on high # stricter: critical or high
# Gate on evidence instead of severity: block only what was established
npx ship-safe ci . --fail-on-verdict confirmed
npx ship-safe ci . --ignore-refuted # do not block on what was argued away
For pull requests, compare a trusted base scan with the head scan so existing repository debt remains visible without blocking unrelated changes:
# On the trusted base revision
npx ship-safe ci . --fail-on none --no-deps \
--write-baseline-report /tmp/ship-safe-base.json
# On the pull request head
npx ship-safe ci . --base-report /tmp/ship-safe-base.json --fail-on high
기본 아티팩트에는 해시된 발견 항목 식별자, 상대 경로, 규칙 메타데이터가 포함됩니다. 원시 매칭된 시크릿은 저장하지 않습니다. PR 결과는 발견 항목을 도입됨, 해결됨, 변경 없음, 불확실로 분류하며, 모호한 매칭은 표시되지만 풀 리퀘스트를 차단하지 않습니다.
Ship Safe가 찾는 것
| 영역 | 예시 |
|---|---|
| AI 및 LLM 보안 | 프롬프트 인젝션, 에이전트 하이재킹, 과도한 권한, 메모리 포이즈닝, RAG 포이즈닝, 안전하지 않은 도구 호출 |
| MCP 및 에이전트 구성 | 과도하게 넓은 도구 권한, 오염된 레지스트리, 신뢰할 수 없는 전송, 위험한 허용 목록 |
| 애플리케이션 보안 | SQL/NoSQL 인젝션, XSS, SSRF, 인증 우회, 경로 순회, 안전하지 않은 API 라우트 |
| 시크릿 및 컴플라이언스 | API 키, 토큰, 자격 증명, PII, git 히스토리에 유출된 시크릿 |
| 공급망 | 타이포스쿼팅, 의존성 혼동, 위험한 설치 스크립트, 버전이 고정되지 않은 AI 액션 |
| CI/CD | 파이프라인 포이즈닝, 버전이 고정되지 않은 GitHub Actions, 시크릿 로깅, 안전하지 않은 워크플로 트리거 |
작동 방식
- 로컬에서 스캔 - Ship Safe는 대상 에이전트로 저장소를 검사하고 적용되지 않는 검사는 건너뜁니다.
- 각 발견 항목 조사 - 별도의 패스가 그것이 실제인지 판단하며, 더 저렴한 패스가 더 비싼 패스를 뒤집지 못하도록 순위가 매겨집니다: 추적된 데이터 경로는 같은 파일에 대한 모델의 판독보다 우선하고, 인증된 프로브는 둘 모두보다 우선합니다.
- 증거 읽기 - 발견 항목은 확인됨, 가능성 높음, 미해결, 반박됨으로 귀결되며, 각각 결론을 도출한 줄을 인용하므로 심각도 레이블 대신 단계에 이의를 제기할 수 있습니다.
- 통제하며 수정 - 에이전트는 계획과 diff를 제안하고, 쓰기 전에 묻고, 결과를 검증하며, 변경을 되돌릴 수 있게 유지합니다.
- CI에서 게이트 -
ship-safe ci를 사용하여 위험한 빌드를 실패시키고 SARIF를 GitHub 코드 스캐닝에 업로드합니다.
"그냥 내 코딩 에이전트에게 저장소를 리뷰해 달라고 하면 안 되나요?"
그럴 수 있고, 그래야 합니다. 실제 문제를 찾아낼 것입니다. 하지만 그것이 자신의 작업에 대해 구조적으로 답할 수 없는 세 가지 질문이 있습니다.
이 코드를 작성한 에이전트가 자기 숙제를 스스로 채점한 건 아닌가? 작성자에게 작성자가 실수했는지 묻는 것은 리뷰가 아닙니다. Ship Safe는 별도의 방법을 가진 별도의 리뷰어이며, 공개적으로 자기 자신과 의견이 갈립니다 — 데이터 흐름 추적은 휴리스틱 패스를 뒤집고, 라이브 프로브는 둘 모두를 뒤집습니다.
도달할 수 있는 것을 볼 수 있는가? 저장소를 리뷰하는 코딩 에이전트는 MCP 서버 구성을 읽을 수 없고, 자신이 실행된 권한을 열거할 수 없으며, 바로 그 도달 범위가 문제시되는 행위자입니다. ship-safe capabilities는 이 모든 것을 외부에서 읽고, 따로 보면 별것 아니지만 함께 있으면 위험한 조합을 보고합니다:
CRITICAL Repository-controlled instructions reach an unattended write capability
1. CLAUDE.md is read as instructions and can be changed by anyone who lands a commit
CLAUDE.md:1
2. Claude Code runs without per-action approval
.claude/settings.json:2
3. shell execute granted: Bash(git push:*)
.claude/settings.json:3
4. filesystem write granted: Write
.claude/settings.json:3
5. mcp-tool write granted: mcp__github__create_pull_request
.claude/settings.json:3
Impact: Text committed to this repository can direct the agent to write files
or run commands with no human in the loop.
Boundary: Require approval for write and execute tools during sessions on
untrusted branches, or remove the pre-granted entries.
각 줄은 그 자체로는 특별할 게 없다. 하지만 함께 모이면 풀 리퀘스트에서 권한 있는 쓰기로 이어지는 경로가 되며, 단일 파일 검토로는 이를 볼 수 없다. 어떤 단일 파일도 그 경로를 담고 있지 않기 때문이다.