NVIDIA/SkillSpector
요약
NVIDIA에서 출시한 SkillSpector는 AI 에이전트 스킬의 보안 취약점과 악성 패턴을 탐지하는 보안 스캐너입니다. 정적 분석과 LLM 의미론적 평가를 결합하여 프롬프트 인젝션 및 데이터 유출 등 64가지 보안 위험을 식별합니다.
핵심 포인트
- AI 에이전트 스킬의 보안 취약점 및 악성 의도 탐지
- 정적 분석과 LLM 기반 의미론적 평가의 2단계 분석 방식
- 프롬프트 인젝션, 데이터 유출 등 16개 카테고리 64개 패턴 지원
- 실시간 CVE 데이터 조회 및 위험 점수(0-100) 산정 기능
AI 에이전트 스킬을 위한 보안 스캐너. 에이전트 스킬을 설치하기 전에 취약점(vulnerabilities), 악성 패턴 및 보안 위험을 탐지합니다.
AI 에이전트 스킬(Claude Code, Codex CLI, Gemini CLI 등에서 사용)은 암묵적인 신뢰와 최소한의 검증만으로 실행됩니다. 연구에 따르면 스킬의 26.1%에 취약점이 포함되어 있으며, 5.2%는 악성 의도가 있을 가능성이 있는 것으로 나타났습니다.
SkillSpector는 다음과 같은 질문에 답할 수 있도록 도와줍니다: "이 스킬을 설치해도 안전한가?"
개발 가이드 — 아키텍처(Architecture), 패키지 레이아웃(package layout), 그리고 분석 파이프라인(analyzer pipeline)을 확장하는 방법.
다중 형식 입력: Git 저장소(repos), URL, zip 파일, 디렉토리 또는 단일 파일을 스캔할 수 있습니다.
16개 카테고리에 걸친 64가지 취약점 패턴: 프롬프트 인젝션(prompt injection), 데이터 유출(data exfiltration), 권한 상승(privilege escalation), 공급망(supply chain), 과도한 에이전시(excessive agency), 출력 처리(output handling), 시스템 프롬프트 유출(system prompt leakage), 메모리 포이즈닝(memory poisoning), 도구 오용(tool misuse), 로그 에이전트(rogue agent), 트리거 남용(trigger abuse), 위험한 코드(AST), 테인트 트래킹(taint tracking), YARA 시그니처(YARA signatures), MCP 최소 권한(MCP least privilege), MCP 도구 포이즈닝(MCP tool poisoning)
2단계 분석: 빠른 정적 분석(static analysis) + 선택적 LLM 의미론적 평가(semantic evaluation)
실시간 취약점 조회: SC4가 OSV.dev를 쿼리하여 실시간 CVE 데이터를 조회하며, 자동 오프라인 폴백(fallback) 기능을 제공합니다.
다양한 출력 형식: 터미널(Terminal), JSON, Markdown 및 SARIF 보고서
위험 점수 산정(Risk scoring): 심각도 라벨과 명확한 권장 사항이 포함된 0-100 점수
먼저 가상 환경(virtual environment)을 생성하고 활성화하세요 (모든 make 타겟은 venv가 활성화되어 있다고 가정합니다). uv 또는 pip를 사용하세요. Makefile은 사용 가능한 경우 uv를 사용하고, 그렇지 않으면 pip를 사용합니다.
저장소 복제
git clone https://github.com/NVIDIA/skillspector.git
cd skillspector
가상 환경 생성 및 활성화
uv venv .venv && source .venv/bin/activate
또는: python3 -m venv .venv && source .venv/bin/activate
프로덕션용 설치
make install
또는 개발 의존성(development dependencies)과 함께 설치
make install-dev
로컬 스킬 디렉터리 스캔
skillspector scan ./my-skill/
단일 SKILL.md 파일 스캔
skillspector scan ./SKILL.md
Git 리포지토리 (Git repository) 스캔
skillspector scan https://github.com/user/my-skill
zip 파일 스캔
skillspector scan ./my-skill.zip
터미널 출력 (기본값) - 보기 좋게 포맷팅됨
skillspector scan ./my-skill/
JSON 출력 - 기계 판독 가능 (machine readable)
skillspector scan ./my-skill/ --format json --output report.json
Markdown 출력 - 문서화용
skillspector scan ./my-skill/ --format markdown --output report.md
SARIF 출력 - CI/CD 통합 및 IDE 도구용
skillspector scan ./my-skill/ --format sarif --output report.sarif
최상의 결과를 얻으려면 의미론적 분석 (semantic analysis)을 위해 OpenAI 호환 LLM 엔드포인트 (endpoint)를 구성하십시오. SKILLSPECTOR_PROVIDER를 사용하여 제공업체를 선택하십시오.
각 제공업체는 자체적인 번들 기본 모델을 제공합니다. SkillSpector는 로컬 OpenAI 호환 서버 (Ollama, vLLM, llama.cpp) 및 관리형 추론 게이트웨이 (managed inference gateways)와도 작동합니다.
제공업체 (SKILLSPECTOR_PROVIDER) | 인증 환경 변수 (Credential env var) | 엔드포인트 (Endpoint) | 기본 모델 (Default model) |
|---|---|---|---|
openai | OPENAI_API_KEY (+ 선택 사항 OPENAI_BASE_URL) | api.openai.com (또는 기타 OpenAI 호환 URL) | gpt-5.4 |
anthropic | ANTHROPIC_API_KEY | api.anthropic.com | claude-opus-4-6 |
nv_build | NVIDIA_INFERENCE_KEY | build.nvidia.com | deepseek-ai/deepseek-v4-flash |
OpenAI 사용
export SKILLSPECTOR_PROVIDER=openai
export OPENAI_API_KEY=sk-...
skillspector scan ./my-skill/
Anthropic 사용
export SKILLSPECTOR_PROVIDER=anthropic
export ANTHROPIC_API_KEY=sk-ant-...
skillspector scan ./my-skill/
NVIDIA build.nvidia.com 사용
export SKILLSPECTOR_PROVIDER=nv_build
export NVIDIA_INFERENCE_KEY=nvapi-...
skillspector scan ./my-skill/
로컬 Ollama 또는 모든 OpenAI 호환 엔드포인트 사용
export SKILLSPECTOR_PROVIDER=openai
export OPENAI_API_KEY=ollama
export OPENAI_BASE_URL=http://localhost:11434/v1
export SKILLSPECTOR_MODEL=llama3.1:8b
skillspector scan ./my-skill/
제공업체의 기본 모델을 재정의
export SKILLSPECTOR_MODEL=gpt-5.2
skillspector scan ./my-skill/
LLM 분석 건너뛰기 (더 빠름, 정적 분석만)
skillspector scan ./my-skill/ --no-llm
SkillSpector는 16개 카테고리에 걸쳐 64가지 취약점 패턴을 감지합니다:
프롬프트 인젝션 (Prompt Injection) (5가지 패턴)
| ID | Pattern | Severity | Description |
|---|---|---|---|
| P1 | Instruction Override | HIGH | 안전 제약을 무시하는 명령어 |
| P2 | Hidden Instructions | HIGH | 주석/보이지 않는 텍스트에 포함된 악의적인 지침 |
| P3 | Exfiltration Commands | HIGH | 컨텍스트를 외부로 전송하도록 하는 지침 |
| P4 | Behavior Manipulation | MEDIUM | 에이전트 결정을 변경하는 미묘한 지침 |
| P5 | Harmful Content | CRITICAL | 신체적 해를 입힐 수 있는 내용을 유발하는 지침 |
데이터 유출 (Data Exfiltration) (4가지 패턴)
| ID | Pattern | Severity | Description |
|---|---|---|---|
| E1 | External Transmission | MEDIUM | 외부 URL로 데이터를 전송하는 행위 |
| E2 | Env Variable Harvesting | HIGH | API 키 및 비밀 정보를 수집하는 행위 |
| E3 | File System Enumeration | MEDIUM | 민감한 파일을 찾기 위해 디렉토리를 스캔하는 행위 |
| E4 | Context Leakage | HIGH | 대화 컨텍스트를 외부로 전송하는 행위 |
권한 상승 (Privilege Escalation) (3가지 패턴)
| ID | 패턴 (Pattern) | 심각도 (Severity) | 설명 (Description) |
|---|---|---|---|
| PE1 | 과도한 권한 (Excessive Permissions) | LOW | 명시된 기능 범위를 벗어난 액세스 요청 |
| PE2 | Sudo/Root 실행 (Sudo/Root Execution) | MEDIUM | 승격된 시스템 권한 (elevated system privileges) 호출 |
| PE3 | 자격 증명 접근 (Credential Access) | HIGH | SSH 키, 토큰, 비밀번호 읽기 |
공급망 (Supply Chain) (6가지 패턴)
| ID | 패턴 (Pattern) | 심각도 (Severity) | 설명 (Description) |
|---|---|---|---|
| SC1 | 고정되지 않은 의존성 (Unpinned Dependencies) | LOW | 패키지에 대한 버전 제약 조건 없음 |
| SC2 | 외부 스크립트 가져오기 (External Script Fetching) | HIGH | curl |
| SC3 | 난독화된 코드 (Obfuscated Code) | HIGH | Base64/hex 인코딩된 실행 |
| SC4 | 알려진 취약한 의존성 (Known Vulnerable Dependencies) | HIGH | 알려진 CVE가 있는 의존성 (실시간 OSV.dev 조회) |
| SC5 | 방치된 의존성 (Abandoned Dependencies) | MEDIUM | 보안 업데이트가 없는 관리되지 않는 패키지 |
| SC6 | 타이포스쿼팅 (Typosquatting) | HIGH | 인기 있는 패키지와 유사한 패키지 이름 |
과도한 대리권 (Excessive Agency) (4가지 패턴)
| ID | 패턴 (Pattern) | 심각도 (Severity) | 설명 (Description) |
|---|---|---|---|
| EA1 | 제한 없는 도구 접근 (Unrestricted Tool Access) | HIGH | 제약 없는 자유로운 도구 접근 |
| EA2 | 자율적 의사 결정 (Autonomous Decision Making) | HIGH | 인간 참여 (human-in-the-loop) 없는 고영향 결정 |
| EA3 | 범위 확장 (Scope Creep) | MEDIUM | 명시된 목적을 벗어나는 기능 확장 |
| EA4 | 무제한 리소스 접근 (Unbounded Resource Access) | MEDIUM | 리소스 소비에 대한 속도 제한 (rate limits) 또는 할당량(quotas) 없음 |
출력 처리 (Output Handling) (3가지 패턴)
| ID | 패턴 (Pattern) | 심각도 (Severity) | 설명 (Description) |
|---|---|---|---|
| OH1 | 검증되지 않은 출력 주입 (Unvalidated Output Injection) | HIGH | 정화(sanitization) 과정 없이 모델 출력을 사용함 |
| OH2 | 교차 컨텍스트 출력 (Cross-Context Output) | MEDIUM | 검증 없이 신뢰 경계(trust boundaries)를 넘어 출력 흐름이 발생함 |
| OH3 | 무제한 출력 (Unbounded Output) | MEDIUM | 출력 크기 또는 생성 속도에 대한 제한 없음 |
시스템 프롬프트 유출 (System Prompt Leakage) (3가지 패턴)
| ID | 패턴 (Pattern) | 심각도 (Severity) | 설명 (Description) |
|---|---|---|---|
| P6 | 직접 유출 (Direct Leakage) | HIGH | 시스템 프롬프트나 내부 규칙을 노출하는 지침 |
| P7 | 간접 추출 (Indirect Extraction) | MEDIUM | 재구문(rephrasing), 번역 또는 사이드 채널(side-channels)을 통한 추출 |
| P8 | 도구 기반 유출 (Tool-Based Exfiltration) | HIGH | 파일 쓰기 또는 네트워크 요청을 통해 시스템 프롬프트가 유출됨 |
메모리 오염 (Memory Poisoning) (3가지 패턴)
| ID | 패턴 (Pattern) | 심각도 (Severity) | 설명 (Description) |
|---|---|---|---|
| MP1 | 지속적 컨텍스트 주입 (Persistent Context Injection) | HIGH | 상호작용 전반에 걸쳐 지속되도록 설계된 콘텐츠 |
| MP2 | 컨텍스트 윈도우 채우기 (Context Window Stuffing) | MEDIUM | 안전 제약 사항을 밀어내는 채우기용 콘텐츠 |
| MP3 | 메모리 조작 (Memory Manipulation) | HIGH | 에이전트 메모리 또는 저장된 상태(Stored State)를 변조 |
| ID | 패턴 (Pattern) | 심각도 (Severity) | 설명 (Description) |
|---|---|---|---|
| TM1 | 도구 파라미터 남용 (Tool Parameter Abuse) | HIGH | 의도하지 않은 동작을 유도하기 위해 정교하게 제작된 파라미터 (shell=True, --force) |
| TM2 | 체이닝 남용 (Chaining Abuse) | HIGH | 개별 안전 점검을 우회하는 도구 체인 (Tool Chains) |
| TM3 | 안전하지 않은 기본값 (Unsafe Defaults) | MEDIUM | 과도하게 허용적인 기본값 (TLS 비활성화, 인증 없음) |
| ID | 패턴 (Pattern) | 심각도 (Severity) | 설명 (Description) |
|---|---|---|---|
| RA1 | 자기 수정 (Self-Modification) | CRITICAL | 런타임(Runtime) 중에 자신의 코드 또는 설정을 수정 |
| RA2 | 세션 지속성 (Session Persistence) | HIGH | cron 작업 또는 시작 스크립트를 통한 무단 지속성 유지 |
트리거 남용 (Trigger Abuse) (3가지 패턴)
| ID | 패턴 (Pattern) | 심각도 (Severity) | 설명 (Description) |
|---|---|---|---|
| TR1 | 과도하게 광범위한 트리거 (Overly Broad Trigger) | MEDIUM | 일반적인 단어와 일치하는 트리거 패턴 |
| TR2 | 섀도우 커맨드 트리거 (Shadow Command Trigger) | HIGH | 내장 명령어나 다른 기술(Skills)을 가리는 트리거 |
| TR3 | 키워드 미끼 트리거 (Keyword Baiting Trigger) | MEDIUM | 활성화를 극대화하기 위해 설계된 일반적인 트리거 |
행동 AST (Behavioral AST) (8가지 패턴)
| ID | 패턴 (Pattern) | 심각도 (Severity) | 설명 (Description) |
|---|---|---|---|
| AST1 | exec() 호출 (exec() Call) | CRITICAL | 임의 코드 실행(Arbitrary Code Execution)을 가능하게 하는 직접적인 exec() 호출 |
| AST2 | eval() 호출 (eval() Call) | HIGH | 임의의 표현식을 평가하는 직접적인 eval() 호출 |
| AST3 | 동적 임포트 (Dynamic Import) | HIGH | 런타임 중에 임의의 모듈을 로드하는 import() |
| AST4 | subprocess 호출 (subprocess Call) | HIGH | subprocess를 통한 외부 명령 실행 |
| AST5 | os.system / exec 계열 (os.system / exec-family) | HIGH | os 모듈을 통한 셸(Shell) 명령 |
| AST6 | compile() 호출 (compile() Call) | MEDIUM | 문자열로부터 코드 객체(Code Object) 생성 |
| AST7 | 동적 getattr() (Dynamic getattr()) | MEDIUM | 리터럴이 아닌 이름을 사용한 임의의 속성 접근 |
| AST8 | 위험한 실행 체인 (Dangerous Execution Chain) | CRITICAL | 동적 소스(네트워크, 인코딩된 데이터)와 결합된 exec/eval |
오염 추적 (Taint Tracking) (5가지 패턴)
| ID | 패턴 (Pattern) | 심각도 (Severity) | 설명 (Description) |
| TT1 | 직접 오염 흐름 (Direct Taint Flow) | 높음 (HIGH) | 데이터가 정화 (Sanitization) 과정 없이 소스 (Source)에서 싱크 (Sink)로 직접 흐름 |
| TT2 | 변수 매개 오염 흐름 (Variable-Mediated Taint Flow) | 중간 (MEDIUM) | 데이터가 중간 변수를 거쳐 소스에서 싱크로 흐름 |
| TT3 | 자격 증명 유출 체인 (Credential Exfiltration Chain) | 치명적 (CRITICAL) | 자격 증명 (환경 변수, 비밀 값 등)이 네트워크 출력 싱크로 흐름 |
| TT4 | 파일 읽기에서 네트워크 유출로 (File Read to Network Exfiltration) | 높음 (HIGH) | 파일 내용이 네트워크 출력 싱크로 흐름 |
| TT5 | 외부 입력에서 코드 실행으로 (External Input to Code Execution) | 치명적 (CRITICAL) | 네트워크 또는 사용자 입력이 exec/eval/subprocess 싱크로 흐름 |
YARA 시그니처 (YARA Signatures) (4가지 패턴)
| ID | 패턴 (Pattern) | 심각도 (Severity) | 설명 (Description) |
| YR1 | 악성코드 일치 (Malware Match) | 치명적 (CRITICAL) | 알려진 악성코드 시그니처에 대한 YARA 규칙 일치 |
| YR2 | 웹쉘 일치 (Webshell Match) | 치명적 (CRITICAL) | 웹쉘 (Webshell) 패턴에 대한 YARA 규칙 일치 |
| YR3 | 암호화폐 채굴기 일치 (Cryptominer Match) | 높음 (HIGH) | 암호화폐 채굴 지표에 대한 YARA 규칙 일치 |
| YR4 | 해킹 도구 / 익스플로잇 일치 (Hack Tool / Exploit Match) | 높음 (HIGH) | 해킹 도구 또는 익스플로잇 (Exploit) 코드에 대한 YARA 규칙 일치 |
MCP 최소 권한 (MCP Least Privilege) (4가지 패턴)
| ID | 패턴 (Pattern) | 심각도 (Severity) | 설명 (Description) |
| LP1 | 권한 과소 선언 (Underdeclared Capability) | 높음 (HIGH) | 코드가 선언된 권한에 나열되지 않은 기능 (Capability)을 사용함 |
| LP2 | 와일드카드 권한 (Wildcard Permission) | 중간 (MEDIUM) | 권한 목록에 와일드카드 (*, all, full, any)가 포함됨 |
| LP3 | 권한 선언 누락 (Missing Permission Declaration) | 중간 (MEDIUM) | 권한 필드는 없으나 코드에서 탐지 가능한 기능이 존재함 |
| LP4 | 권한 과다 선언 (Overdeclared Permission) | 낮음 (LOW) | 권한은 선언되어 있으나 그에 상응하는 코드 기능이 발견되지 않음 |
MCP 도구 오염 (MCP Tool Poisoning) (4가지 패턴)
| ID | 패턴 (Pattern) | 심각도 (Severity) | 설명 (Description) |
|---|---|---|---|
| TP1 | 숨겨진 지침 (Hidden Instructions) | 높음 (HIGH) | 메타데이터 내 숨겨진 지시 사항 (HTML 주석, 제로 너비 문자 (zero-width chars), base64, 데이터 URI (data URIs)) |
| TP2 | 유니코드 기만 (Unicode Deception) | 높음 (HIGH) | 도구 메타데이터 내의 호모글리프 (Homoglyphs), RTL 오버라이드 (RTL overrides), 혼합 스크립트 식별자 (mixed-script identifiers) |
| TP3 | 파라미터 설명 주입 (Parameter Description Injection) | 중간 (MEDIUM) | 파라미터 정의 내 주입 패턴 (오버라이드 (overrides), 시스템 토큰 (system tokens), 악성 기본값 (malicious defaults)) |
| TP4 | 설명-동작 불일치 (Description-Behavior Mismatch) | 중간 (MEDIUM) | 선언된 도구 설명이 실제 코드 동작과 일치하지 않음 (LLM 기반) |
감지된 모든 패턴은 위의 표에 나열되어 있습니다.
심각한 (CRITICAL) 문제: +50점
높음 (HIGH) 문제: +25점
중간 (MEDIUM) 문제: +10점
낮음 (LOW) 문제: +5점
실행 가능한 스크립트 (Executable scripts): 1.3배 배율
| 점수 (Score) | 심각도 (Severity) | 권장 사항 (Recommendation) |
|---|---|---|
| 0-20 | 낮음 (LOW) | 안전 (SAFE) |
| 21-50 | 중간 (MEDIUM) | 주의 (CAUTION) |
| 51-80 | 높음 (HIGH) | 설치 금지 (DO NOT INSTALL) |
| 81-100 | 심각함 (CRITICAL) | 설치 금지 (DO NOT INSTALL) |
SkillSpector 보안 보고서 (Security Report) v2.0.0
Skill: suspicious-skill
Source: ./suspicious-skill/
...
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Trending Python (daily)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기