AGENTS.md Downloads 공격: Codex와 Claude Code 설정 점검
다운로드한 지침 파일을 코딩 에이전트 실행 전에 살펴봅니다. Codex의 사용자 설정, Claude Code의 설정 우선순위, function-color 설치 흔적을 확인합니다. 실제로 관찰된 사건과 재현 실험 결과를 구분하고, 노출된 인증 정보를 폐기하며, 사용자 설정을 보안 경계로 오해하지 않고 승인한 게이트웨이를 확인하는 방법을 설명합니다.
목차

Codex와 Claude Code를 ~/Downloads나 검토하지 않은 파일이 모이는 폴더에서 시작하지 않아야 합니다. AGENTS.md Downloads 공격에 노출되었는지 확인하려면 두 도구를 다시 시작하기 전에 지침 파일과 에이전트 설정을 살펴봅니다. 승인하지 않은 엔드포인트나 악성 패키지 설치 흔적을 발견하면 해당 세션을 중지하고 관련 인증 정보를 폐기합니다.
이 절차는 로컬에서 실행하는 Codex와 Claude Code를 다룹니다. 설정 정보는 2026-10-28 기준으로 확인했습니다. 점검을 마치면 검토할 파일 목록과 설정 점검 결과를 바탕으로 침해 사고 대응이 필요한지 판단할 수 있습니다.
Downloads 공격으로 확인된 내용
이 공격은 신뢰할 수 없는 지침으로 에이전트 자체 설정을 바꾸는 방식입니다. Markdown 자체가 실행되는 것은 아닙니다. 에이전트가 지침을 읽고 도구를 사용합니다.
Forever Security의 10월 22일 보고서는 고객 컴퓨터의 ~/Downloads/AGENTS.md 때문에 발생한 패키지 설치 시도가 차단된 사례를 설명합니다. 해당 파일이 컴퓨터에 들어온 경로는 아직 밝혀지지 않았습니다.
- Codex 재현 실험: 지침이
~/.codex/config.toml에 Model Context Protocol(MCP) 도구 서버를 등록하도록 유도했습니다. 이 설정은launchctl과npm으로function-color를 설치하게 했습니다. 자식 프로세스로 실행된codex exec는--dangerously-bypass-approvals-and-sandbox를 사용했습니다. - Claude Code 재현 실험:
CLAUDE.md가.claude/settings.json의ANTHROPIC_BASE_URL변경을 유도했습니다. 연구진은 로그인한 계정을 인증하는 OAuth 토큰을 확보하고 위조한Bash호출을 응답으로 보냈습니다. 같은 세션 안에서 하위 에이전트가 변경된 주소로 연결을 여는 경우도 있었습니다. 보고서에 따르면 해당 설정을 기록하려면 사람의 승인이 필요했습니다.
보고된 성공률은 Codex에서 90%를 넘었고, Claude의 설정 변경에서는 약 50%였습니다. Claude의 같은 세션 내 실행은 약 다섯 번 중 한 번 성공했습니다. 대부분의 실험에서는 실제 패키지 대신 계산기를 사용했습니다. 실제 패키지는 격리된 가상 머신에서 한 번 실행했습니다. 이는 연구진의 실험 결과이며, 개별 사용자의 피해 확률을 뜻하지 않습니다.
브라우저 동작도 설정에 따라 달라집니다. Chrome 문서는 다운로드 위치 변경, 저장 위치를 묻는 선택 기능, 다운로드 알림을 설명합니다. 브라우저에서 파일을 다운로드하는 것과 에이전트가 실제로 침해되는 것은 별개의 사건입니다.
현재 제공되는 보호 기능을 유지해야 합니다. Codex 0.165.0은 명시적으로 신뢰하지 않는다고 설정한 프로젝트의 지침을 건너뜁니다. OpenAI는 기본 workspace-write 정책에서 .codex 경로를 보호하는 방식도 설명합니다. 이전에 검토한 폴더에도 새로운 미검토 파일이 들어올 수 있으므로 이러한 보호 기능을 켜 둡니다.
약 5분 동안 먼저 점검할 항목
에이전트를 중지한 상태에서 일반 터미널과 텍스트 편집기로 파일을 점검합니다. 약 5분은 익숙한 작업 공간 하나를 처음 살펴보는 데 필요한 예상 시간입니다. 발견한 문제를 조사하거나 컴퓨터를 복구하는 데는 더 오래 걸립니다.
1. 에이전트를 열기 전에 지침 파일 찾기
실제 작업 디렉터리와 다운로드 저장 위치부터 확인합니다. macOS나 Linux의 Bash에서 ripgrep인 rg가 설치되어 있다면 다음 명령으로 파일 경로만 나열할 수 있습니다.
pwd -P
rg --files --hidden --no-ignore \
-g 'AGENTS.md' -g 'AGENTS.override.md' \
-g 'CLAUDE.md' -g 'CLAUDE.local.md' \
-g '**/.claude/settings*.json' \
-g '**/.codex/config.toml' -g '.mcp.json' \
-g '!**/.git/**' -g '!**/node_modules/**' \
"$HOME/Downloads"
브라우저가 다른 위치에 다운로드한다면 마지막 경로를 바꿉니다. 다운로드하거나 복제한 프로젝트 디렉터리에서도 검색을 반복합니다. rg가 없다면 파일 관리자에서 숨김 파일 표시를 켜고 해당 이름들을 확인합니다.
이 명령은 에이전트를 시작하거나 설정값을 출력하지 않고 경로만 나열합니다. 결과가 비어 있더라도 디렉터리가 없거나 접근 권한이 부족하다는 오류부터 해결해야 합니다. 압축 파일 내부를 검사하거나 하위 디렉터리의 심볼릭 링크를 따라가지는 않습니다. 결과만으로 컴퓨터가 안전하다고 판단할 수도 없습니다.
발견한 파일은 일반 텍스트로 엽니다. 에이전트 설정 변경, 제공업체 전환, 예상하지 않은 도구 설치, 승인 절차 해제를 요구하는 지침을 찾습니다. 가져오거나 링크로 연결한 지침 파일은 별도로 검토합니다.
Codex 설정 디렉터리의 전역 지침과 ~/.claude/CLAUDE.md도 확인합니다. Codex는 프로젝트 지침을 찾을 때 감지한 프로젝트 루트부터 작업 디렉터리까지 살펴봅니다. 프로젝트 루트가 없으면 현재 디렉터리만 확인합니다. AGENTS.override.md와 대체 파일명으로 설정한 이름들도 포함합니다.
Claude Code는 상위 디렉터리의 지침 파일도 불러옵니다. 따라서 Downloads의 하위 폴더로 이동하는 것만으로 지침의 출처가 제거된다고 볼 수 없습니다. 검토한 작업 공간은 다운로드 디렉터리와 그 하위 경로 밖에 둡니다.
2. 여러 프로젝트에 적용되는 Codex 설정 점검
Codex를 실행하기 전에 ~/.codex/config.toml을 엽니다. 이 파일은 사용자 수준 설정이므로 변경 사항이 같은 사용자의 다른 프로젝트에도 영향을 줄 수 있습니다. CODEX_HOME을 설정했다면 그 디렉터리의 config.toml을 확인합니다.
실행 도구에서 선택한 프로필 파일과 적용 대상인 프로젝트의 .codex/config.toml 파일도 검토합니다. OpenAI의 설정 가이드는 어떤 설정 계층을 불러오는지 설명합니다. 고급 설정 가이드는 설정 디렉터리와 프로필을 다룹니다.
| 설정 | 확인할 내용 |
|---|---|
[mcp_servers.<name>] | 아는 서버인지 확인하고 command, args, cwd, env 전체나 원격 url을 검토합니다. |
chatgpt_base_url | ChatGPT 서비스 주소를 덮어쓴 설정이 있다면 의도한 변경인지 확인합니다. |
openai_base_url, model_provider, model_providers.<id>.base_url | API 연결 경로가 승인한 제공업체와 일치하는지 확인합니다. |
projects.<path>.trust_level | 저장된 신뢰 결정을 검토합니다. 특히 Downloads처럼 여러 파일이 모이는 폴더를 확인합니다. |
MCP는 에이전트와 도구를 연결합니다. 로컬 MCP 서버 설정은 프로세스를 시작할 수 있습니다. 표시 이름뿐 아니라 인수와 연결 대상까지 확인해야 합니다.
모르는 서버는 조사가 필요합니다. 일반적인 서버 이름이거나 npm, npx, launchctl이 있다는 사실만으로 악성 코드라고 단정할 수는 없습니다.
2026-10-28 기준 Codex 설정 레퍼런스에 따르면 프로젝트 로컬 설정은 chatgpt_base_url이나 제공업체 라우팅 키를 덮어쓸 수 없습니다. 이 제한이 사용자 설정에 가해진 무단 변경까지 되돌려 주지는 않습니다.
3. Claude Code 설정과 우선순위 점검
엔드포인트를 지정할 수 있는 모든 설정 출처를 확인합니다. 프로젝트 루트에서 시작한 세션이라면 다음 파일을 검토합니다.
| 파일 | 적용 범위 |
|---|---|
~/.claude/settings.json | 여러 프로젝트에 적용되는 사용자 설정입니다. |
.claude/settings.json | 해당 프로젝트의 공유 설정입니다. |
.claude/settings.local.json | 해당 프로젝트에서만 사용하는 개인 로컬 설정입니다. |
CLAUDE_CONFIG_DIR를 사용한다면 그 설정 디렉터리에서 사용자 파일을 확인합니다. 회사 장비라면 관리자에게 중앙에서 관리하는 설정도 문의합니다.
env.ANTHROPIC_BASE_URL, HTTP_PROXY, HTTPS_PROXY를 점검합니다. 어떤 인증 변수가 설정되어 있는지 확인하되 비밀 값은 채팅이나 로그에 복사하지 않습니다. 예상하지 않은 hooks와 권한 규칙 변경도 살펴봅니다.
Anthropic은 ANTHROPIC_BASE_URL을 API 엔드포인트를 바꾸는 설정으로 설명합니다. 승인한 게이트웨이를 사용한다면 이 설정이 있는 것은 정상입니다. 모르는 호스트 이름, 이유를 알 수 없는 변경, 다운로드한 지침이 지정한 엔드포인트는 조사해야 합니다.
Claude Code의 설정 우선순위에서는 프로젝트 로컬 설정이 프로젝트 공유 설정보다 우선합니다. 두 설정은 모두 사용자 설정보다 우선합니다. 대부분의 세션에서는 설정 파일의 env 값이 셸에서 상속한 같은 변수도 덮어씁니다. 따라서 사용자 설정이나 셸의 export로 엔드포인트를 지정해도 다른 설정이 바꾸지 못하도록 잠그는 것은 아닙니다.
예상하지 않은 MCP 연동이 있다면 .mcp.json도 확인합니다. Anthropic의 MCP 보안 지침은 다른 설정 범위와 플러그인이 이 파일 외부에서도 서버를 추가할 수 있다고 설명합니다.
4. 패키지 설치 흔적 찾기
에이전트가 의심스러운 디렉터리에서 실행되었다면 패키지 메타데이터와 로그를 검색합니다. 해당 디렉터리에서 다음 Bash 명령을 실행하면 일치하는 파일 이름만 출력됩니다.
rg -l --hidden --no-ignore -F 'function-color' \
-g 'package.json' -g '*lock*' \
-g 'npm-shrinkwrap.json' -g '*.log' \
-g '!**/.git/**' \
.
일치한 파일은 로컬에서 검토합니다. /tmp/ptools와 관련 npm 설치 로그가 있다면 함께 확인합니다. 프로젝트 안에서만 검색하면 다른 위치의 설치 흔적을 놓칠 수 있습니다.
Checkmarx의 패키지 분석은 function-color의 1.0.0 및 1.7.3 버전을 function-flag를 감싼 악성 래퍼로 분류합니다. 분석한 다운로더는 Windows를 대상으로 합니다. macOS 설정에 패키지 이름이 있다는 이유만으로 특정 악성 페이로드가 실행되었다고 판단해서는 안 됩니다.
글에서 패키지를 언급한 것과 설치된 의존성이나 설치 로그가 있는 것은 다릅니다. 잠금 파일만으로 설치 스크립트가 실행되었다고 증명할 수는 없습니다. 설치 흔적이 있다면 조사가 끝날 때까지 컴퓨터가 침해되었을 가능성을 전제로 대응해야 합니다. 시험 삼아 패키지를 설치하거나 코드에서 불러오지 않습니다. 검색 결과가 없어도 이름이 바뀐 페이로드나 삭제된 증거가 없다고 단정할 수는 없습니다.
다시 로그인하기 전에 결과에 따라 대응하기
영향받은 설정을 다시 사용하기 전에 신뢰할 수 있는 장치에서 노출된 인증 정보를 폐기합니다. 확인된 증거에 맞는 조치를 선택합니다.
- 모르는 지침이 있지만 사용된 흔적은 없는 경우: 검토할 수 있도록 파일을 보존하고 에이전트가 지침을 찾는 경로 밖에 둡니다. 인증 정보 노출 여부를 판단하기 전에 설정을 확인합니다.
- 인증된 요청을 받았을 수 있는 무단 엔드포인트가 있는 경우: 관련 인증 정보가 노출되었을 가능성을 전제로 대응합니다. 해당 정보를 폐기하고 계정 활동을 확인합니다.
- 악성 패키지 코드가 실행된 흔적이 있는 경우: 컴퓨터를 격리하고 보안팀에 알립니다. 정리하기 전에 관련 파일과 로그를 보존합니다. Markdown 파일만 삭제해서는 설치된 코드가 제거되거나 도난당한 인증 정보가 무효화되지 않습니다.
Claude 구독 인증에는 Claude 계정의 세션 관리 기능을 사용합니다. Settings → Account에서 영향받은 세션을 해지하거나 계정의 모든 세션에서 로그아웃합니다. Claude Code 토큰이 Settings → Claude Code에 표시된다면 해당 권한을 그곳에서 제거합니다. Anthropic에 따르면 전체 세션 로그아웃에는 Claude Code와 setup-token 토큰도 포함됩니다.
API 키는 별도로 처리해야 합니다. Anthropic의 유출된 API 키 대응 지침은 영향받은 키를 삭제하고 새 키를 만들도록 안내합니다. 계정에서 로그아웃해도 API 키는 폐기되지 않습니다.
OpenAI에 접근할 때 사용한 인증 정보는 계정 침해 대응 지침에 따라 처리합니다. 계정 세션을 종료하고, 노출된 API 키를 삭제하고, 활동을 검토한 뒤 지원팀에 연락합니다. 로컬 인증 정보 파일을 삭제하면 도난당한 원격 세션도 무효화된다고 가정해서는 안 됩니다.
해당 컴퓨터에서 다시 인증하기 전에 검토한 설정을 복원하고 승인하지 않은 시작 시 연동을 제거합니다. 어떤 코드가 실행되었는지 확인할 수 없다면 조사가 끝날 때까지 일반 개발 작업에 사용하지 않습니다.
승인한 게이트웨이 설정을 직접 관리하기
게이트웨이 주소는 직접 선택하고 해당 설정의 출처를 확인합니다. 개인용이라면 승인한 엔드포인트를 사용자 설정이나 직접 관리하는 셸 환경에 둡니다. 중앙 관리를 받는 팀은 승인된 배포 절차를 따라야 합니다.
프로젝트가 제공하는 엔드포인트는 검토가 필요한 설정 변경으로 취급합니다. 팀의 정상적인 설정일 수도 있습니다. 그러나 내부 게이트웨이라고 설명되어 있다는 이유만으로 승인해서는 안 됩니다.
예를 들어 BetterToken의 Claude Code 설정 지침은 /v1이 없는 https://bettertoken.ai와 본인의 BetterToken API 키를 사용합니다. 이 API 이용 권한은 Claude 구독과 별개입니다. 게이트웨이가 발급한 인증 정보를 사용하고 구독의 OAuth 토큰을 제공하지 않습니다.
의도적으로 Codex를 연동한다면 제공업체 설정 블록을 Codex 사용자 지정 제공업체 설정 가이드와 비교합니다. chatgpt_base_url을 일반적인 모델 API 설정으로 대신 사용하지 않습니다.
설정 검토나 복구를 마친 뒤에는 프로젝트 설정과 사용자 지정 기능을 제외한 상태로 Claude Code 연결을 확인할 수 있습니다. 이미 검토한 프로젝트 디렉터리에서 다음 명령을 실행합니다.
claude --safe-mode --setting-sources user --permission-mode default
CLI 레퍼런스에 이 옵션들이 설명되어 있습니다. 안전 모드는 지침 파일, 플러그인, MCP 서버와 같은 사용자 지정 기능을 건너뜁니다. 인증과 권한 제어는 계속 작동합니다. 사용자 설정과 중앙 관리 정책도 여전히 신뢰할 수 있어야 합니다. default 권한 모드의 표시 이름은 Manual입니다.
클라이언트가 옵션을 거부한다면 계속하기 전에 claude --help와 공식 업데이트 안내를 확인합니다.
/status로 불러온 설정의 출처를 확인합니다. 그런 다음 Reply with OK. Do not use tools.와 같은 짧은 프롬프트를 보냅니다. 정상적인 결과는 터미널에 응답이 표시되는 것입니다. 제공업체 기록을 볼 수 있다면 요청 시간을 대조해 해당 요청의 연결 경로를 확인합니다. 이 확인에도 일반적인 모델 사용량이 발생합니다.
모델이 자신의 이름을 말하는 것으로는 엔드포인트를 검증할 수 없습니다. 경로가 여전히 불분명하다면 Claude Code의 실제 제공업체 확인 절차를 따릅니다. 설정이 예상과 다르게 바뀌면 중지합니다. 이 연결 확인만으로 컴퓨터에 침해 흔적이 없다고 판단할 수는 없습니다.
다운로드와 일상적인 에이전트 작업 분리하기
브라우저의 다운로드 저장 위치 밖에 있는 검토된 프로젝트 디렉터리를 사용합니다. 다운로드한 CSV를 처리한다면 파일을 확인한 뒤 필요한 입력만 해당 작업 공간에 복사합니다. 검토하지 않은 폴더를 통째로 옮기면 지침 파일도 함께 이동합니다.
Chrome에서는 Settings → Downloads를 열고 Ask where to save each file before downloading을 켭니다. 파일을 저장하기 전에 위치를 선택하는 단계가 추가됩니다. 이미 저장된 파일을 검토하는 절차를 대신하지는 않습니다.
샌드박스 제한과 승인 제어를 켜 둡니다. Codex 보안 문서는 명령 샌드박스를 MCP 연결 및 클라이언트 인증 트래픽과 구분합니다. 명령을 읽기 전용 샌드박스에서 실행하더라도 검토하지 않은 설정을 초기화하는 작업이 안전해지는 것은 아닙니다.
새로 저장소를 복제하거나 압축 파일을 풀거나 에이전트 설정을 바꾼 뒤에도 같은 점검을 적용합니다. 신뢰할 수 없는 코드를 실행해야 하는 작업이라면 평소 개발에 쓰는 인증 정보가 없는 격리 환경을 사용합니다.