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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
ContextHound — LLM 프롬프트 인젝션, 데이터 유출, 탈옥(jailbreak), 안전하지 않은 에이전트/도구 취약점을 코드베이스에서 스캔하는 정적 분석 CLI입니다. 완전히 오프라인으로 실행되며, CI/CD와 통합되고, 콘솔, JSON, SARIF 보고서를 출력합니다. | Kitploit
도구/GitHubGitHub/iulianvostrut/contexthound
Static AnalysisVulnerability ScannersCode AnalysisData ExfiltrationDevSecOpsSecret DetectionSupply Chain SecurityLearning & EducationAI Security
GitHubiulianvostrut/contexthound

ContextHound

LLM 프롬프트 인젝션, 데이터 유출, 탈옥(jailbreak), 안전하지 않은 에이전트/도구 취약점을 코드베이스에서 스캔하는 정적 분석 CLI입니다. 완전히 오프라인으로 실행되며, CI/CD와 통합되고, 콘솔, JSON, SARIF 보고서를 출력합니다.

22개월 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
저장소 보기웹사이트

ContextHound

LLM 기반 애플리케이션의 코드베이스에서 프롬프트 인젝션 및 멀티모달 보안 취약점을 스캔하는 정적 분석 도구입니다. 오프라인으로 실행되며 API 호출이 필요하지 않습니다.

CI npm Node.js TypeScript License: MIT


ContextHound 생태계

ContextHound는 개발 및 브라우징 워크플로 전반에서 사용할 수 있습니다:

도구기능설치 방법
CLI / npm 패키지코드베이스에서 프롬프트 인젝션 취약점을 스캔합니다. GitHub Actions와 통합되며 SARIF, JSON, HTML 등으로 출력합니다.npm install -g context-hound
VS Code 확장코드 작성 중 인라인 결과 표시, 코드 액션, 출력 채널, 상태 표시줄 제공.VS Code Marketplace
브라우저 확장모든 AI 채팅 인터페이스에서 실시간 스캔 알약, LLM API 트래픽용 DevTools 패널, 팝업 스캐너. Chrome 및 Firefox 지원.Firefox: 무료 설치 · Chrome: 검토 대기 중 · 소스 코드

☕ 프로젝트 지원

ko-fi "Buy Me A Coffee"


ContextHound가 필요한 이유

LLM 기반 애플리케이션이 프로덕션 코드베이스에서 보편화됨에 따라 프롬프트 인젝션은 가장 악용 가능성이 높은 공격 표면 중 하나로 부상했습니다. 대부분의 보안 스캐너는 이를 인식하지 못합니다.

ContextHound는 프롬프트 계층에 정적 분석을 도입합니다:

  • 인젝션 경로가 모델에 도달하기 전에 포착
  • 프롬프트에 포함된 유출된 자격 증명 및 내부 인프라 식별
  • 시스템 프롬프트에서 탈옥에 취약한 표현 탐지
  • 무기화될 수 있는 제약 없는 에이전트 도구 사용 확인
  • RAG 코퍼스 중독 및 검색된 콘텐츠가 시스템 명령어로 주입되는 사례 탐지
  • 인코딩 기반 밀수 (문자열 필터를 우회하는 Base64 명령어) 포착
  • 안전하지 않은 LLM 출력 소비: 스키마 검증 없는 JSON 및 정화 없는 Markdown 식별
  • 멀티모달 공격 표면 탐지: 사용자 제공 이미지 URL을 비전 API로 전달, 비전 메시지 파일 읽기를 통한 경로 순회, 프롬프트로 주입되는 전사 출력, 시스템 명령어에 주입되는 OCR 텍스트
  • 에이전트 위험 식별: 무제한 에이전트 루프, 검증되지 않은 메모리 쓰기, 계획 인젝션, 시스템 프롬프트 내용을 수신하는 도구 매개변수
  • 우수한 보안 관행 보상: 프롬프트에 완화 조치가 포함되면 점수 감소

CLI 명령어, npm 스크립트 또는 GitHub Action으로 기존 워크플로에 통합할 수 있으며, 외부 종속성이 전혀 없습니다.


기능


설치

전역 설치 — hound 명령어를 PATH에 추가합니다:```bash npm install -g context-hound

root@kitploit:~
**프로젝트별 설치** — 하나의 저장소에 범위가 지정됨, `npx hound` 또는 npm 스크립트를 통해 실행됨:```bash
npm install --save-dev context-hound

제로 설치 — 설치가 필요 없으며, 캐시된 npm 레지스트리 사본을 사용합니다:```bash npx context-hound scan --dir .

root@kitploit:~
## 빠른 시작```bash
# Scaffold a config file
hound init

# Scan your project
hound scan --dir ./my-ai-project

# Or via npm script (scans current directory)
npm run hound

# Verbose output, shows remediations and confidence levels
hound scan --verbose

# Fail the build on any critical finding
hound scan --fail-on critical

# Export JSON and SARIF reports
hound scan --format console,json,sarif --out results

# GitHub Annotations (for CI step summaries)
hound scan --format github-annotations

# Markdown report with findings tables
hound scan --format markdown --out report

# Stream findings as JSONL (one JSON object per line)
hound scan --format jsonl | jq '.severity'

# List all rules
hound scan --list-rules

# Explain a rule (or a rule family by prefix)
hound explain INJ-001
hound explain PST --format json

# Fast PR gate — scan only files changed vs. origin/main
hound scan --diff

# Interactive HTML report (self-contained, open in browser)
hound scan --format html --out report

# Re-scan on file changes
hound scan --watch

# Parallel scanning (default is 8; tune for your machine)
hound scan --concurrency 16

# Disable incremental cache for a clean run
hound scan --no-cache

# Baseline mode — only report findings new since the last saved scan
hound scan --format json --out baseline          # save a baseline
hound scan --baseline baseline.json             # compare future scans against it

# Load a custom rule from a local plugin file
hound scan  # plugin declared in .contexthoundrc.json "plugins" field

# Only run high-confidence rules
hound scan --config .contexthoundrc.json  # set minConfidence: "high"

# Fail if any single file scores >= 40
hound scan --fail-file-threshold 40

종료 코드:

코드의미

GitHub Actions

워크플로우에 추가하여 프롬프트 위험이 너무 높을 때 병합을 차단하세요:```yaml

.github/workflows/context-hound.yml

name: Prompt Audit

on: [push, pull_request]

jobs: hound: runs-on: ubuntu-latest permissions: contents: read security-events: write

root@kitploit:~
steps:
  - uses: actions/checkout@v4

  - uses: actions/setup-node@v4
    with:
      node-version: '20'

  - run: npm install -g context-hound

  - run: hound scan --format console,sarif,github-annotations --out results.sarif

  - name: Upload to GitHub Code Scanning
    if: always()
    uses: github/codeql-action/upload-sarif@v3
    with:
      sarif_file: results.sarif
root@kitploit:~
발견 사항은 저장소의 **보안 > 코드 스캔** 탭에 표시됩니다. `github-annotations` 형식은 인라인 PR 댓글을 게시하고 GitHub 단계 요약에 요약 테이블을 작성합니다.

---

## 구성

`hound init`을 실행하여 `.contexthoundrc.json`을 스캐폴드하거나, 수동으로 생성하세요:```json
{
  "include": ["**/*.ts", "**/*.js", "**/*.py", "**/*.go", "**/*.rs", "**/*.md", "**/*.txt", "**/*.yaml"],
  "exclude": [
    "**/node_modules/**",
    "**/dist/**",
    "**/tests/**",
    "**/attacks/**"
  ],
  "threshold": 60,
  "formats": ["console", "sarif"],
  "out": "results",
  "verbose": false,
  "failOn": "critical",
  "maxFindings": 50,
  "excludeRules": ["JBK-002"],
  "includeRules": [],
  "minConfidence": "medium",
  "failFileThreshold": 80,
  "concurrency": 8,
  "cache": true,
  "plugins": ["./rules/my-custom-rule.js"],
  "baseline": "./baseline.json"
}

환경 변수 오버라이드

모든 주요 설정은 설정 파일을 편집하지 않고 런타임에 오버라이드할 수 있습니다:

.houndignore

프로젝트 루트에 .houndignore 파일을 배치하여 .contexthoundrc.json을 편집하지 않고 제외 패턴을 추가할 수 있습니다. 동일한 글로브 구문을 따르며, #으로 시작하는 줄은 주석입니다.

인라인 억제

알려진 오탐을 소스에서 직접 무음 처리합니다 — 저장소 전체에서 규칙을 비활성화할 필요가 없습니다. 지시문은 모든 파일 형식에서 인식됩니다(주변 주석 구문은 중요하지 않음):```ts // hound-disable-next-line INJ-001 -- userInput is a validated enum const prompt = Summarise the ${userInput} report;

const cmd = run(${shell}); // hound-disable-line CMD-001

// hound-disable RAG-007 -- trusted internal corpus only context.push(doc.metadata.title); context.push(doc.metadata.author); // hound-enable RAG-007

root@kitploit:~
- `hound-disable-line [RULE...]` — 같은 줄에서 발견 항목을 억제합니다
- `hound-disable-next-line [RULE...]` — 다음 줄에서 발견 항목을 억제합니다
- `hound-disable [RULE...]` … `hound-enable [RULE...]` — 블록을 억제합니다 (파일 끝에서 자동 종료)
- 규칙 ID를 생략하면 해당 위치에서 **모든** 규칙을 억제합니다; 하나 이상을 (공백/쉼표로 구분) 나열하여 범위를 지정합니다
- `--` 뒤의 텍스트는 자유 형식의 설명이며, 보고서에 표시됩니다

`--report-unused-suppressions`와 함께 실행하여 더 이상 발견 항목과 일치하지 않는 지시문을 나열하면, 사용하지 않는 억제 항목을 정리할 수 있습니다:```bash
hound scan --report-unused-suppressions

규칙 사전 설정

ID를 나열하는 대신 --preset을 사용하여 선별된 규칙 하위 집합을 활성화합니다. 사전 설정은 이미 있는 includeRules와 결합되며, 여러 개를 조합할 수 있습니다:```bash hound scan --preset owasp-llm-top10 hound scan --preset mcp,agentic hound scan --list-presets # show all presets and their rule patterns

root@kitploit:~
| Preset | Rules |
|--------|-------|
| `owasp-llm-top10` | INJ, JBK, EXF, OUT, RAG, TOOL, SCH, DOS, VIS |
| `injection` | INJ, RAG, ENC |
| `jailbreak` | JBK |
| `exfiltration` | EXF |
| `agentic` | AGT, MCP, TOOL |
| `mcp` | MCP |
| `supply-chain` | SCH |
| `prompt-files` | INJ, JBK, EXF, ENC, SKL |

### pre-commit 훅

ContextHound는 [pre-commit](https://pre-commit.com) 훅을 제공합니다. 다음을 `.pre-commit-config.yaml`에 추가하세요:```yaml
repos:
  - repo: https://github.com/IulianVOStrut/ContextHound
    rev: v2.0.0
    hooks:
      - id: contexthound
        # optional — scan only changed files and fail on high-severity findings:
        # args: ["--diff", "HEAD", "--fail-on", "high"]

사용자 정의 규칙 플러그인

Rule 또는 Rule[]를 내보내는 모든 .js 파일은 플러그인으로 로드될 수 있습니다:```js // my-rule.js module.exports = { id: 'CUSTOM-001', title: 'Proprietary data pattern in prompt', severity: 'high', confidence: 'high', category: 'injection', remediation: 'Remove internal identifiers from prompts.', check(prompt) { if (prompt.text.includes('INTERNAL_PATTERN')) { return [{ evidence: 'INTERNAL_PATTERN', lineStart: 1, lineEnd: 1 }]; } return []; }, };

root@kitploit:~
`.contexthoundrc.json`에서 참조하십시오:```json
{ "plugins": ["./my-rule.js"] }

플러그인 규칙은 기본 제공 규칙과 동일한 excludeRules, includeRules 및 minConfidence 필터의 적용을 받습니다.

Baseline / diff mode

초기 스캔 후 기준(baseline)을 저장한 후, 이후 스캔에서 새로운 발견 사항만 보고하도록 합니다:```bash

Save baseline

hound scan --format json --out baseline

Future scans only report new issues

hound scan --baseline baseline.json

root@kitploit:~
결과는 `ruleId + file`로 매칭되며 — 줄 변경이 잘못된 새 결과 알림을 발생시키지 않습니다.

### 변경된 파일만 (`--diff`)

빠른 풀 리퀘스트 게이트를 위해, 전체 트리 대신 git ref에 대해 변경된 파일만 스캔합니다:```bash
hound scan --diff               # vs. origin/main (default)
hound scan --diff main          # vs. a named branch
hound scan --diff HEAD~5        # vs. an arbitrary ref

커밋된 파일, 스테이징된 파일, 스테이징되지 않은 파일, 그리고 무시되지 않은 추적되지 않은 파일을 다룹니다. git을 사용할 수 없거나 참조를 확인할 수 없는 경우(예: 얕은 CI 클론), ContextHound는 경고를 출력하고 조용히 통과하는 대신 전체 스캔으로 대체합니다. --baseline과 함께 사용하면 결과 수준의 diff를 확인하거나, --diff만 사용하여 가장 빠른 PR 피드백을 얻을 수 있습니다.


위험 점수

각 결과는 다음과 같이 계산된 위험 점수를 가집니다:``` risk_points = severity_weight × confidence_multiplier

root@kitploit:~
점수는 합산되어 최대 100점으로 제한되며 다음과 같이 분류됩니다:

| 점수 | 수준 | 권장 조치 |
|-------|-------|-----------------|
| 0-29 | 🟢 낮음 | 조치 불필요 |
| 30-59 | 🟡 중간 | 병합 전 검토 |
| 60-79 | 🟠 높음 | 병합 전 수정 |
| 80-100 | 🔴 심각함 | 배포 차단 |

프롬프트에 명시적인 안전 언어(입력 구분자, 공개 거부 지침, 도구 허용 목록)가 포함된 경우, 해당 프롬프트에 대한 위험 점수가 비례적으로 감소됩니다.

---

## 규칙

### A. 인젝션 (INJ)

| ID | 심각도 | 설명 |
|----|----------|-------------|
| INJ-001 | 높음 | 구분자 없이 직접 사용자 입력이 프롬프트에 연결됨 |
| INJ-002 | 중간 | "사용자 콘텐츠를 데이터로 처리"하는 경계 언어 누락 |
| INJ-003 | 높음 | 신뢰할 수 없는 구분자 없이 RAG/검색된 컨텍스트 포함됨 |
| INJ-004 | 높음 | 사용자 콘텐츠로 도구 사용 지침을 재정의할 수 있음 |
| INJ-005 | 높음 | 직렬화된 사용자 객체(`JSON.stringify`)가 프롬프트 템플릿에 직접 삽입됨 |
| INJ-006 | 중간 | 사용자 제어 콘텐츠에 숨겨진 명령 동사를 포함하는 HTML 주석 |
| INJ-007 | 중간 | 먼저 백틱을 제거하지 않고 사용자 입력이 코드 펜스 구분자로 래핑됨 |
| INJ-008 | 높음 | HTTP 요청 데이터(`req.body`, `req.query`, `req.params`)가 `role: "system"` 템플릿 문자열에 삽입됨 |
| INJ-009 | 심각함 | HTTP 요청 본문이 메시지 배열로 직접 파싱됨 - 공격자가 역할과 콘텐츠를 제어함 |
| INJ-010 | 높음 | 신뢰할 수 없는 입력 연결로 구축된 일반 텍스트 역할 레이블 대화(User:, Assistant:, system:) |
| INJ-011 | 높음 | 브라우저 DOM 또는 URL 소스(`window.location`, `document.cookie`, `getElementById`)가 LLM 호출에 직접 제공됨 |
| INJ-012 | 높음 | 대화 기록이 살균 없이 메시지 배열에 전파됨 |
| INJ-013 | 높음 | 도구/함수 호출 결과가 살균 없이 메시지에 삽입됨 |
| INJ-014 | 높음 | LLM 완료가 사용자 역할 콘텐츠로 파이프되어 후속 LLM 호출에 사용됨 |
| INJ-015 | 높음 | 신뢰할 수 없는 외부 입력(HTTP/CLI/DOM)이 프롬프트로 흐름 - 이름에 구애받지 않는 **오염 분석**, 별칭을 따르고 살균기를 존중함 |

### B. 유출 (EXF)

| ID | 심각도 | 설명 |
|----|----------|-------------|
| EXF-001 | 심각함 | 프롬프트가 비밀, API 키 또는 자격 증명을 참조함 |
| EXF-002 | 심각함 | 프롬프트가 모델에게 시스템 프롬프트 또는 숨겨진 지침을 공개하도록 지시함 |
| EXF-003 | 높음 | 프롬프트가 기밀 또는 개인 데이터에 대한 접근을 나타냄 |
| EXF-004 | 높음 | 프롬프트에 내부 URL 또는 인프라 호스트 이름이 포함됨 |
| EXF-005 | 높음 | 민감한 변수(토큰, 비밀번호, 키)가 출력에 Base64로 인코딩됨 |
| EXF-006 | 높음 | 전체 프롬프트 또는 메시지 배열이 수정 없이 `console.log` / `logger.*`를 통해 기록됨 |
| EXF-007 | 심각함 | "절대 공개하지 마십시오" 지침과 함께 실제 비밀 값이 프롬프트에 포함됨 |

### C. 탈옥 (JBK)

| ID | 심각도 | 설명 |
|----|----------|-------------|
| JBK-001 | 심각함 | 알려진 탈옥 구문 감지됨("지침 무시", "DAN" 등) |
| JBK-002 | 높음 | 취약한 안전 표현("항상 준수", "어떤 경우에도") |
| JBK-003 | 높음 | 안전 제약 조건을 약화시키는 역할극 탈출구 |
| JBK-004 | 높음 | 에이전트가 확인이나 인간 검토 없이 행동하도록 지시됨("자동으로 진행", "확인 불필요") |
| JBK-005 | 높음 | 증거 삭제 또는 흔적 은폐 지침("로그 삭제", "흔적 남기지 않음") |
| JBK-006 | 높음 | 정책 적법성 프레이밍과 안전하지 않은 작업 요청 결합("침투 테스터로서 권한 상승") |
| JBK-007 | 높음 | 모델 신원 스푸핑 — 다른 AI 모델이라고 주장하며 안전 우회 지시 결합 |
| JBK-008 | 높음 | 프롬프트 압축 공격 — 시스템 프롬프트를 압축하거나 요약하도록 지시 |
| JBK-009 | 높음 | 중첩 명령어 인젝션 — "안전/무해한 요약/번역" 프레이밍으로 래핑된 명령형 명령 |

### D. 안전하지 않은 도구 사용 (TOOL)

| ID | 심각도 | 설명 |
|----|----------|-------------|
| TOOL-001 | 심각함 | 제한 없는 도구 실행("모든 명령 실행", "모든 곳 탐색", 백틱 쉘 대체) |
| TOOL-002 | 중간 | 허용 목록이나 사용 정책 없이 설명된 도구 사용 |
| TOOL-003 | 높음 | 샌드박싱 제약 조건 없이 언급된 코드 실행 |
| TOOL-004 | 심각함 | 사용자 제어 변수에서 가져온 도구 설명 또는 스키마 필드 |
| TOOL-005 | 심각함 | 사용자 제어 입력(`req.body`, `req.query` 등)에서 가져온 도구 `name` 또는 엔드포인트 `url` |

### E. 명령어 인젝션 (CMD)

AI 도구를 둘러싼 코드에서 취약한 패턴을 감지합니다. 여기서 성공적인 프롬프트 인젝션이 전체 명령 실행으로 확대될 수 있습니다. Cyera Research Labs(2025)가 Google Gemini CLI에서 발견한 실제 CVE에서 정보를 얻었습니다.

| ID | 심각도 | 설명 |
|----|----------|-------------|
| CMD-001 | 심각함 | 살균되지 않은 변수 보간으로 빌드된 셸 명령 — JS/TS (`execSync(\`cmd ${var}\``), Python (`subprocess.run(f"cmd {var}")`), PHP (`shell_exec($var)`), Go (`exec.Command` + `fmt.Sprintf`), Rust (`Command::new` + `format!`) |
| CMD-002 | 높음 | 불완전한 명령 대체 필터링: `$()`는 차단하지만 백틱은 차단하지 않거나 그 반대 |
| CMD-003 | 높음 | `glob.sync` 또는 `readdirSync`의 파일 경로가 살균 없이 셸 명령에 직접 사용됨 |
| CMD-004 | 심각함 | Python `subprocess.run`/`subprocess.call`이 `shell=True` 및 변수 또는 f-문자열 명령 인수로 호출됨 |
| CMD-005 | 심각함 | PHP `shell_exec`, `system`, `passthru`, `exec` 또는 `popen`이 `$variable` 인수로 호출됨 |

### F. RAG 포이즈닝 (RAG)

검색 또는 수집된 콘텐츠가 시스템 수준 지침을 재정의할 수 있는 Retrieval-Augmented Generation 파이프라인의 아키텍처적 실수를 감지합니다.

| ID | 심각도 | 설명 |
|----|----------|-------------|
| RAG-001 | 높음 | 검색 또는 외부 콘텐츠가 메시지 배열에서 `role: "system"`에 할당됨 |
| RAG-002 | 높음 | 지침과 유사한 구문("system prompt:", "always return", "never redact")이 문서 수집 루프 내에서 감지됨 |
| RAG-003 | 높음 | 에이전트 메모리 저장소가 검증 없이 사용자 제어 입력에서 직접 기록됨 |
| RAG-004 | 중간 | 프롬프트가 모델에게 검색된 컨텍스트를 최우선으로 처리하고 개발자 지침을 재정의하도록 지시함 |
| RAG-005 | 중간 | 출처 없는 검색 — 출처 메타데이터 확인 없이 청크가 프롬프트에 삽입됨 |
| RAG-006 | 높음 | 프롬프트에 들어가기 전에 ACL 또는 신뢰 계층 필터가 적용되지 않음 |

### G. 인코딩 (ENC)

Base64 또는 유사한 인코딩을 사용하여 문자열 기반 필터를 우회하는 인코딩 기반 인젝션 및 회피 기술을 감지합니다.

| ID | 심각도 | 설명 |
|----|----------|-------------|
| ENC-001 | 중간 | 프롬프트 구성 근처에서 사용자 제어 변수에 대해 `atob`, `btoa` 또는 `Buffer.from(x, 'base64')`가 호출됨 |
| ENC-002 | 높음 | 지침 키워드 근처에서 숨겨진 유니코드 제어 문자(제로 너비 공백, 양방향 재정의) 감지됨 |

### H. 출력 처리 (OUT)

LLM 파이프라인의 출력 측면을 다룹니다. 즉, 애플리케이션이 모델 응답을 소비하는 방식입니다. 안전하지 않은 소비는 프롬프트 인젝션 페이로드를 애플리케이션 수준 익스플로잇으로 전환할 수 있습니다.

| ID | 심각도 | 설명 |
|----|----------|-------------|
| OUT-001 | 심각함 | 스키마 검증(Zod, AJV, Joi, Pydantic, Marshmallow 등) 없이 LLM 출력에서 `JSON.parse()` (JS/TS) 또는 `json.loads()` (Python) 호출 |
| OUT-002 | 심각함 | LLM이 생성한 Markdown 또는 HTML이 DOMPurify 또는 동등한 살균기 없이 렌더링됨 |
| OUT-003 | 심각함 | LLM 출력이 `exec()`, `eval()` 또는 `db.query()`의 인수로 직접 사용됨 |
| OUT-004 | 심각함 | Python `eval()` 또는 `exec()`가 LLM 생성 출력을 인수로 호출됨 |

### I. 멀티모달 (VIS)

비전, 오디오/비디오 및 OCR 파이프라인에 특정한 신뢰 경계 위반을 다룹니다. 멀티모달 입력은 새로운 인젝션 벡터입니다. 이미지 URL, 오디오 파일 또는 스캔된 문서를 제어하는 공격자는 이 규칙의 패턴을 사용하여 모델에 지침을 밀반입할 수 있습니다.

| ID | 심각도 | 설명 |
|----|----------|-------------|
| VIS-001 | 심각함 | 도메인 또는 MIME 검증 없이 사용자 제공 이미지 URL 또는 base64 데이터가 비전 API(gpt-4o, Claude 3, Gemini Vision)로 전달됨 |
| VIS-002 | 심각함 | 비전 API 메시지도 빌드하는 파일에서 사용자 제어 경로로 `fs.readFile`/`readFileSync` 호출 — 멀티모달 입력으로의 경로 탐색 |
| VIS-003 | 높음 | 오디오/비디오 전사 출력(Whisper, AssemblyAI, Deepgram 등)이 살균 없이 프롬프트 메시지에 직접 공급됨 — 오디오 소스를 통한 RAG 포이즈닝 |
| VIS-004 | 높음 | OCR 출력(Tesseract, Google Vision)이 `role: "system"` 메시지 또는 시스템 프롬프트 변수에 삽입됨 |

### J. 기술 마켓플레이스 (SKL) — v1.1

OpenClaw `SKILL.md` 파일 및 `skills/` 디렉토리 내의 모든 마크다운 파일을 대상으로 합니다. 자체 작성 공격, 원격 기술 로딩, 삽입된 지침, 안전하지 않은 명령 디스패치, 민감한 경로 접근, 권한 상승 주장 및 YAML 머리말의 하드코딩된 자격 증명에 대해 작동합니다.

| ID | 심각도 | 설명 |
|----|----------|-------------|
| SKL-001 | 심각함 | 기술 본문이 에이전트에게 다른 기술 파일을 쓰거나 수정하도록 지시함 — 에이전트 재시작에도 지속되는 자체 작성 공격 |
| SKL-002 | 심각함 | 기술 본문이 에이전트에게 외부 URL에서 기술을 가져오거나 로드하도록 지시함 — 설치 후 공격자가 기술 동작을 변경할 수 있음 |
| SKL-003 | 심각함 | 기술 본문이 에이전트 핵심 지침을 대상으로 하는 프롬프트 인젝션 구문 포함("이전 지침 무시", "이제 제한 없음" 등) |
| SKL-004 | 높음 | 기술 머리말이 `command-arg-mode: raw`와 함께 `command-dispatch: tool`을 사용함 — 모델 안전 추론을 우회하여 원시 사용자 입력을 도구로 전달 |
| SKL-005 | 높음 | 기술 본문이 민감한 파일 시스템 경로(`~/.ssh`, `~/.env`, `/etc/passwd`, `../../`)를 참조하여 에이전트가 읽고 잠재적으로 유출하도록 함 |
| SKL-006 | 높음 | 기술 본문이 상승된 권한을 주장하거나 에이전트에게 다른 설치된 기술을 재정의하거나 비활성화하도록 지시함 |
| SKL-007 | 심각함 | YAML 머리말에서 하드코딩된 자격 증명 값(API 키, 토큰, 비밀번호) 발견됨 — 기술을 받거나 설치하는 모든 사람에게 노출됨 |
| SKL-008 | 심각함 | 하트비트 C2 — 기술이 주기적인 원격 가져오기를 예약하여 깨끗한 설치 후 자체 지침을 자동으로 덮어씀 |
| SKL-009 | 심각함 | 에이전트 신원 부인 — 기술이 에이전트에게 AI임을 부인하고, 인간이라고 주장하거나, 기만적인 페르소나를 채택하도록 지시함 |
| SKL-010 | 심각함 | 안티 스캐너 회피 — 기술에 보안 감사 도구를 오도하도록 명시적으로 설계된 텍스트 포함됨 |
| SKL-011 | 심각함 | SOUL.md / IDENTITY.md 지속성 — 기술이 제거 후에도 유지되는 에이전트 신원 파일에 지침을 기록함 |
| SKL-012 | 높음 | 자체 전파 웜 — 기술이 에이전트에게 도달 가능한 호스트로 SSH 또는 `curl\|bash`를 통해 확산하도록 지시함 |
| SKL-013 | 높음 | 자율 금융 거래 — 기술이 거래당 사용자 확인 없이 암호화폐 거래를 실행하거나 개인 키를 보유함 |

> **OpenClaw 기술 스캔:** `npx hound scan --dir ./skills`를 실행하거나 `include` 구성에 `**/skills/**/*.md` 및 `**/SKILL.md`를 추가하십시오. ContextHound는 다중 라인 규칙 분석을 위해 기술 파일을 자동으로 `code-block`으로 내보냅니다.

### K. 에이전틱 (AGT) — v1.3 / v1.9

다중 단계 에이전트 시스템에 특정한 위험을 대상으로 합니다: 무제한 실행 루프, 검증되지 않은 메모리 쓰기, 에이전트 계획으로의 사용자 입력 누출, 에이전트 간 신뢰 경계 위반 및 OWASP Agentic AI Security Issues (ASI) 격차.

| ID | 심각도 | 설명 |
|----|----------|-------------|
| AGT-001 | 심각함 | 도구 호출 매개변수가 시스템 프롬프트 콘텐츠를 수신함 — `tool_call`/`function_call` 인수 값에 `system:` 또는 `instructions:` 필드 내용 포함 |
| AGT-002 | 높음 | 반복 또는 시간 초과 가드가 없는 에이전트 루프 — 에이전트 구성 또는 코드에 `max_iterations`, `max_steps`, `max_turns`, `timeout` 또는 `recursion_limit` 없음 |
| AGT-003 | 높음 | 검증되지 않은 LLM 출력에서 에이전트 메모리 기록됨 — `memory.save()`, `memory.add()` 또는 `vectorstore.upsert()`가 원시 모델 응답 변수로 호출됨 |
| AGT-004 | 높음 | 계획 인젝션 — 사용자 입력이 신뢰 경계 래퍼 없이 에이전트 계획, 작업 또는 목표 프롬프트에 직접 삽입됨 |
| AGT-005 | 심각함 | 에이전트가 암호화 검증 없이 주장된 신원을 신뢰함 — HMAC, JWT 또는 공유 비밀 확인 없이 `agentId`, `sender`, `source` 또는 `from_agent` 필드를 기반으로 한 신뢰 결정 |
| AGT-006 | 높음 | 다른 에이전트의 출력이 검증 없이 다른 에이전트의 입력으로 연결됨 — `.run()`, `.invoke()` 또는 `.generate()`가 다른 에이전트의 `.output`/`.content`/`.result`를 직접 인수로 호출됨 |
| AGT-007 | 심각함 | 에이전트 자체 수정 — 에이전트가 런타임에 LLM 생성 콘텐츠로 자체 `system_prompt`, `instructions` 또는 `tools` 목록을 다시 작성함 |
| AGT-008 | 심각함 | ASI03 — 에이전트가 LLM 출력에서 파생된 값으로 `assumeRole`, `grantAccess` 또는 `setPermissions`를 호출함. 프롬프트 인젝션을 통한 권한 상승 |
| AGT-009 | 높음 | ASI04 — 에이전트가 변수 경로 또는 동적 가져오기에서 런타임에 도구 또는 플러그인을 로드하여 공급망 대체를 가능하게 함 |
| AGT-010 | 높음 | ASI07 — HMAC, JWT 서명 또는 스키마 검증 없이 `send`/`route`/`dispatch`를 통해 원시 에이전트 출력이 다른 에이전트로 전달됨 |
| AGT-011 | 높음 | ASI08 — 에이전트 계획 단계 오류가 자동으로 포착됨(재발생 없음, 오류 상태 플래그 없음). 하류 단계가 잘못되었거나 불완전한 상태로 진행됨 |

### L. MCP 보안 (MCP) — v1.7 / v1.8

Model Context Protocol에 특정한 신뢰 경계 및 공급망 위험을 다룹니다. MCP는 새로운 공격 표면을 도입합니다: 도구 설명, 전송 URL, 이벤트 페이로드 및 교차 서버 공유 상태는 모두 인젝션 또는 권한 상승 페이로드를 전달할 수 있습니다.

| ID | 심각도 | 설명 |
|----|----------|-------------|
| MCP-001 | 심각함 | MCP 도구 설명이 살균 없이 LLM 프롬프트에 삽입됨 — `role: "system"` 또는 `messages.push()`에 사용된 `tool.description` 값 |
| MCP-002 | 높음 | MCP 도구가 동적 이름 또는 설명으로 등록됨 — `server.tool()` 첫 번째 인수가 변수 또는 템플릿 리터럴로, 승인 후 러그풀 공격을 가능하게 함 |
| MCP-003 | 높음 | 인간 승인 가드 없는 MCP sampling/createMessage 핸들러 — `requireHumanApproval`, `confirm` 또는 `approve` 확인 없이 `setRequestHandler(CreateMessageRequestSchema)` 설정됨 |
| MCP-004 | 중간 | 변수로 구성된 MCP 전송 URL — 정적 문자열 대신 `new URL(variable)`로 초기화된 `SSEClientTransport` 또는 `WebSocketClientTransport` |
| MCP-005 | 높음 | MCP stdio 전송이 `shell: true`를 사용함 — 인수가 사용자 제어인 경우 명령 문자열이 셸 보간 가능하고 인젝션 가능하게 만듦 |
| MCP-006 | 심각함 | MCP 혼동된 대리자 — MCP 요청의 인증 토큰이 재검증 없이 다운스트림 API로 전달됨. `Authorization` 헤더 값이 `request.params`, `context` 또는 `event`에서 직접 가져옴 |
| MCP-007 | 높음 | 교차 MCP 컨텍스트 포이즈닝 — 해시, 서명 또는 출처 확인 없이 MCP 출력에서 공유/전역 컨텍스트 저장소가 기록됨 |
| MCP-008 | 높음 | 변수 경로에서 로드된 MCP stdio 전송 명령 — `StdioClientTransport`/`StdioServerTransport` `command:` 필드가 정적 문자열 리터럴이 아닌 변수 |
| MCP-009 | 높음 | 만료 확인 없이 인증 결정으로 사용된 MCP 세션 ID — TTL, `expiresAt` 또는 `isExpired` 가드 없이 `sessionId`/`connectionId` 동등성 비교(재생 공격) |
| MCP-010 | 심각함 | 살균 없이 LLM 컨텍스트에 주입된 MCP 전송 이벤트 페이로드 — `messages.push()` 또는 `content:` 필드에 직접 사용된 이벤트/메시지 `.data`, `.content` 또는 `.payload` |

---

## 예제 출력```
=== ContextHound Prompt Audit ===

src/prompts/assistant.ts (file score: 73)
  [HIGH] INJ-001: Direct user input concatenation without delimiter
    File: src/prompts/assistant.ts:12
    Evidence: Answer the user's question: ${userInput}
    Confidence: medium
    Risk points: 23
    Remediation: Wrap user input with clear delimiters (e.g., triple backticks)
                 and label it as "untrusted user content".

  [CRITICAL] EXF-001: Prompt references secrets, API keys, or credentials
    File: src/prompts/assistant.ts:8
    Evidence: The database password is: secret123.
    Confidence: high
    Risk points: 50
    Remediation: Remove all secret values from prompts. Use environment
                 variables server-side; never embed credentials in prompt text.

────────────────────────────────────────────────────────
Repo Risk Score: 87/100 (CRITICAL)
Threshold: 60
Total findings: 5
By severity: critical: 2  high: 2  medium: 1

✗ FAILED - score meets or exceeds threshold.

프로젝트 구조```

src/ ├── cli.ts # CLI entry point (Commander.js) ├── types.ts # Shared TypeScript types ├── config/ │ ├── defaults.ts # Default include/exclude globs and settings │ └── loader.ts # .contexthoundrc.json loader + env var overrides ├── scanner/ │ ├── discover.ts # File discovery via fast-glob │ ├── extractor.ts # Prompt extraction (raw, code, structured) │ ├── languages.ts # LLM API trigger patterns per language extension │ ├── cache.ts # Incremental scan cache (.hound-cache.json) │ └── pipeline.ts # Orchestrates the full scan; parallel + cache + plugins ├── rules/ │ ├── types.ts # Rule interface and scoring helpers │ ├── injection.ts # INJ-* rules │ ├── exfiltration.ts # EXF-* rules │ ├── jailbreak.ts # JBK-* rules │ ├── unsafeTools.ts # TOOL-* rules │ ├── commandInjection.ts # CMD-* rules │ ├── rag.ts # RAG-* rules │ ├── encoding.ts # ENC-* rules │ ├── outputHandling.ts # OUT-* rules │ ├── multimodal.ts # VIS-* rules │ ├── skills.ts # SKL-* rules │ ├── agentic.ts # AGT-* rules │ ├── mcp.ts # MCP-* rules │ ├── supplyChain.ts # SCH-* rules │ ├── dos.ts # DOS-* rules │ ├── mitigation.ts # Mitigation presence detection │ └── index.ts # Rule registry ├── runtime/ │ ├── index.ts # createGuard() — runtime message inspection API │ ├── inspect.ts # Core inspection logic for live message arrays │ └── types.ts # RuntimeMessage, InspectResult, GuardConfig types ├── scoring/ │ └── index.ts # Risk score calculation and rule filtering └── report/ ├── console.ts # ANSI-coloured terminal output ├── json.ts # JSON report builder ├── sarif.ts # SARIF 2.1.0 report builder ├── githubAnnotations.ts# GitHub Actions annotation formatter ├── markdown.ts # Markdown report with findings tables ├── jsonl.ts # JSONL streaming formatter └── html.ts # Self-contained interactive HTML report attacks/ # Example injection strings (not executed against models) tests/ ├── fixtures/ # Sample prompts for testing ├── rules.test.ts # Unit tests for all rules ├── scoring.test.ts # Unit tests for scoring logic ├── scanner.test.ts # Integration tests for the scan pipeline ├── extractor.test.ts # Unit tests for prompt extraction ├── formatters.test.ts # Unit tests for all report formatters ├── mitigation.test.ts # Unit tests for mitigation detection └── cli.test.ts # CLI integration tests (init, list-rules, exit codes) .github/ ├── action.yml # Reusable composite GitHub Action └── workflows/ └── context-hound.yml # CI workflow

root@kitploit:~
---

## Benchmark

ContextHound는 거짓 양성 및 탐지율을 측정하기 위한 레이블이 지정된 벤치마크 데이터셋을 제공합니다. 빌드 후 실행하세요:```bash
npm run benchmark

벤치마크는 두 개의 픽스처 디렉터리를 스캔합니다:

DirectoryPurpose
benchmarks/safe/실제 안전 패턴이 포함된 5개의 파일 — 0개의 결과 예상
benchmarks/unsafe/실제 취약점이 포함된 8개의 파일 — 각각 하나의 규칙

v1.4.0 결과:``` File-level FP rate: 0.0% (0 / 5 safe files produced findings) Detection rate: 100.0% (8/8 expected findings triggered)

root@kitploit:~
벤치마크는 거짓 양성 또는 거짓 음성이 발견되면 코드 1로 종료되므로, 규칙 변경을 위한 CI 품질 게이트로 적합합니다. 픽스처를 추가하려면 `benchmarks/safe/` 또는 `benchmarks/unsafe/`에 파일을 넣고 `benchmarks/labels.json`에서 예상되는 결과를 업데이트하세요.

### 규칙별 정밀도 / 재현율

벤치마크는 또한 **규칙별 신호 테이블** (최악의 F1 순)을 출력하여 정밀도가 낮은 규칙을 쉽게 찾을 수 있습니다 — 모든 레이블이 지정된 규칙에 대해 참/거짓 양성, 거짓 음성, 정밀도, 재현율, F1을 보여줍니다. FP 개수는 `safe/` 픽스처(기준 진실: 0개의 결과)에서 가져오고, TP/FN은 레이블이 지정된 `unsafe/` 픽스처에서 가져옵니다. `--report <path>`를 전달하면 대시보드 또는 CI 트렌드 추적을 위한 기계 판독 가능 JSON 보고서도 생성됩니다:

``````bash
npm run benchmark -- --report bench-report.json

Browser Extension

ContextHound 브라우저 확장 프로그램은 Chrome과 Firefox에서 실시간 프롬프트 인젝션 탐지를 제공합니다. CLI와 동일한 규칙 엔진을 사용하며, 로컬에서 컴파일 및 번들링되어 네트워크 요청이나 백엔드 없이 동작합니다.

상태: Firefox 확장 프로그램이 게시되었습니다 — Firefox Add-ons에서 설치. Chrome 제출은 웹 스토어 검토를 기다리고 있습니다. 소스는 github.com/IulianVOStrut/ContextHound-Extensions에서 확인할 수 있습니다.

기능

스캔 알약 모든 웹사이트의 AI 채팅 입력창 옆에 경량 표시기가 나타납니다. 사용자가 입력함에 따라 확장 프로그램이 70개의 탐지 규칙에 대해 텍스트를 스캔하고, 드롭다운 패널에 위험 점수와 결과를 표시합니다 — 페이지 이동이 필요하지 않습니다.

DevTools 패널 브라우저 DevTools를 열고 ContextHound 탭을 선택하여 실시간 LLM API 트래픽을 모니터링합니다. 확장 프로그램은 OpenAI, Anthropic, Google Gemini, Mistral, Groq, Cohere, DeepSeek 및 기타 서비스로의 아웃바운드 요청을 가로채고, 요청 본문과 응답 모두를 인젝션 콘텐츠에 대해 스캔합니다. 툴바 배지에는 현재 세션에서 발견된 가장 높은 위험 점수가 반영됩니다.

팝업 스캐너 툴바 아이콘을 클릭하여 수동으로 텍스트를 붙여넣고 스캔할 수 있습니다. 타사로부터 받은 프롬프트나 시스템 지침을 사용하기 전에 검토할 때 유용합니다.

브라우저 확장 프로그램이 요청 본문을 캡처하는 방법

Chrome과 Firefox의 DevTools HAR API(onRequestFinished)는 대부분의 AI 채팅 서비스에서 사용하는 스트리밍/SSE 응답에 대해 요청 본문 바이트를 안정적으로 포함하지 않습니다. 확장 프로그램은 이 문제를 두 계층 접근 방식으로 해결합니다:

  1. chrome.webRequest.onBeforeRequest가 서비스 워커에서 요청이 전송되기 전에 원시 요청 바이트를 가로채고, 이를 chrome.storage.session에 임시 캐시합니다 (TTL: 5분).
  2. onRequestFinished가 실행될 때 postData가 없는 경우, DevTools 페이지가 POP_BODY_CACHE 메시지를 통해 서비스 워커에서 캐시된 본문을 가져옵니다.

개인정보 보호

확장 프로그램은 사용자 데이터를 수집하지 않습니다. 모든 스캔은 로컬에서 수행됩니다. 개인정보 처리방침을 참조하세요.


제한 사항

  • 규칙은 정규식 및 구조적 휴리스틱을 사용하며, 완전한 의미 분석이 아닙니다. 오탐 가능성이 있으므로 항상 맥락에서 결과를 검토하세요.
  • 프롬프트가 모델에 대해 실행되지는 않으며, 이는 순수 정적 분석입니다.
  • 추출은 전체 AST 대신 패턴 매칭을 사용합니다. 복잡한 동적 프롬프트 구성은 놓칠 수 있습니다.
  • JS/TS가 아닌 언어(Python, Go, Rust 등)의 경우 LLM 라이브러리 임포트가 감지된 경우에만 파일을 분석합니다. 인식된 임포트 없이 프롬프트를 구성하는 파일은 추출되지 않습니다.

기여

기여를 환영합니다. 새 규칙을 추가하려면:

  1. src/rules/의 적절한 파일에 추가하거나 (새 카테고리인 경우 새 파일 생성)
  2. src/rules/index.ts에 등록
  3. tests/rules.test.ts에 최소 하나의 긍정 및 부정 테스트 케이스 추가
  4. npm test를 실행하여 모든 테스트 통과 확인

라이선스

MIT

도구 다운로드
95개의 보안 규칙인젝션, 유출, 탈옥, 안전하지 않은 도구 사용, 명령어 인젝션, RAG 중독, 인코딩, 출력 처리, 멀티모달, 스킬 마켓플레이스, 에이전트, MCP, 공급망, DoS 등 14개 범주
수치 위험 점수 (0-100)낮음, 중간, 높음, 심각 임계값이 있는 정규화된 저장소 수준 점수
완화 조치 탐지프롬프트에 명시적인 안전 언어를 포함하면 점수 감소
7가지 출력 형식콘솔, JSON, SARIF, GitHub Annotations, Markdown, JSONL 스트리밍, 대화형 HTML
GitHub Action 포함높은 위험 시 CI 실패 처리, SARIF 결과 자동 업로드
다중 언어 스캔TypeScript/JavaScript뿐만 아니라 Python, Go, Rust, Java, C#, PHP, Ruby, Swift, Kotlin, Vue, Bash에서 LLM API 사용 탐지
규칙 필터링접두사-글로브 문법(CMD-*)을 사용한 excludeRules / includeRules, minConfidence 필터
증분 캐시.hound-cache.json이 변경되지 않은 파일의 재실행을 건너뜀; --no-cache로 비활성화
플러그인 시스템설정 파일의 "plugins": ["./my-rule.js"]를 통해 로컬 .js 파일에서 사용자 정의 규칙 로드
기준 / 차이 모드--baseline results.json — 이전 스캔에 없던 결과만 보고 및 실패 처리
감시 모드--watch — 파일 변경 시 재스캔 및 델타 결과 표시
병렬 스캔동시 파일 처리 (--concurrency <n>, 기본값 8)
완전 오프라인API 호출 없음, 텔레메트리 없음, 유료 종속성 없음
0통과 — 점수가 임계값 미만, failOn 위반 없음
1처리되지 않은 오류 또는 잘못된 인수
2임계값 위반 — 저장소 점수 ≥ 임계값, 또는 파일 임계값 초과
3--fail-on 위반 — 지정된 심각도의 발견 사항 발견
옵션기본값설명
include**/*.{ts,tsx,js,jsx,py,go,rs,java,kt,cs,php,rb,swift,vue,sh,bash,hs,md,txt,yaml,yml,json}스캔할 글로브 패턴
exclude**/node_modules/**, **/dist/**, 등무시할 글로브 패턴
threshold60저장소 점수가 이 값 이상이면 실패(종료 코드 2)
formats["console"]출력 형식: console, json, sarif, github-annotations, markdown, jsonl, html
out자동파일 출력의 기본 경로
verbosefalse각 결과에 대한 수정 사항 및 신뢰도 표시
failOn설정되지 않음첫 번째 결과에서 critical, high, 또는 medium이 발견되면 종료 코드 3
maxFindings설정되지 않음N개의 결과 후 중지
excludeRules[]건너뛸 규칙 ID 또는 접두사 글로브(예: "CMD-*", "JBK-002")
includeRules[]이 규칙 ID만 실행(비어 있으면 모두 실행)
minConfidence설정되지 않음이 신뢰도 미만의 규칙 건너뛰기: low, medium, 또는 high
failFileThreshold설정되지 않음단일 파일 점수가 이 값 이상이면 실패(종료 코드 2)
concurrency8최대 병렬 처리 파일 수
cachetrue증분 스캔 캐시 활성화(.hound-cache.json); 비활성화하려면 false로 설정하거나 --no-cache 사용
plugins[]로컬 .js 규칙 플러그인 경로; 각각 Rule 또는 Rule[]을 내보내야 함
baseline설정되지 않음이전 JSON 보고서 경로; 기준선에 없는 결과만 보고됨
변수오버라이드
HOUND_THRESHOLDthreshold
HOUND_FAIL_ONfailOn
HOUND_MIN_CONFIDENCEminConfidence
HOUND_VERBOSEverbose (참으로 간주: 1, true, yes)
HOUND_CONFIG설정 파일 경로