
에이전트 스킬용 보안 스캐너
AI 에이전트 스킬을 위한 최선 노력(best-effort) 보안 스캐너로, 프롬프트 인젝션, 데이터 유출, 악성 코드 패턴을 탐지합니다. 패턴 기반 탐지(YAML + YARA), LLM-as-a-judge, 동작 기반 데이터 흐름(behavioral dataflow) 분석을 결합하여 잠재적 위협에 대한 탐지 범위를 극대화하면서 오탐(false positive)을 최소화합니다.
중요: 이 스캐너는 포괄적이거나 완전한 커버리지가 아닌 최선 노력 탐지를 제공합니다. 결과가 없는 스캔이 스킬에 모든 위협이 없음을 보장하지는 않습니다. 아래의 범위 및 제한 사항을 참조하세요.
OpenAI Codex Skills 및 Cursor Agent Skills 형식을 Agent Skills 사양에 따라 지원합니다. --lenient을 사용하면 Claude Code .claude/commands/*.md 및 플랫 마크다운 스킬 저장소와 같은 비표준 형식도 스캔합니다.
Cisco AI Discord 참여하기 - 논의, 피드백 공유, 팀과의 연결을 위해.
Skill Scanner는 탐지 도구입니다. 알려졌거나 가능성이 있는 위험 패턴을 식별하지만, 보안을 인증하지는 않습니다.
주요 제한 사항:
사전 요구 사항: Python 3.10+ 및 uv (권장) 또는 pip
# Using uv (recommended)
uv pip install cisco-ai-skill-scanner
# Using pip
pip install cisco-ai-skill-scanner
# AWS Bedrock support
pip install cisco-ai-skill-scanner[bedrock]
# Google AI Studio / Gemini support
pip install cisco-ai-skill-scanner[google]
# Google Vertex AI support
pip install cisco-ai-skill-scanner[vertex]
# Azure OpenAI support
pip install cisco-ai-skill-scanner[azure]
# All cloud providers
pip install cisco-ai-skill-scanner[all]
# For LLM analyzer and Meta-analyzer
export SKILL_SCANNER_LLM_API_KEY="your_api_key"
export SKILL_SCANNER_LLM_MODEL="claude-3-5-sonnet-20241022"
# For VirusTotal binary scanning
export VIRUSTOTAL_API_KEY="your_virustotal_api_key"
# For Cisco AI Defense
export AI_DEFENSE_API_KEY="your_aidefense_api_key"
어떤 플래그를 사용해야 할지 모르시나요? 인수 없이 skill-scanner를 실행하면 대화형 마법사가 시작됩니다:
skill-scanner
마법사가 스캔 대상, 분석기, 정책, 출력 형식 선택을 안내한 다음, 실행 전에 조합된 명령을 보여줍니다. CLI를 배우기에 좋습니다.
# Scan a single skill (core analyzers: static + bytecode + pipeline)
skill-scanner scan /path/to/skill
# Scan with behavioral analyzer (dataflow analysis)
skill-scanner scan /path/to/skill --use-behavioral
# Scan with all engines
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense
# Scan with meta-analyzer for false positive filtering
skill-scanner scan /path/to/skill --use-llm --enable-meta
# Scan with trigger analyzer for vague description checks
skill-scanner scan /path/to/skill --use-trigger
# Run LLM analyzer multiple times and keep majority-agreed findings
skill-scanner scan /path/to/skill --use-llm --llm-consensus-runs 3
# Scan multiple skills recursively
skill-scanner scan-all /path/to/skills --recursive --use-behavioral
# Scan multiple skills with cross-skill overlap detection
skill-scanner scan-all /path/to/skills --recursive --check-overlap
# Scan a GitHub repository (owner/repo shorthand or full URL)
skill-scanner scan-repo owner/repo
skill-scanner scan-repo https://github.com/owner/repo --use-llm
# Lenient mode: tolerate malformed skills instead of failing
skill-scanner scan /path/to/skill --lenient
skill-scanner scan-all /path/to/skills --recursive --lenient
# Lenient mode with non-standard skill formats (no SKILL.md required)
skill-scanner scan .claude/commands/deploy --lenient
skill-scanner scan-all .claude/commands --recursive --lenient
# Use a custom metadata filename instead of SKILL.md
skill-scanner scan /path/to/skill --skill-file README.md
# CI/CD: Fail build if threats found
skill-scanner scan-all ./skills --fail-on-severity high --format sarif --output results.sarif
# Generate interactive HTML report with attack correlation groups
skill-scanner scan /path/to/skill --use-llm --enable-meta --format html --output report.html
# Use custom YARA rules
skill-scanner scan /path/to/skill --custom-rules /path/to/my-rules/
# Use custom taxonomy + threat mapping profiles (JSON/YAML)
skill-scanner scan /path/to/skill --taxonomy /path/to/taxonomy.json --threat-mapping /path/to/threat_mapping.json
# VirusTotal hash scan with optional unknown-file uploads
skill-scanner scan /path/to/skill --use-virustotal --vt-upload-files
# Use a scan policy preset (strict, balanced, permissive)
skill-scanner scan /path/to/skill --policy strict
# Use a custom org policy file
skill-scanner scan /path/to/skill --policy my_org_policy.yaml
# Generate a policy file to customise
skill-scanner generate-policy -o my_org_policy.yaml
# Interactive policy configurator (TUI)
skill-scanner configure-policy
LLM 공급자 참고 사항: --llm-provider는 현재 anthropic 또는 openai를 지원합니다. Bedrock, Vertex, Azure, Gemini 및 기타 LiteLLM 백엔드의 경우 공급자별 모델 문자열과 환경 변수를 설정하세요 (LLM 분석기 문서 참조).
from skill_scanner import SkillScanner
from skill_scanner.core.analyzers import BehavioralAnalyzer
# Create scanner with analyzers
scanner = SkillScanner(analyzers=[
BehavioralAnalyzer(),
])
# Scan a skill
result = scanner.scan_skill("/path/to/skill")
print(f"Findings: {len(result.findings)}")
print(f"Max severity: {result.max_severity}")
# Note: is_safe indicates no HIGH/CRITICAL findings were detected.
# It does not guarantee the skill is free of all risk.
if not result.is_safe:
print("Issues detected -- review findings before deployment")
$ skill-scanner scan ./my-skill --use-behavioral
============================================================
Skill: my-skill
============================================================
Status: [OK] No findings
Max Severity: NONE
Total Findings: 0
Scan Duration: 0.15s
참고: "결과 없음(No findings)"은 스캐너가 알려진 위협 패턴을 탐지하지 못했음을 의미합니다. 스킬에 모든 위험이 없음을 보장하는 것은 아닙니다. 범위 및 제한 사항을 참조하세요.
재사용 가능한 워크플로를 사용하여 모든 푸시 또는 PR에서 스킬을 자동으로 스캔합니다:
# .github/workflows/scan-skills.yml
name: Scan Skills
on:
pull_request:
paths: [".cursor/skills/**"]
jobs:
scan:
uses: cisco-ai-defense/skill-scanner/.github/workflows/scan-skills.yml@main
with:
skill_path: .cursor/skills
permissions:
security-events: write
contents: read
결과는 GitHub Code Scanning을 통해 PR에 인라인 주석으로 표시됩니다. LLM 통합, 비밀 구성, 브랜치 보호 설정은 전체 가이드를 참조하세요.
pre-commit 프레임워크를 사용하여 모든 커밋 전에 스킬을 스캔합니다:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/cisco-ai-defense/skill-scanner
rev: v1.0.0 # use the latest release tag
hooks:
- id: skill-scanner
또는 내장 훅을 직접 설치합니다:
skill-scanner-pre-commit install
훅은 스테이징된 변경 사항이 있는 스킬 디렉토리를 자동으로 감지하여 해당 디렉토리만 스캔하므로 커밋 시간이 빠릅니다. 모든 항목을 스캔하려면 --all을 사용하세요.
기여를 환영합니다! 지침은 CONTRIBUTING.md를 참조하세요.
Apache 2.0 - 자세한 내용은 LICENSE를 참조하세요.
Copyright 2026 Cisco Systems, Inc. and its affiliates
| 가이드 | 설명 |
|---|
| 빠른 시작 | 5분 만에 시작하기 |
| 아키텍처 | 시스템 설계 및 구성 요소 |
| 위협 분류 체계 | 예시가 포함된 전체 AITech 위협 분류 체계 |
| LLM 분석기 | LLM 구성 및 사용법 |
| 메타 분석기 | 오탐 필터링 및 우선순위 지정 |
| 동작 분석기 | 데이터 흐름 분석 세부 사항 |
| 스캔 정책 | 사용자 정의 정책, 프리셋 및 튜닝 가이드 |
| 정책 빠른 참조 | 정책 섹션 및 설정값에 대한 간편 참조 |
| 규칙 작성 | 시그니처, YARA, Python 규칙을 추가하는 방법 |
| GitHub Actions | CI/CD 통합을 위한 재사용 가능한 워크플로 |
| API 참조 | REST API 문서 |
| 개발 가이드 | 기여 및 개발 환경 설정 |
| 분석기 | 탐지 방법 | 범위 | 요구 사항 |
|---|
| 정적(Static) | YAML + YARA 패턴 | 모든 파일 | 없음 |
| 바이트코드(Bytecode) | .pyc 무결성 검증 | Python 바이트코드 | 없음 |
| 파이프라인(Pipeline) | 명령 오염(taint) 분석 | 셸 파이프라인 | 없음 |
| 동작(Behavioral) | AST 데이터 흐름 분석 | Python 파일 | 없음 |
| LLM | 의미 분석 | SKILL.md + 스크립트 | API 키 |
| 메타(Meta) | 오탐 필터링 | 모든 결과 | API 키 |
| VirusTotal | 해시 기반 악성코드 | 바이너리 파일 | API 키 |
| AI Defense | 클라우드 기반 AI | 텍스트 콘텐츠 | API 키 |
| 옵션 | 설명 |
|---|
--policy | 스캔 정책: 프리셋 이름(strict, balanced, permissive) 또는 사용자 정의 YAML 경로 |
--use-behavioral | 동작 분석기 활성화 (데이터 흐름 분석) |
--use-llm | LLM 분석기 활성화 (API 키 필요) |
--llm-provider | CLI 라우팅용 LLM 공급자: anthropic 또는 openai |
--llm-consensus-runs N | LLM 분석을 N회 실행하고 다수 합의된 결과만 유지 |
--llm-max-tokens N | LLM 응답의 최대 출력 토큰 수 (기본값: 8192) |
--use-virustotal | VirusTotal 바이너리 스캐너 활성화 |
--vt-api-key KEY | VirusTotal API 키를 직접 제공 (선택 사항) |
--vt-upload-files | 알 수 없는 바이너리를 VirusTotal에 업로드 (선택 사항) |
--use-aidefense | Cisco AI Defense 분석기 활성화 |
--aidefense-api-url URL | AI Defense API URL 재정의 (선택 사항) |
--use-trigger | 트리거 특이성 분석기 활성화 |
--enable-meta | 오탐 필터링용 메타 분석기 활성화 |
--verbose | 결과별 정책 지문, 동시 발생 메타데이터를 포함하고 메타 분석기 오탐을 유지 |
--format | 출력 형식: summary, json, markdown, table, sarif, html. html 형식은 접을 수 있는 상관 관계 그룹, 확장 가능한 코드 스니펫, 파이프라인 오염 흐름 다이어그램이 포함된 자체 포함형 대화형 보고서를 생성합니다 |
--detailed | Markdown 출력에 상세 결과 포함 |
--compact | 간결한 JSON 출력 |
--output PATH | 기본 출력 파일 경로 (--output-<fmt>로 재정의됨) |
--fail-on-findings | HIGH/CRITICAL 발견 시 오류로 종료 (--fail-on-severity high의 약어) |
--fail-on-severity LEVEL | LEVEL 이상의 결과가 있으면 오류로 종료 (critical, high, medium, low, info) |
--custom-rules PATH | 디렉토리의 사용자 정의 YARA 규칙 사용 |
--taxonomy PATH | 이 실행에 대한 사용자 정의 분류 체계 프로필 로드 (JSON/YAML) |
--threat-mapping PATH | 이 실행에 대한 사용자 정의 스캐너 위협 매핑 프로필 로드 (JSON) |
--lenient | 잘못된 형식의 스킬을 실패 대신 허용 (잘못된 필드 강제 변환, 기본값 채움). SKILL.md가 없으면 디렉토리의 .md 파일을 스캔하는 것으로 대체 |
--skill-file FILENAME | SKILL.md 대신 사용할 사용자 정의 메타데이터 파일 이름 (예: README.md) |
--check-overlap | (scan-all) 스킬 간 설명 중복 검사 활성화 |
| 명령 | 설명 |
|---|
| (명령 없음) | 대화형 스캔 마법사 실행 (터미널에서 실행 시) |
interactive | 대화형 스캔 마법사 실행 (명시적) |
scan | 단일 스킬 디렉토리 스캔 |
scan-all | 여러 스킬 스캔 (--recursive, --check-overlap 지원) |
generate-policy | 사용자 지정을 위한 스캔 정책 YAML 생성 |
configure-policy | 사용자 정의 스캔 정책을 만들거나 편집하는 대화형 TUI (--input 지원) |
list-analyzers | 사용 가능한 분석기 표시 |
validate-rules | 규칙 시그니처 검증 (--rules-file 지원) |