Config Files That Run Code: Supply Chain Security Blindspot
TL;DR Highlight
VS Code, Cursor, Claude Code, npm 등 널리 쓰이는 도구들이 config 파일에 담긴 shell 명령을 자동 실행하는 구조를 악용한 공급망 공격 사례를 분석한 글로, 개발자가 저장소를 clone하고 에디터를 여는 순간 공격자 코드가 실행될 수 있다.
Who Should Read
오픈소스 저장소를 clone해서 작업하거나 AI 코딩 에이전트(Cursor, Claude Code 등)를 사용하는 개발자, 그리고 팀에 주니어 개발자가 있어 보안 가이드를 제공해야 하는 시니어 개발자나 DevSecOps 담당자.
Core Mechanics
- 저장소를 clone하고 에디터나 에이전트를 열기만 해도 공격자 코드가 실행될 수 있다. 악성 의존성이나 install 스크립트 없이, 평범해 보이는 config 파일 하나만으로 가능하다.
- VS Code, Cursor, Claude Code, Gemini CLI, npm, Composer, Bundler 모두 config 파일에 shell 명령을 담을 수 있고, 폴더를 열거나 에이전트 세션이 시작될 때 자동으로 실행된다. 대부분은 개발자가 무심코 클릭하는 일회성 trust 프롬프트 뒤에서 작동한다.
- 실제 사례로 'Miasma 웜'이 분석됐다. icflorescu/mantine-datatable 저장소에 커밋 f72462d9가 들어왔는데, github-actions 봇 이름으로 서명 없이 푸시된 커밋이며 'chore: update dependencies [skip ci]'라는 제목으로 위장했다.
- 해당 커밋은 파일 6개를 추가했는데, 5개는 6번째 파일인 `.github/setup.js` 드로퍼를 실행하기 위한 런처다. 드로퍼 파일 크기는 4,348,254바이트(약 4.3MB)로, GitHub 코드 검색 인덱싱 한계(약 384KB)를 초과해 내용이 검색에 노출되지 않도록 설계됐다.
- 드로퍼 코드는 Caesar cipher(문자 회전 암호)로 난독화된 숫자 배열을 eval()로 실행하는 구조다. 시프트값 4로 정적 디코딩하면 AES로 암호화된 credential stealer를 복호화해 실행하는 Bun 로더가 나온다.
- credential stealer는 AWS, Azure, GCP, Vault, Kubernetes, npm, GitHub 시크릿을 스캔하고, 탈취한 정보를 공격자가 만든 공개 GitHub 저장소로 exfiltrate(외부 유출)한다. 이 패턴으로 121개 저장소가 영향을 받았다.
- 이 난독화 패턴(숫자 배열 → 소형 회전 함수 → eval → 암호화된 페이로드)은 Miasma에만 국한된 게 아니라, supply chain 공격자들이 재사용하는 범용 패턴이다. config 파일이 명령 실행 트리거가 되는 이상, 메타데이터가 아니라 실행 프리미티브로 봐야 한다.
- 보안 리뷰 프로세스에서 config 파일은 거의 검토되지 않는다는 게 핵심 문제다. `.vscode/settings.json`, `.cursor/config`, `package.json`의 scripts 필드 등은 코드 리뷰에서 흔히 그냥 넘어간다.
Evidence
- '이건 MS Word 매크로 사태의 재현이다'라는 비유가 나왔다. 실행 가능한 콘텐츠를 문서나 설정 파일에 숨기는 패턴은 수십 년째 반복되고 있다는 지적이다.
- VS Code를 사용하는 주니어 개발자를 둔 팀 리더가 '이런 공격이 있다는 건 들었지만 정확히 어떻게 작동하는지 몰랐는데 이 글이 팀원들에게 설명하기 좋은 자료가 됐다'고 공유했다.
- Windows Defender가 하루에 2~3번 codex/config.toml을 '악성코드 분석 제출' 요청하는 현상을 경험한 사용자가 있었다. 이 글을 보고 그 이유를 이해하게 됐다는 반응이며, Microsoft가 경쟁사 도구 사용 패턴을 수집하려는 의도도 있을 수 있다는 의구심도 제기됐다.
- '이게 blindspot이라고? 몇 년 동안 사람들이 지적해왔는데 아무도 안 신경 쓴다'는 냉소적 반응도 있었다. 보안 사고가 나도 잠깐 관심받다가 잊혀지는 패턴이 반복된다는 지적이다.
- 'VS Code가 config 파일의 명령 실행을 완전히 막을 수 있냐'는 실용적인 질문이 나왔지만 명확한 답변은 없었다. CIA도 이걸 '기능'으로 본다는 비꼬는 댓글도 달렸는데, 이미지나 링크를 '실행'하려는 메신저 앱들과 같은 맥락이라는 비유였다.
How to Apply
- 오픈소스 저장소를 clone할 때 에디터로 열기 전에 `.vscode/`, `.cursor/`, `.github/`, `package.json` scripts 필드, `composer.json`, `Gemfile` 등 config 파일을 먼저 텍스트로 확인하는 습관을 들이면, 자동 실행 트리거를 사전에 감지할 수 있다.
- CI/CD 파이프라인에서 PR 리뷰 자동화 도구에 `.vscode/settings.json`, `.cursor/**`, `.github/*.js` 같은 config 파일 변경이 포함된 PR을 별도로 플래그하도록 설정하면, 코드 리뷰에서 놓치기 쉬운 config 파일 수정을 의무 검토 대상으로 올릴 수 있다.
- AI 코딩 에이전트(Cursor, Claude Code, Gemini CLI)를 팀에 도입한 경우, 에이전트가 자동으로 읽는 config 파일 경로 목록을 문서화하고, 외부 저장소 코드를 에이전트 작업 디렉토리에 포함할 때 해당 파일들을 격리된 환경(예: devcontainer, VM)에서 먼저 확인하는 프로세스를 만들면 초기 실행 위험을 줄일 수 있다.
- 팀 내 보안 가이드에 'commit이 github-actions 봇 이름이지만 서명이 없고, skip ci 태그가 있으며, 대용량 파일(수백 KB 이상)이 `.github/` 아래 추가된 경우'를 의심 패턴으로 추가하면 Miasma류 공격을 조기에 탐지하는 데 도움이 된다.
Code Example
// .github/setup.js @ f72462d9 (악성 드로퍼 첫 180바이트 예시)
// Caesar shift로 난독화된 숫자 배열을 eval로 실행하는 패턴
try{
eval(
function(s,n){
return s.replace(/[a-zA-Z]/g, function(c){
var b = c <= "Z" ? 65 : 97;
return String.fromCharCode((c.charCodeAt(0) - b + n) % 26 + b)
})
}(
[40,119,111,117,106,121,40,41,61,62,123, /* ... 4MB truncated */],
4 // Caesar shift value
)
)
} catch(e) {}
// 이 패턴이 config 파일에서 발견되면 즉시 실행 중단 필요
// 디코딩하면: AES 암호화된 credential stealer 로더가 나옴Terminology
Related Papers
Ask HN: What are tools you have made for yourself since the advent of AI?
Hacker News 커뮤니티에서 AI를 활용해 개발자들이 직접 만들어 쓰는 개인 도구들을 공유한 스레드로, '하이퍼-퍼스널 소프트웨어' 트렌드를 잘 보여준다.
Show HN: Lathe – Use LLMs to learn a new domain, not skip past it
LLM이 대신 코드를 짜주는 게 아니라, 직접 손으로 따라할 수 있는 실습형 튜토리얼을 생성해주는 CLI 도구다. AI에게 생각을 맡기는 대신 배움의 도구로 활용하는 접근법이라 주목받고 있다.
Meta confirms 1000s of Instagram accounts were hacked by abusing its AI chatbot
Meta의 AI 챗봇에 있던 이메일 검증 버그로 인해 2FA(2단계 인증)를 사용하지 않던 Instagram 계정 2만 개 이상이 약 2개월간 해킹됐다. AI를 계정 복구 시스템에 통합할 때 발생할 수 있는 보안 취약점의 실제 사례다.
DuMate-DeepResearch: An Auditable Multi-Agent System with Recursive Search and Rubric-Grounded Reasoning
Baidu가 만든 Deep Research 멀티에이전트 프레임워크로, DAG 기반 동적 플래닝 + 재귀 검색 에이전트 + Rubric 스캐폴딩을 조합해 두 벤치마크에서 SOTA를 달성했다.
Anthropic's open-source framework for AI-powered vulnerability discovery
Anthropic이 Claude를 활용해 코드 취약점을 자율적으로 탐지·트리아지·패치하는 오픈소스 레퍼런스 구현체를 공개했다. 실제 보안팀과의 협업 경험을 바탕으로 만들어진 파이프라인이라 실전 적용성이 높다.
Will the Agent Recuse Itself? Measuring LLM-Agent Compliance with In-Band Access-Deny Signals
서버가 SSH 배너나 DB NOTICE로 'AI 에이전트는 접근하지 마세요' 신호를 보내면 GPT-4o, Claude Code 같은 LLM 에이전트가 실제로 물러나는지 실험으로 측정했다.