AI 에이전트가 실행하는 스킬을 누가 감사할까요?
요약
AI 에이전트가 사용하는 '스킬'은 편리하지만, 사용자가 설치한 스킬들이 쌓여 보안 위험을 초래할 수 있습니다. 이에 개발된 CLI 도구 skilltrust는 한 번의 명령으로 에이전트의 스킬 목록, 신뢰 설정 및 토큰 범위를 감사하여 사용자의 권한 관리를 돕습니다.
핵심 포인트
- AI 에이전트의 '스킬'은 보안 위험을 내포할 수 있습니다.
- skilltrust는 에이전트의 신뢰 표면(Trust Surface)을 감사하는 CLI 도구입니다.
- 출처와 권한에 기반하여 사실들을 목록화하며, 내용을 판단하지 않습니다.
- 결정론적이고 오프라인이며 stdlib 전용으로 설계되었습니다.
최근 많은 사람들이 Claude Code, Codex 및 유사한 에이전트에 '스킬(skills)'을 설치하기 시작했습니다. 스킬은 편리하지만, 그 편리함 뒤에는 아무도 검사하지 않는 자산들이 쌓이고 있습니다.
그래서 저는 사용자가 설치한 스킬들을 한 번의 명령으로 목록화하는 CLI 도구인 skilltrust를 만들었습니다. 이 글의 전반부에서는 '사용하기 전에 모든 것을 읽으라'는 것이 방어책이 될 수 없는 이유를 설명하고, 후반부에서는 해당 CLI와 그 설계를 보여드리겠습니다.
GitHub logo sunnydachs / skilltrust
AI 에이전트의 신뢰 표면(스킬, 후크, 신뢰 디렉터리, gh 토큰 범위)을 감사하는 결정론적이고 오프라인이며 stdlib 전용 CLI 도구
skilltrust
한 번의 명령으로 AI 에이전트의 신뢰 표면을 감사하세요: 스킬 목록, 신뢰 설정 및 토큰 범위 — 결정론적이고 오프라인이며 stdlib 전용입니다. 이 도구는 스킬 내용을 판단하지 않고, 출처(provenance)와 권한에 따라 사용자가 결정할 수 있도록 사실들을 목록화합니다.
English | 日本語
존재 이유
Agent skills (Claude Code, OpenClaw, Hermes skills)는 프롬프트-페이로드(prompt-payload) 패키지입니다. 스킬의 텍스트 자체가 에이전트에게 대한 지침이며, 이는 사용자의 셸(shell), 파일 시스템, 저장된 자격 증명과 함께 상속됩니다. 2026년 연구는 이 위험을 수치화했습니다. NVIDIA의 SkillSpector가 수행한 ("Agent Skills in the Wild", Liu et al.) 연구는 수집된 42,447개의 스킬 중 31,132개를 분석하여 26.1%가 최소 하나의 취약점을 포함하고 있으며, 5.2%는 악의적인 의도를 보일 가능성이 높다는 것을 발견했습니다. USENIX Security '26 논문인 "Do Not Mention This to the User"는 행동적으로 분석된 98,380개의 스킬 중 157개를 악성으로 확인했습니다. Snyk의 ToxicSkills 검사는 마켓플레이스 스킬 3,984개 중 36.8%가 결함이 있으며, 그중 76개가 명백히 악의적인 페이로드임을 발견했습니다. 감사 결과...
스킬이란 실제로 무엇인가: 사용자의 권한으로 실행되는 패키지
에이전트 스킬은 프롬프트 자체를 담아 배포하는 패키지입니다. 일단 설치되면, 이는 에이전트의 추론 과정 일부가 되며, 실행될 때 셸과 파일을 건드립니다. 즉, 에이전트에게 부여한 권한을 정확하게 상속받습니다.
스킬 내용물이 교체된다면, 그것은 당신의 기계에서 다른 누군가의 코드로 실행되는 것입니다.
당신에게 묻지 않고 파일에 접근하고, 자격 증명(credentials)에 도달하며 실행할 수 있는 타인의 코드입니다.
질문은 더 이상 "신뢰할 수 있는 출처에서 설치했으니 괜찮다"가 아니라, "현재 이 기계에는 무엇이 있나?"로 바뀝니다.
이것은 이론이 아닙니다 — 측정되었습니다
공포 이야기가 아닙니다. 2026년 연구와 감사 결과에 숫자가 있습니다. NVIDIA의 SkillSpector가 기반을 둔 기초 연구는 42,447개의 스킬을 수집하여 그중 31,132개를 분석했습니다. 그 결과, 26.1%가 최소 하나의 취약점을 포함하고 있었고, 5.2%는 악의적인 의도를 시사하는 높은 심각도의 패턴을 보였습니다.
USENIX Security '26 논문은 98,380개의 스킬을 분석하여 그중 157개가 명백히 악성임을 확인했습니다. 이들은 13가지 공격 기법에 걸쳐 632개의 취약점을 포함하는 의도적인 묶음입니다. Snyk의 ToxicSkills 보고서는 3,984개 마켓플레이스 스킬 중 36.8%에서 결함을 발견했으며, 그중 76개가 명백한 악성 페이로드였습니다.
ClawHavoc 캠페인에서는 감사만으로도 341개의 악성 스킬을 찾아냈는데, 대부분은 Atomic Stealer라는 자격 증명 탈취 도구를 배포하고 있었습니다.
다시 말해: 아무도 읽기 전부터 위험한 스킬들이 이미 설치된 재고처럼 대량으로 유통되고 있다는 것입니다.
“사용하기 전에 모든 스킬을 읽으세요” — 왜 이것이 통하지 않는가
현 시점에서 일반적인 조언은 다음과 같습니다: 사용하기 전에 모든 스킬을 읽으라는 것입니다. 하지만 이 조언에는 두 가지 실질적인 한계가 있습니다.
첫째, 확장성이 없습니다. 계속 늘어나는 더미 속의 모든 스킬을 검토하는 것은 한 사람이 할 수 없습니다. 둘째, 그리고 이것이 더 근본적인 문제입니다:
당신이 읽고 있는 텍스트 자체가 페이로드일 수 있습니다.
에이전트에게 방향을 제시하는 문장이라도 완전히 안전해 보이는 지침 속에 숨어 있을 수 있으며, 인간의 눈으로는 이를 포착할 수 없습니다. 정적 스캐너 역시 자연어로 작성된 의도(intent)에 대해서는 같은 취약점을 공유합니다.
그렇다면 효과적인 방어책은 무엇일까요? 제 대답은 다음과 같습니다: 당신의 출처(provenance)와 폭발 반경(blast radius)을 파악하는 것입니다. 구체적으로 네 가지를 확인해야 합니다:
- 무엇이 설치되었는지
- '신뢰됨(trusted)'으로 표시한 디렉토리가 무엇인지
- 훅(hooks, 세션 시작 시 실행되는 명령어)이 활성화되어 있는지
- 에이전트가 접근할 수 있는 과도하게 광범위한 GitHub 토큰이 있는지
skilltrust: 하나의 명령으로 재고 파악하기
skilltrust는 이 네 가지 질문을 하나의 명령어로 만듭니다. 내부적으로 하는 일은 다음과 같습니다:
설치된 스킬(Installed skills) ──┐
신뢰할 수 있는 디렉터리(Trusted directories) ──┼→ RiskMarkers ──→ 순위가 매겨진 검사(ranked checks) ──→ 하나의 행동(one action)
GitHub 토큰 범위(GitHub token scopes) ──┤ (파생된 값만) ↑ 첫 번째 발견 지점 (단 하나)
...
이것은 네 가지 입력을 수집하여 RiskMarkers라는 파생 값으로 압축하고, 고정된 우선순위 사다리를 따라가며, 다음으로 무엇을 해야 할지 정확히 한 줄을 출력합니다.
샘플 실행 결과(README에서 가져옴; 기계마다 카운트가 다를 수 있음):
AI-agent 신뢰 표면 스캔 — 2026-10-09
[스킬 인벤토리]
...
참고:
.agents는 에이전트 간에 공유되는 스킬 위치의 관례입니다.
당신이 읽어야 할 유일한 부분은 마지막 섹션, 즉 단 하나의 최고 우선순위 행동입니다. 이 예시에서는 너무 광범위한 GitHub 토큰 범위를 좁히는 것—5분 만에 해결할 수 있는 문제—을 제안합니다.
워크플로우 범위의 토큰은 CI를 재작성하고 소유하는 모든 리포지토리의 비밀(secrets)을 읽을 수 있으므로, 가장 먼저 제거할 가치가 있습니다. 전체 샘플 출력은 README에 나와 있습니다.
LLM에게 내용 판단을 맡기면 안 되는 이유
벌써 누군가 생각하고 있을 것입니다: 왜 스킬의 내용이 위험한지 여부를 LLM(대규모 언어 모델)이 결정하게 하지 않을까요? 저는 의도적으로 그렇게 하지 않았습니다. 두 가지 이유가 있습니다.
첫째, LLM의 내용에 대한 판정은 신뢰할 수 있다고 할 수 없습니다. 위에서 다루었듯이, 텍스트를 읽고
- 이는 스킬 내용이 위험한지 여부를 판단하지 않습니다. 오직 번들된 스크립트의 존재 유무와 개수만을 확인하며, 이는 측정 결과 2.12배 높은 취약점률을 가진 지표입니다.
- 지원되는 에이전트가 구성 파일 형식을 변경할 경우, skilltrust는 추적 업데이트가 필요합니다.
gh명령어가 설치되어 있지 않으면 토큰 섹션은 "사용 불가(unavailable)"로 보고됩니다.- 토큰 값 자체를 출력하는 일은 절대 없습니다. 스코프 이름만 출력합니다.
실행 시의 모습 (측정 기준)
저는 WSL2와 Python 3.14 환경에서 일반적인 개인 개발 환경을 대상으로 몇 개의 구성 파일을 스캔하며 테스트했습니다. 측정된 수치로 보면 다음과 같습니다:
- 런타임(Runtime): 0.01초 (세 번 측정한 결과 — 즉각적으로 느껴집니다)
- 테스트(Tests): 23개, 모두 통과 (CI는 Python 3.11부터 3.14까지 동일한 세트를 실행합니다.)
- 구현(Implementation): 814줄, 의존성 없음 (Python 표준 라이브러리만 사용)
단지 몇 개의 구성 파일만 읽어들이기 때문에, 사용자님의 기기에서도 몇 초 안에 완료될 것입니다.
요약: 읽기 전에 인벤토리 확인하기
스킬의 안전성은 "내가 모든 것을 다 읽었는가"로 결정되는 것이 아니라, 자신의 출처(provenance)와 영향 범위(blast radius)를 알고 있는가에 따라 결정됩니다. skilltrust는 단 하나의 명령어로 이 검사를 수행합니다.
무언가 문제가 생겼을 때 어디부터 찾아봐야 하는지 아는 것이 중요합니다. 하지만 더 큰 가치는 아무 문제가 발생하기 전에 인벤토리를 최신 상태로 유지하는 것입니다. 항상 최신 상태라면, 평소 목록과 달라지는 순간을 감지할 수 있습니다.
코드: skilltrust on GitHub — 버그 보고 및 아이디어는 이슈(issues)를 통해 환영합니다.
이것은 보증이 없는 개인 OSS 프로젝트입니다. 버그가 발생하거나 제안할 사항이 있다면, GitHub 이슈를 통해 연락하는 것이 가장 좋습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기