업데이트로 돌아가기
New releaseSep 4, 2026

skill-scanner v2.0.14

에이전트 스킬용 보안 스캐너

공유

Skill Scanner

License Python 3.10+ PyPI version CI Discord Cisco AI Defense AI Security Framework Ask DeepWiki

AI 에이전트 스킬을 위한 최선 노력(best-effort) 보안 스캐너로, 프롬프트 인젝션, 데이터 유출, 악성 코드 패턴을 탐지합니다. 패턴 기반 탐지(YAML + YARA), LLM-as-a-judge, 동작 데이터 흐름 분석을 결합하여 오탐(false positive)을 최소화하면서 잠재적 위협에 대한 탐지 범위를 극대화합니다.

중요: 이 스캐너는 포괄적이거나 완전한 범위가 아닌 최선 노력 탐지를 제공합니다. 결과가 없는 스캔이 스킬에 모든 위협이 없다는 것을 보장하지는 않습니다. 아래 범위 및 제한 사항을 참조하세요.

OpenAI Codex SkillsCursor 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 ActionsCI/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")

보안 분석기

분석기탐지 방법범위요구 사항
StaticYAML + YARA 패턴모든 파일없음
Bytecode.pyc 무결성 검증Python 바이트코드없음
Pipeline명령 오염(taint) 분석셸 파이프라인없음
BehavioralAST 데이터 흐름 분석Python 파일없음
LLM의미 분석SKILL.md + 스크립트API 키
Meta오탐 필터링모든 결과API 키
VirusTotal해시 기반 악성코드바이너리 파일API 키
AI Defense클라우드 기반 AI텍스트 콘텐츠API 키

CLI 옵션

옵션설명
--policy스캔 정책: 사전 설정 이름(strict, balanced, permissive) 또는 사용자 정의 YAML 경로
--use-behavioral동작 분석기 활성화 (데이터 흐름 분석)
--use-llmLLM 분석기 활성화 (API 키 필요)
--llm-providerCLI 라우팅용 LLM 제공업체: anthropic 또는 openai
--llm-consensus-runs NLLM 분석을 N번 실행하고, 다수 합의된 결과를 유지하며, 가장 높게 관찰된 심각도를 유지
--llm-max-tokens NLLM 응답의 최대 출력 토큰 (기본값: 8192)
--llm-reasoning-effort LEVEL선택적 추론 깊이 (disabled, minimal, low, medium, high, xhigh 또는 max); 설정하지 않으면 제공업체 기본값 유지
--use-virustotalVirusTotal 바이너리 스캐너 활성화
--vt-api-key KEYVirusTotal API 키 직접 제공 (선택 사항)
--vt-upload-files알 수 없는 바이너리를 VirusTotal에 업로드 (선택 사항)
--use-aidefenseCisco AI Defense 분석기 활성화
--aidefense-api-url URLAI Defense API URL 재정의 (선택 사항)
--use-trigger트리거 특이성 분석기 활성화
--enable-meta오탐 필터링용 메타 분석기 활성화
--verbose결과별 정책 지문, 동시 발생 메타데이터 포함 및 메타 분석기 오탐 유지
--format출력: summary, json, markdown, table, sarif, html. html 형식은 접을 수 있는 상관 그룹, 확장 가능한 코드 스니펫, 파이프라인 오염 흐름 다이어그램이 포함된 자체 포함 대화형 보고서를 생성합니다
--detailedMarkdown 출력에 상세 결과 포함
--compact간결한 JSON 출력
--output PATH기본 출력 파일 경로 (--output-<fmt>로 재정의됨)
--fail-on-findingsHIGH/CRITICAL 발견 시 오류로 종료 (--fail-on-severity high의 약식)
--fail-on-severity LEVELLEVEL 이상의 결과가 존재하면 오류로 종료 (critical, high, medium, low, info)
--custom-rules PATH디렉토리에서 사용자 정의 YARA 규칙 사용
--taxonomy PATH이 실행에 대한 사용자 정의 분류 프로필 로드 (JSON/YAML)
--threat-mapping PATH이 실행에 대한 사용자 정의 스캐너 위협 매핑 프로필 로드 (JSON)
--lenient실패 대신 잘못된 형식의 스킬 허용 (잘못된 필드 강제 변환, 기본값 채우기). SKILL.md가 없으면 디렉토리의 .md 파일 스캔으로 대체
--skill-file FILENAMESKILL.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


GitHubDiscordPyPI

카테고리