
skill-scanner v2.0.14
에이전트 스킬용 보안 스캐너
Skill Scanner
AI 에이전트 스킬을 위한 최선 노력(best-effort) 보안 스캐너로, 프롬프트 인젝션, 데이터 유출, 악성 코드 패턴을 탐지합니다. 패턴 기반 탐지(YAML + YARA), LLM-as-a-judge, 동작 데이터 흐름 분석을 결합하여 오탐(false positive)을 최소화하면서 잠재적 위협에 대한 탐지 범위를 극대화합니다.
중요: 이 스캐너는 포괄적이거나 완전한 범위가 아닌 최선 노력 탐지를 제공합니다. 결과가 없는 스캔이 스킬에 모든 위협이 없다는 것을 보장하지는 않습니다. 아래 범위 및 제한 사항을 참조하세요.
OpenAI Codex Skills 및 Cursor Agent Skills 형식을 Agent Skills 사양에 따라 지원합니다. --lenient 사용 시 Claude Code .claude/commands/*.md 및 플랫 마크다운 스킬 저장소와 같은 비표준 형식도 스캔합니다.
주요 기능
- 다중 엔진 탐지 - 계층적 최선 노력 범위를 위한 정적 분석, 동작 데이터 흐름, LLM 의미 분석, 클라우드 기반 스캐닝
- 오탐 필터링 - 메타 분석기가 탐지 기능을 유지하면서 노이즈를 크게 줄입니다
- CI/CD 지원 - GitHub Code Scanning용 SARIF 출력, 재사용 가능한 GitHub Actions 워크플로우, 빌드 실패용 종료 코드
- Pre-commit 훅 - 모든 커밋 전에 스킬을 스캔하는 표준 pre-commit 프레임워크 통합
- 확장 가능 - 사용자 정의 분석기를 위한 플러그인 아키텍처
Cisco AI Discord 참여 - 논의, 피드백 공유, 팀과의 소통을 위해.
범위 및 제한 사항
Skill Scanner는 탐지 도구입니다. 알려진 위험 패턴과 잠재적 위험 패턴을 식별하지만 보안을 인증하지는 않습니다.
주요 제한 사항:
- 결과 없음 ≠ 위험 없음. "결과 없음"을 반환하는 스캔은 알려진 위협 패턴이 탐지되지 않았음을 나타냅니다. 스킬이 안전하거나, 무해하거나, 취약점이 없다는 것을 보장하지는 않습니다.
- 범위는 본질적으로 불완전합니다. 스캐너는 시그니처 기반 탐지, LLM 기반 의미 분석, 동작 데이터 흐름 분석, 선택적 클라우드 서비스, 구성 가능한 규칙 팩을 결합합니다. 이 접근 방식이 범위를 개선하지만, 자동화된 도구가 특히 신규 또는 제로데이 공격과 같은 모든 기술을 탐지할 수는 없습니다.
- 오탐 및 미탐(false negative)이 발생할 수 있습니다. 합의 모드와 메타 분석이 노이즈를 줄이지만, 어떤 구성도 잘못된 분류를 완전히 제거하지는 않습니다. 스캔 정책을 위험 허용 수준에 맞게 조정하세요.
- 인간 검토는 여전히 필수적입니다. 자동화된 스캐닝은 심층 방어(defense-in-depth) 전략의 한 구성 요소입니다. 고위험 또는 프로덕션 배포는 스캐너 결과를 수동 코드 검토 및/또는 위협 모델링과 함께 사용해야 합니다.
문서
| 가이드 | 설명 |
|---|---|
| 빠른 시작 | 5분 안에 시작하기 |
| 아키텍처 | 시스템 설계 및 구성 요소 |
| 위협 분류 | 예시가 포함된 전체 AITech 위협 분류 |
| LLM 분석기 | LLM 구성 및 사용법 |
| 메타 분석기 | 오탐 필터링 및 우선순위 지정 |
| 동작 분석기 | 데이터 흐름 분석 세부 사항 |
| 스캔 정책 | 사용자 정의 정책, 사전 설정, 튜닝 가이드 |
| 정책 빠른 참조 | 정책 섹션 및 설정에 대한 간결한 참조 |
| 규칙 작성 | 시그니처, YARA, Python 규칙 추가 방법 |
| GitHub Actions | CI/CD 통합용 재사용 가능한 워크플로우 |
| API 참조 | REST API 문서 |
| 개발 가이드 | 기여 및 개발 환경 설정 |
설치
사전 요구 사항: Python 3.10+ 및 uv (권장) 또는 pip
# uv 사용 (권장)
uv pip install cisco-ai-skill-scanner
# pip 사용
pip install cisco-ai-skill-scanner
클라우드 제공업체 추가 기능
# AWS Bedrock 지원
pip install cisco-ai-skill-scanner[bedrock]
# Google AI Studio / Gemini 지원
pip install cisco-ai-skill-scanner[google]
# Google Vertex AI 지원
pip install cisco-ai-skill-scanner[vertex]
# Azure OpenAI 지원
pip install cisco-ai-skill-scanner[azure]
# 모든 클라우드 제공업체
pip install cisco-ai-skill-scanner[all]
빠른 시작
환경 설정 (선택 사항)
# LLM 분석기 및 메타 분석기용
export SKILL_SCANNER_LLM_API_KEY="your_api_key"
export SKILL_SCANNER_LLM_MODEL="claude-3-5-sonnet-20241022"
# 선택 사항: disabled, minimal, low, medium, high, xhigh 또는 max
export SKILL_SCANNER_LLM_REASONING_EFFORT="low"
# VirusTotal 바이너리 스캔용
export VIRUSTOTAL_API_KEY="your_virustotal_api_key"
# Cisco AI Defense용
export AI_DEFENSE_API_KEY="your_aidefense_api_key"
대화형 마법사
어떤 플래그를 사용해야 할지 모르시겠나요? 인수 없이 skill-scanner를 실행하여 대화형 마법사를 시작하세요:
skill-scanner
마법사는 스캔 대상, 분석기, 정책, 출력 형식 선택을 안내한 후 실행 전에 조합된 명령을 표시합니다. CLI를 배우기에 좋습니다.
CLI 사용법
# 단일 스킬 스캔 (핵심 분석기: static + bytecode + pipeline)
skill-scanner scan /path/to/skill
# 동작 분석기로 스캔 (데이터 흐름 분석)
skill-scanner scan /path/to/skill --use-behavioral
# 모든 엔진으로 스캔
skill-scanner scan /path/to/skill --use-behavioral --use-llm --use-aidefense
# 오탐 필터링을 위한 메타 분석기로 스캔
skill-scanner scan /path/to/skill --use-llm --enable-meta
# 모호한 설명 확인을 위한 트리거 분석기로 스캔
skill-scanner scan /path/to/skill --use-trigger
# LLM 분석기를 여러 번 실행하고 다수 합의된 결과만 유지
skill-scanner scan /path/to/skill --use-llm --llm-consensus-runs 3
# 여러 스킬을 재귀적으로 스캔
skill-scanner scan-all /path/to/skills --recursive --use-behavioral
# 스킬 간 중복 탐지로 여러 스킬 스캔
skill-scanner scan-all /path/to/skills --recursive --check-overlap
# GitHub 저장소 스캔 (owner/repo 약식 또는 전체 URL)
skill-scanner scan-repo owner/repo
skill-scanner scan-repo https://github.com/owner/repo --use-llm
# 관대 모드: 실패 대신 잘못된 형식의 스킬 허용
skill-scanner scan /path/to/skill --lenient
skill-scanner scan-all /path/to/skills --recursive --lenient
# 비표준 스킬 형식의 관대 모드 (SKILL.md 불필요)
skill-scanner scan .claude/commands/deploy --lenient
skill-scanner scan-all .claude/commands --recursive --lenient
# SKILL.md 대신 사용자 정의 메타데이터 파일명 사용
skill-scanner scan /path/to/skill --skill-file README.md
# CI/CD: 위협 발견 시 빌드 실패
skill-scanner scan-all ./skills --fail-on-severity high --format sarif --output results.sarif
# 공격 상관 그룹이 포함된 대화형 HTML 보고서 생성
skill-scanner scan /path/to/skill --use-llm --enable-meta --format html --output report.html
# 사용자 정의 YARA 규칙 사용
skill-scanner scan /path/to/skill --custom-rules /path/to/my-rules/
# 사용자 정의 분류 + 위협 매핑 프로필 사용 (JSON/YAML)
skill-scanner scan /path/to/skill --taxonomy /path/to/taxonomy.json --threat-mapping /path/to/threat_mapping.json
# 선택적 알 수 없는 파일 업로드가 포함된 VirusTotal 해시 스캔
skill-scanner scan /path/to/skill --use-virustotal --vt-upload-files
# 스캔 정책 사전 설정 사용 (strict, balanced, permissive)
skill-scanner scan /path/to/skill --policy strict
# 사용자 정의 조직 정책 파일 사용
skill-scanner scan /path/to/skill --policy my_org_policy.yaml
# 사용자 정의할 정책 파일 생성
skill-scanner generate-policy -o my_org_policy.yaml
# 대화형 정책 구성 도구 (TUI)
skill-scanner configure-policy
합의 모드는 구성된 실행의 절반 이상에서 나타나는 결과만 유지합니다. 해당 투표가 심각도에 대해 의견이 다를 경우, 응답 순서와 무관하게 가장 높게 관찰된 심각도가 적용됩니다. 실패한 실행과 결과를 생략한 성공적인 실행은 투표하지 않지만 분모에는 남습니다. 이로 인해 다수 합의된 결과에 대한 심각도 선택이 안정적입니다. 개별 LLM 샘플을 결정적으로 만들지는 않으며, 동일 심각도 투표의 설명 필드, 단일 실행 출력, 비다수 결과는 스캔 간에 여전히 달라질 수 있습니다.
LLM 제공업체 참고: --llm-provider는 현재 anthropic 또는 openai를 허용합니다. Bedrock, Vertex, Azure, Gemini 및 기타 LiteLLM 백엔드의 경우 제공업체별 모델 문자열과 환경 변수를 설정하세요 (LLM 분석기 문서 참조).
Python SDK
from skill_scanner import SkillScanner
from skill_scanner.core.analyzers import BehavioralAnalyzer
# 분석기로 스캐너 생성
scanner = SkillScanner(analyzers=[
BehavioralAnalyzer(),
])
# 스킬 스캔
result = scanner.scan_skill("/path/to/skill")
print(f"Findings: {len(result.findings)}")
print(f"Max severity: {result.max_severity}")
# 참고: is_safe는 HIGH/CRITICAL 결과가 탐지되지 않았음을 나타냅니다.
# 스킬이 모든 위험에서 자유롭다는 것을 보장하지는 않습니다.
if not result.is_safe:
print("Issues detected -- review findings before deployment")
보안 분석기
| 분석기 | 탐지 방법 | 범위 | 요구 사항 |
|---|---|---|---|
| Static | YAML + YARA 패턴 | 모든 파일 | 없음 |
| Bytecode | .pyc 무결성 검증 | Python 바이트코드 | 없음 |
| Pipeline | 명령 오염(taint) 분석 | 셸 파이프라인 | 없음 |
| Behavioral | AST 데이터 흐름 분석 | Python 파일 | 없음 |
| LLM | 의미 분석 | SKILL.md + 스크립트 | API 키 |
| Meta | 오탐 필터링 | 모든 결과 | API 키 |
| VirusTotal | 해시 기반 악성코드 | 바이너리 파일 | API 키 |
| AI Defense | 클라우드 기반 AI | 텍스트 콘텐츠 | API 키 |
CLI 옵션
| 옵션 | 설명 |
|---|---|
--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) |
--llm-reasoning-effort LEVEL | 선택적 추론 깊이 (disabled, minimal, low, medium, high, xhigh 또는 max); 설정하지 않으면 제공업체 기본값 유지 |
--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 지원) |
출력 예시
$ skill-scanner scan ./my-skill --use-behavioral
============================================================
Skill: my-skill
============================================================
Status: [OK] No findings
Max Severity: NONE
Total Findings: 0
Scan Duration: 0.15s
참고: "결과 없음"은 스캐너가 알려진 위협 패턴을 탐지하지 못했음을 의미합니다. 스킬이 모든 위험에서 자유롭다는 보장은 아닙니다. 범위 및 제한 사항을 참조하세요.
GitHub Actions
재사용 가능한 워크플로우를 사용하여 모든 푸시 또는 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 프레임워크를 사용하여 모든 커밋 전에 스킬을 스캔하세요:
# .pre-commit-config.yaml
repos:
- repo: https://github.com/cisco-ai-defense/skill-scanner
rev: v1.0.0 # 최신 릴리스 태그 사용
hooks:
- id: skill-scanner
또는 내장 훅을 직접 설치:
skill-scanner-pre-commit --install
훅은 변경된 파일을 가장 가까운 SKILL.md에 매핑하고 영향을 받는 각 스킬을 한 번 스캔합니다. 일반 커밋 중에는 스테이징된 diff를 읽습니다. CI에서는 스테이징 인덱스가 필요 없도록 두 개정판을 비교하세요:
pre-commit run skill-scanner --from-ref "$BASE_SHA" --to-ref "$HEAD_SHA"
두 개정판 모두 체크아웃에 존재해야 합니다. 구성된 모든 스킬을 스캔하려면 훅을 직접 호출하세요:
skill-scanner-pre-commit --scan-all
또는 .pre-commit-config.yaml에서 훅에 args: [--scan-all]을 구성하세요.
기여
기여를 환영합니다! 지침은 CONTRIBUTING.md를 참조하세요.
라이선스
Apache 2.0 - 자세한 내용은 LICENSE를 참조하세요.
Copyright 2026 Cisco Systems, Inc. and its affiliates