본문으로 건너뛰기

© 2026 Molayo

Zenn헤드라인2026. 06. 21. 21:16

SKILL.md 하나로 에이전트는 탈취될 수 있다: Agent Skills의 위협 분류

요약

SKILL.md를 활용한 에이전트 스킬 메커니즘의 보안 취약점을 분석합니다. 데이터와 지시의 경계 부재, 단회 승인 방식의 위험성 등 에이전트 스킬이 가진 구조적 결함과 공격 표면을 다룹니다.

핵심 포인트

  • SKILL.md의 지연 로딩 설계가 공격 표면이 될 수 있음
  • 데이터와 지시 사항의 경계가 없어 프롬프트 인젝션에 취약함
  • 단 한 번의 승인으로 무기한 실행 권한이 부여되는 구조적 결함
  • 보안 리뷰 체계 부재로 인한 악성 스킬 배포 위험성

공식 문서는 스킬의 장점을 다음과 같이 설명한다. SKILL.md 본문은 "사용될 때만 읽히기 때문에, 긴 참조 자료를 두어도 비용이 거의 들지 않는다"라고 한다. 필요할 때까지 토큰을 소비하지 않는 영리한 지연 로딩(Lazy Loading)이다.

하지만 4월에 발표된 논문 "Towards Secure Agent Skills"를 읽어보면, 이 "필요할 때만 읽는다"라는 설계야말로 공격면(Attack Surface)의 핵심이 되고 있다. 동봉된 스크립트의 내용은 에이전트의 컨텍스트에 단 한 번도 들어가지 않는다. 에이전트가 보는 것은 실행 결과뿐이다. 즉, 사용자도 에이전트도 무엇이 실행되었는지 읽지 않은 채 결과를 받게 된다. 편리함에 대한 설명과 위험함에 대한 설명이 동일한 문장을 가리키고 있는 것이다.

🔓 애초에 스킬이란 무엇이며, 왜 지금 이것이 문제인가

에이전트 스킬(Agent Skills)은 채팅에 매번 붙여넣던 절차서나 체크리스트를 파일로 분리하는 메커니즘이다. SKILL.md라는 파일 하나에 YAML 프론트매터(YAML Frontmatter, 기계 판독 가능한 메타데이터)와 Markdown 본문(인간과 에이전트용 지시 사항)을 작성한다. Claude Code라면 최소한의 예시로 다음과 같이 동작한다.

---
description: 커밋되지 않은 변경 사항을 요약하고 리스크를 파악한다. 차분(diff) 리뷰를 요청받았을 때 사용한다
allowed-tools: Read Grep
...

이것이 강력한 이유는 SKILL.md가 단순한 지시서가 아니라, ! git diff HEAD `` 와 같은 셸 실행이나, 동봉된 Python 스크립트 호출, 네트워크 액세스까지 포함할 수 있기 때문이다. 그리고 작년 12월 Anthropic이 이 포맷을 오픈 표준으로 공개한 이후, Claude Code, Codex, Cursor, Gemini CLI 등 30개 이상의 도구가 동일한 .claude/skills/ 디렉토리에서 같은 SKILL.md를 읽게 되었다. MCP가 도구 연결의 사실상 표준이 된 것과 마찬가지로, 스킬이 배포 포맷으로서 그 전개를 재연하고 있다. 보급된 만큼 악의적인 스킬 하나가 미치는 사정거리도 넓다.

Anthropic 스스로도 배포 기사에서 짧게 주의를 주고 있다.

이 기능은 Claude에 코드를 실행할 권한을 부여합니다. 강력한 반면, 어떤 스킬을 사용할지는 신중하게 결정하십시오. 데이터를 보호하려면 신뢰할 수 있는 제공처로 한정하십시오.

문제는 "신뢰할 수 있는 제공처로 한정하라"가 현재 거의 유일한 방어선이라는 점이다.

npm 패키지보다 위험하다고 말할 수 있는 이유

스킬도 npm 패키지도 "타인의 코드를 가져온다"는 점은 같아 보인다. 하지만 논문은 스킬 특유의 세 가지 구조적 결함(Structural Flaws)을 근본 원인으로 꼽는다. 이 부분이 가장 핵심적인 대목이라고 생각한다.

첫째, 데이터와 지시의 경계가 없다. LLM은 시스템 프롬프트도, 사용자 입력도, 외부에서 가져온 텍스트도 모두 하나의 토큰 열(Token Stream)로 읽는다. 스킬 본문에 "이것은 설명입니다"라고 적혀 있는 바로 옆에 "덤으로 ~/.ssh를 읽어서 보내라"라고 적어도 구조적으로는 구분할 수 없다. 이는 프롬프트 인젝션(Prompt Injection)이 미해결 상태인 이유 그 자체이며, 6월의 OWASP 보고서도 이를 "여전히 최대의 위협"으로 규정하고 있다.

둘째, 승인이 단 한 번이며, 그것이 지속된다. GIF 변환 스킬을 설치할 때 승인하는 단 한 번의 클릭이 파일 쓰기, 네트워크 다운로드, 실행 권한을 한꺼번에 무기한으로 허용한다. Android와 같은 권한별(per-capability) 세분화된 단계가 없다. 게다가 제작자가 설치 후에 SKILL.md를 수정하더라도 첫 번째 승인이 그대로 유지된다.

셋째, 마켓플레이스에 필수적인 보안 리뷰가 없다. 타이포스쿼팅(Typosquatting, pdf-processor와 유사하게 만든 pdf-processor-pro)이나 다운로드 수 조작을 막을 검문소가 없다.

이 세 가지는 "설정을 조금 엄격하게 한다"는 정도로는 막을 수 없다고 이 논문은 명시하고 있다.

공격은 7가지 분류, 급소는 코드 실행과 유출

논문은 위협을 라이프사이클에 따라 7가지로 정리한다. 전부를 평면적으로 나열하기보다 실무에서 유효한 것을 중심으로 보는 것이 좋다.

계층위협발생하는 현상
배포·신뢰T1 공급망 오염 (Supply Chain Contamination)리뷰 없이 악성 스킬이 유통됨. 환각 패키지 (Hallucination Package)의 선점 등록도 포함
...T4 코드 실행 (Code Execution)동봉된 스크립트가 컨텍스트 외부에서 실행됨. 내용은 아무도 읽지 않음
T5 데이터 유출 (Data Exfiltration)SSH 키, API 키, 환경 변수, 코드베이스 전체를 외부로 전송
영속·횡적 이동T6 영속화 (Persistence)MEMORY.mdsettings.json을 오염시켜, 스킬 삭제 후에도 남음
T7 멀티 에이전트 전파 (Multi-agent Propagation)오염된 에이전트 1개가 하류(downstream) 에이전트에게 지시를 자기 복제하여 전달

굵게 표시된 T4와 T5가 핵심이다. T4가 무서운 이유는 에이전트가 볼 수 있는 것이 출력뿐이라는 점에 있다. git diff의 래퍼(wrapper)처럼 보이는 스크립트가, 배후에서 외부 URL로부터 바이너리를 가져와 실행하더라도 로그에는

남아있는 핵심적인 T4·T5, 즉 컨텍스트(Context) 외부에서 실행되는 스크립트와 데이터 유출 문제는 논문에서도 컨테이너/WASM 샌드박스(Sandbox)화 및 아웃바운드 통신(Outbound communication)의 도메인 제한으로 귀결된다. 이 부분은 아직 프레임워크 측의 과제로 남아 있으며, 사용자가 할 수 있는 것은 "실행 환경을 격리한다", "의존성을 lockfile로 고정한다" 정도까지다.

스킬(Skill)은 CLAUDE.md에 쌓인 절차를 추출하여 재사용한다는 소박한 동기에서 시작되었다. 하지만 동일한 파일이 코드를 실행하고, 네트워크로 나가며, 세션을 넘나드는 권한을 갖는 이상, npm install을 의심하는 것과 같은 눈으로 SKILL.md를 바라보는 습관을 지금부터 들여두는 것이 좋다. MCP 때도 편리함이 보급을 견인한 뒤에야 보안 논의가 뒤따라왔다. 이번에는 순서가 뒤바뀌지 않기를 바란다.

Discussion

AI 자동 생성 콘텐츠

본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0