SkillHarm: 자동 생성 기반의 Skill-Use Lifecycle 전반을 다루는 Agent Skill 공격 벤치마크
SkillHarm: Lifecycle-Aware Skill-Based Attacks via Automated Construction
TL;DR Highlight
AI 에이전트가 사용하는 'Skill 패키지'에 악성 페이로드를 심으면 최신 모델도 86%까지 뚫린다는 보안 벤치마크.
Who Should Read
Claude Code, Codex 같은 코딩 에이전트를 프로덕션에 도입하거나 MCP/Skill 기반 워크플로우를 설계하는 백엔드·MLOps 개발자. AI 에이전트 보안 취약점을 평가하거나 방어 전략을 고민하는 팀에게 필수.
Core Mechanics
- AI 에이전트가 쓰는 'Skill 패키지'(자연어 지침 + 참조 문서 + 실행 스크립트를 묶은 재사용 가능 패키지)는 에이전트가 암묵적으로 신뢰하고 실행하기 때문에, 공격자가 악성 내용을 심기 딱 좋은 공격 표면이다.
- 공격 유형은 두 가지: FPP(Fixed-Payload Poisoning, 설치 즉시 발동)와 SMP(Self-Mutating Poisoning, 첫 실행은 정상처럼 보이다가 Skill 파일을 조용히 변조해 다음 세션에서 피해 발생). SMP는 기존 단일 세션 평가에서 절대 잡히지 않는 공격이다.
- GPT-5.4(Codex)가 가장 취약해서 FPP 공격 성공률 86.3%, SMP 69.3%를 기록. Claude Opus 4.7이 상대적으로 강하지만 그래도 FPP 27.4%, SMP 9.4%로 안전하지 않다.
- '공격 실패'의 상당수가 에이전트가 악성 파일을 아예 안 열었기 때문이지, 공격을 인지해서 거부한 게 아니다. 실제로 파일을 열었을 때(Conditional ASR)는 성공률이 최대 32.1%p 더 높아진다.
- 스크립트 기반 페이로드가 문서 기반보다 훨씬 위험하다. 에이전트들이 helper script는 내용 검사 없이 그냥 실행하기 때문에, 자연어 prompt injection 방어 훈련을 받아도 스크립트 공격은 막지 못한다.
- 기존 방어 수단은 모두 불충분: Skill Scanner는 최대 55.6% 감지, 방어용 System Prompt를 추가해도 거의 모든 설정에서 ASR 70% 이상 유지.
Evidence
- FPP 공격 성공률: Codex GPT-5.4 86.3%, GPT-5.5 81.4%, Gemini 3 Flash 63.8%, Claude Sonnet 4.6 52.4%, Qwen3.6-27B 53.9%, Claude Opus 4.7 27.4%.
- SMP 공격 성공률: Codex GPT-5.4 69.3%, GPT-5.5 65.6%, Gemini 3 Flash 45.8%, Claude Sonnet 4.6 51.6%, Qwen3.6-27B 51.6%, Claude Opus 4.7 9.4%. SMP는 '변조 성공 + 다음 세션 피해 발동' 두 단계를 모두 통과해야 성공으로 인정한다.
- 가장 강력한 Skill Scanner(Skill Scanner + Opus 4.7 백본)도 FPP 55.6%, SMP 68.8% 감지에 그쳤고, Agent Scan(Snyk)은 FPP 7.4%, SMP 9.9%로 사실상 무용지물.
- 방어용 System Prompt(DSP) 적용 후에도 모든 에이전트에서 FPP·SMP 모두 ASR 70% 이상 유지. 실제로 일부 설정(Codex FPP)은 DSP 없을 때 86.3% → DSP 적용 후 83.0%로 불과 3.3%p 감소.
How to Apply
- 에이전트 워크플로우에 third-party Skill 패키지를 도입할 때, SKILL.md·스크립트를 에이전트가 암묵적으로 신뢰하는 구조를 그대로 쓰지 말고, 별도 샌드박스(Docker 격리)에서 실행하고 파일 시스템 접근을 최소 권한으로 제한해라.
- 단일 세션 보안 테스트만으로는 SMP 공격을 잡을 수 없다. Skill 파일이 세션 간에 변경됐는지 체크하는 해시 검증 레이어를 추가하거나, Skill 디렉토리를 읽기 전용으로 마운트해 변조 자체를 차단하는 방식을 고려해라.
- Skill Scanner나 DSP에만 의존하지 말고, 에이전트가 스크립트를 실행하기 전에 내용을 사람이 리뷰하거나 정적 분석 도구로 검사하는 파이프라인을 추가해라. 특히 Import-based injection(외부 모듈을 import하는 패턴)은 scanner가 잘 못 잡는다.
Code Example
# SMP 방어를 위한 Skill 파일 무결성 검증 예시
import hashlib
import json
from pathlib import Path
def compute_skill_hashes(skill_dir: str) -> dict:
"""Skill 패키지 내 모든 파일의 SHA256 해시를 기록"""
hashes = {}
for path in Path(skill_dir).rglob('*'):
if path.is_file():
content = path.read_bytes()
hashes[str(path.relative_to(skill_dir))] = hashlib.sha256(content).hexdigest()
return hashes
def verify_skill_integrity(skill_dir: str, baseline_hashes: dict) -> list:
"""이전 세션과 비교해 변경된 파일 탐지 (SMP 공격 감지)"""
current_hashes = compute_skill_hashes(skill_dir)
tampered = []
for filepath, expected_hash in baseline_hashes.items():
current_hash = current_hashes.get(filepath)
if current_hash != expected_hash:
tampered.append({
'file': filepath,
'expected': expected_hash,
'actual': current_hash or 'MISSING'
})
# 새로 추가된 파일도 의심
for filepath in current_hashes:
if filepath not in baseline_hashes:
tampered.append({'file': filepath, 'status': 'NEWLY_ADDED'})
return tampered
# 사용 예시
# Task A 실행 전: 기준 해시 저장
baseline = compute_skill_hashes('/workspace/.codex/skills/pdf')
with open('skill_baseline.json', 'w') as f:
json.dump(baseline, f)
# Task B 실행 전: 무결성 검증
with open('skill_baseline.json') as f:
baseline = json.load(f)
tampered_files = verify_skill_integrity('/workspace/.codex/skills/pdf', baseline)
if tampered_files:
print(f'⚠️ SKILL TAMPERING DETECTED: {tampered_files}')
raise SecurityError('Skill package has been modified between sessions!')Terminology
관련 논문
ALIGNBEAM: Cross-Vocabulary Logit Mixing을 통한 Inference-Time Safety Alignment 전이
도메인 파인튜닝으로 망가진 LLM 안전성을, 재학습 없이 추론 시점에 작은 안전 모델에서 빌려와 복구하는 방법.
iPad가 Tailscale에 연결되어 있었다: WebRTC 디버깅 이야기
WebRTC 데이터 채널에서 iPad만 응답을 못 받는 희귀 버그를 추적한 결과, webrtc-rs의 하드코딩된 MTU 상수와 Tailscale의 IPv6 Fragment 패킷 드롭이 동시에 작용한 복합 버그였다는 2주간의 디버깅 실화.
LLM이 고전적인 Hyperparameter 최적화 알고리즘을 이길 수 있을까?
LLM 기반 하이퍼파라미터 최적화 에이전트와 CMA-ES, TPE 같은 고전 알고리즘을 직접 비교한 연구로, LLM 단독으로는 고전 방법을 이기지 못하지만 두 방법을 합친 하이브리드 'Centaur'가 최고 성능을 낸다는 결론이 나왔다.
눈이 보는 것, LLM이 놓치는 것: Human Perception을 이용한 Adversarial Text Attack
Bold, 하이라이트, 공백 배치 같은 타이포그래피 트릭으로 GPT-4o, Llama Guard 등 10개 콘텐츠 모더레이션 시스템을 99% 이상 우회할 수 있다.
Claude가 rsync의 버그를 증가시켰는가? 데이터 분석
rsync 프로젝트에 Claude AI가 도입된 이후 버그가 늘었다는 소셜 미디어 주장을 실제 데이터와 통계 분석으로 검증한 글로, 결론적으로 Claude 도입 후 릴리즈가 역사적 분포에서 유독 버그가 많다는 통계적 근거는 없었다.
취약한 앱을 직접 만들고 LLM이 해킹할 수 있는지 $1,500 써서 실험해봤다
Firebase 취약점을 가진 앱을 직접 제작하고 GPT-5.5, Claude, Deepseek 등 주요 LLM이 자율적으로 해킹할 수 있는지 실험한 결과, GPT-5.5가 70% 성공률로 압도적이었고 Claude는 보안 거부 정책 때문에 능력과 무관하게 낮은 점수를 기록했다.
Related Resources
Original Abstract (Expand)
Agent skills occupy a privileged position in the agent workflow, as agents are expected to implicitly follow and execute them, rendering third-party skills a vulnerable attack surface. Existing studies have revealed unsafe agent behaviors induced by skill-based attacks, but they primarily evaluate poisoned skills within a single task execution and enumerate harms through ad-hoc risk lists. To bridge these gaps, we introduce SkillHarm, a benchmark of skill-based attacks across the skill-use lifecycle, paired with a systematic taxonomy of skill-relevant risks. SkillHarm evaluates two attack scenarios: Fixed-Payload Poisoning (FPP), where a fixed poisoned skill package directly compromises any task session that invokes it, and Self-Mutating Poisoning (SMP), where an initially benign execution silently mutates persistent skill content, deferring harm until a subsequent reuse. It further defines 12 risk types based on the agent workflow component targeted by the harm: data pipelines, system environments, and agent autonomy. To instantiate these attacks at scale, we build AutoSkillHarm, an automated construction pipeline with coding agents driven by natural-language harnesses. The resulting benchmark contains 879 attack samples across 71 skills. Experiments show that current agents remain vulnerable with attack success rates up to 86.3% in FPP and 69.3% in SMP. Our analysis further reveals a latent risk: many apparent attack failures stem from the agent failing to engage with the poisoned file rather than genuine resistance, and current defenses still fail to reliably mitigate the threat.