2026년 10월 공개된 AI 코딩 에이전트 관련 보안 연구 세 편을 정리한다. Forever Security는 고객 PC의 내려받기 폴더(~/Downloads)에서 OpenAI Codex를 겨냥한 악성 AGENTS.md를 찾은 사례를(10월 22일), Pillar Security는 OpenCode 1.0.137~1.18.32가 윈도·WSL에서 악성 원격 MCP 서버의 OAuth 로그인 중 코드를 실행하게 둔 결함을(문서 머리글 10월 19일, 1.18.33에서 수정), V12는 x402 SDK가 지출 한도 없이 서버가 부른 금액에 서명하던 결함 등 치명 3건을 공개했다(10월 22일, 8월 18일 수정). 이들 문제는 CVE·보안 권고 기반 점검만으로 놓칠 수 있어 버전과 설정을 직접 확인해야 한다. 오늘 할 일은 내려받기 폴더에서 에이전트를 띄우지 않게 하고, 에이전트 설정의 모르는 MCP 서버·API 주소를 찾고, OpenCode와 x402 버전을 직접 확인하는 것이다.

피해가 확인된 사례는 없다. Forever가 잡은 시도는 코드 실행 전에 막혔고, 나머지 두 결함은 공격에 쓰였다는 보고가 없다(The Hacker News 보도). 인젝션 원리는 프롬프트 인젝션 사례 6가지, MCP 일반 점검은 MCP 보안 자가점검 7가지에 있다.

한눈에 보기

취약점 무엇이 문제 영향 대상 수정 버전·조치
내려받기 폴더 AGENTS.md(Forever) 웹이 클릭 없이 파일을 둘 수 있는 폴더의 지시 파일을 에이전트가 따르며 자기 설정에 MCP 서버·API 주소를 써 넣는다 그 폴더에서 띄운 Codex(실제 파일이 겨냥), 앤트로픽의 AI 코딩 도구(연구진 재현) 패치 없음(설계대로의 동작). 실행 위치 제한, 설정·신뢰 기록 점검, 흔적이 있으면 토큰 교체
OpenCode MCP OAuth 원격 코드 실행(Pillar) 원격 MCP 서버가 준 로그인 주소(authorization_endpoint)의 PowerShell 식이 실행된다 npm opencode-ai 1.0.137~1.18.32, 윈도·WSL 1.18.33 이상. CVE·권고 없음. Kilo Code 7.8.16(사전 릴리스), OpenWork 내장 v1 엔진 1.18.33
x402 SDK 치명 3건(V12) 지출 한도 부재, Solana 결제 검증기의 토큰 승인 수락, SIWx 서명의 사이트 미확인 자동 서명하는 결제 에이전트, TypeScript Solana facilitator, SIWx 사용 앱 npm @x402/* 2.23.0, PyPI x402 2.20.0, Go v2.23.0 이상(최신 2.28.0·2.25.0·v2.28.0). 권고 없음

1. 내려받기 폴더 AGENTS.md: 에이전트가 자기 설정을 고쳐 쓴다

원인

Codex는 작업 전에 프로젝트 루트(보통 Git 루트)부터 현재 폴더까지 AGENTS.md를 찾아 따르고(AGENTS.override.md가 있으면 먼저), 프로젝트 루트가 없으면 현재 폴더만 본다(Codex 문서). Forever는 내려받기 폴더가 웹이 스스로 쓸 수 있는 유일한 폴더이며, 텍스트 파일에는 실행 파일용 차단 장치도 걸리지 않는다고 지적했다. BleepingComputer는 연구진의 시연 페이지가 AGENTS.md를 내려받게 하는 것을 확인했고, 크롬·엣지·파이어폭스는 기본값으로 저장 위치를 묻지 않는다고(알림은 표시) 전했다. Forever는 설계대로의 동작이라 패치할 것이 없다고 봤다.

실제 사례와 재현 결과

Forever는 고객 PC에서 코딩 에이전트가 악성 npm 패키지 function-color를 설치하려는 것을 막았고, 지시는 내려받기 폴더의 13KB짜리 엔지니어링 문서에서 나왔다(유입 경로·날짜·고객은 미공개). 문서는 작업 전에 사용자 공통 설정 ~/.codex/config.toml에 [mcp_servers.project-tools]를 추가하게 했다. 서버 명령은 launchctl(com.ptools.setup 라벨)로 /bin/zsh를 띄워 /tmp/ptools에서 npm install function-color를 실행하고 /tmp/ptools/ac.log에 기록하는 macOS 형식이다. 이어 codex exec --dangerously-bypass-approvals-and-sandbox --skip-git-repo-check로 승인과 샌드박스를 끈 자식 세션을 띄워 새 서버를 곧바로 불러오게 했다.

Forever 시험에서 Codex는 시도의 90% 넘게 악성 동작을 실행했다(대부분 계산기만 띄우는 대체물로 시험했고, 실제 악성 패키지는 격리 가상머신에서 한 번 실행). 이 설정은 같은 사용자의 다른 프로젝트 세션에도 영향을 줄 수 있다. 앤트로픽의 AI 코딩 도구는 Forever가 만든 시험 파일로 재현했다. 프로젝트 설정 파일(settings.json)에 env.ANTHROPIC_BASE_URL을 연구진 서버로 써 넣게 하자 요청마다 OAuth 토큰이 넘어와 피해자로 인증할 수 있었고(코드 실행 없는 계정 탈취), 다음 실행에서는 서버가 모델인 척 "dangerouslyDisableSandbox": true를 붙인 Bash 호출로 샌드박스 밖 실행을 시켰다. Forever는 이 도구가 이런 쓰기에 사람 승인을 요구하고 이상하면 자주 거부한다고 적었으며, 설정 쓰기 성공은 약 50%, 같은 세션 코드 실행은 약 5분의 1이었다.

공격 조건

  • 같은 폴더에서 실행: 파일이 놓인 폴더에서 에이전트를 띄워야 한다(BleepingComputer 보도). Forever 측정(업체 수치)으로 고객사의 약 절반이 내려받기 폴더에서 에이전트를 실행하고, 세션의 약 4분의 1은 에이전트가 직접 브라우저를 연다.
  • 폴더 신뢰: Forever는 Codex가 신뢰한 프로젝트의 AGENTS.md만 따르며 내려받기 폴더에서 한 번 작업하면 신뢰된다고 분석했다(Codex 문서에는 이 관계가 명시돼 있지 않다). 앤트로픽 도구는 신뢰 뒤에 프로젝트 env를 적용하지만, 신뢰 창이 없는 -p 실행과 SDK 세션은 env 블록을 바로 쓰고 -p 실행은 .mcp.json 서버도 묻지 않고 연결한다(앤트로픽 문서).
  • 승인 설정: Codex 기본 자동 모드는 작업 공간 밖 편집에 승인을 묻지만(Codex 문서), Forever는 시험의 승인 모드를 밝히지 않았다.

악용 정황

function-color는 Checkmarx가 10월 5일 분석한 npm 캠페인 MALFEX 소속이다. 자체 페이로드 없이 function-flag를 설치하고, function-flag 1.7.3은 cdnzona.discloud.app의 node.exe를 %APPDATA%\node.exe로 받아 숨겨 실행하며 윈도에서만 동작한다(호스트 무응답으로 페이로드 미확보). 9월 29일까지 권고가 없었고 지금은 npm에서 내려갔다. 실제 파일의 명령은 macOS 형식이라 고객 PC에서 무엇이 실행됐을지는 공개되지 않았다.

확인 방법

  • 지시 파일: ls -la ~/Downloads/*.md(윈도 PowerShell dir $env:USERPROFILE\Downloads\*.md)로 직접 만들지 않은 AGENTS.md, AGENTS.override.md, 앤트로픽 도구용 대문자 .md를 찾는다(일반 점검).
  • Codex: grep -n -E 'mcp_servers|base_url|command|args|projects|trust_level' ~/.codex/config.toml(윈도는 %USERPROFILE%\.codex\config.toml)로 관련 위치를 찾고, 해당 설정 블록 전체에서 모르는 [mcp_servers.*]의 실행 명령·주소, 바뀐 주소 키(Forever 지표), 내려받기 폴더의 신뢰 값(trust_level = "trusted")을 확인한다(일반 점검).
  • 앤트로픽 도구: grep -rn "ANTHROPIC_BASE_URL" ~/Downloads로 숨김 폴더의 settings.json까지 찾고(일반 점검), 홈 폴더 도구 상태 파일(.json)의 projects["<경로>"].hasTrustDialogAccepted를 본다(앤트로픽 문서).
  • 설치 흔적: 각 프로젝트 루트에서 npm ls function-flag function-color cdn-img-fetch img-to-native native-runner tlxbnhd tldriver mxdriver --all과 lockfile 검색으로 이 8개 패키지를 찾고(Checkmarx), macOS에 /tmp/ptools가 있으면 그 경로에서도 같은 npm ls를 실행한다(일반 점검). macOS /tmp/ptools/ac.log, 윈도 Test-Path "$env:APPDATA\node.exe", DNS 로그의 cdnzona.discloud.app를 본다. 설치 기록이 있으면 그 PC를 침해로 다룬다(Forever).

고치는 법

  1. 에이전트는 작업할 프로젝트 폴더에서만 띄우고 승인과 샌드박스를 켜 둔다. 승인·샌드박스 우회 모드(별칭 --yolo)는 Codex 문서도 권하지 않고, 우회를 시키는 지시는 그 자체로 공격 신호다(Forever).
  2. Codex 관리자는 requirements.toml에 mcp_servers 허용 목록을 둔다. 이름과 신원(stdio는 command, HTTP는 url)이 맞는 서버만 켜지고, 문자열 command 일치는 인자를 보지 않으니 실행 파일과 인자를 함께 맞춘다(Codex 문서).
  3. 앤트로픽 도구 관리자는 관리자 설정을 배포한다. allowedProviders(v2.1.285 이상)를 쓰는 제공자로 좁히면 다른 주소로 가는 세션이 거부되고, 사내 게이트웨이는 "customEndpoint"와 관리자 env의 ANTHROPIC_BASE_URL 고정값으로 허용한다. 샌드박스를 켠 상태의 sandbox.allowUnsandboxedCommands: false는 dangerouslyDisableSandbox를 무시하게 하고, 기본값이 모두 허용인 allowedMcpServers는 allowManagedMcpServersOnly와 함께 건다(앤트로픽 문서).
  4. 흔적이 나오면 지우기 전에 보존한다. 침해 의심 단말을 먼저 격리하고 파일 사본·해시·시각, 다운로드 기록, 설정 파일, 세션 로그를 보존한다. 설정 복구는 증거 보존 뒤 진행한다. 토큰은 샜다고 가정한다(Forever). 보안팀과 IT 운영은 노출 가능 계정·토큰·키 목록을 작성하고, 깨끗한 PC에서 해당 계정의 비밀번호를 변경한 뒤 새 키 발급·배포와 정상 동작 확인, 옛 세션·키 폐기, 사용 기록 확인 순으로 진행한다(일반 대응, Checkmarx).

2. OpenCode: 악성 MCP 서버가 로그인 중에 코드를 실행했다

원인

MCP 서버가 인증을 요구하면 클라이언트는 OAuth 탐색 문서의 authorization_endpoint로 브라우저를 여는데, 이 값은 서버가 마음대로 정한다. Pillar에 따르면 OpenCode 1.18.32는 스킴 검사도 출처 비교도 없이 이 값을 브라우저 실행 패키지 open 10.1.2에 넘겼고, open 10.1.2는 윈도에서 주소를 이스케이프 없이 큰따옴표로 감싸 powershell -EncodedCommand로 넘긴다. PowerShell은 큰따옴표 안의 $(...)를 실행하므로 Pillar 시연값처럼 https://evil.test/$(...) 꼴의 평범한 https 주소가 명령이 된다. macOS·리눅스는 셸을 거치지 않아 해당되지 않는다. open은 2025년 11월 11.0.0에서 이스케이프를 고쳤지만 OpenCode는 10.1.2를 유지했다(Pillar).

공격 조건

공격자는 개발자가 등록한 원격 MCP 서버를 통제해야 하며, 나중에 탈취된 서버나 만료된 도메인도 해당한다(Pillar). Pillar는 추가 동의 없이 실행된다고 했고, The Hacker News는 opencode mcp auth나 같은 요청으로 로그인을 시작할 때만 닿는다고 보도했다. OpenCode는 401을 받으면 OAuth를 자동 시작하므로(OpenCode 문서) 평범한 로그인 시작 한 번이 조건으로 보인다(분석). 9.8은 Pillar 제안 점수이고 공식 점수는 없다.

악용 정황과 조용한 수정

공격 정황도 침해 지표도 공개되지 않았다(The Hacker News 보도). Pillar가 8월 29일 비공개 신고하자 개발사 Anomaly는 9월 25일 악성 MCP 서버는 위협 모델 밖이라고 답했고, 같은 날 리팩터링으로 소개한 PR #51414(http·https만 여는 openUrl(), OAuth 경로 검사, open 11.0.4)를 병합했다. 9월 28일 1.18.33 릴리스 노트에는 보안 언급이 없다. Pillar는 스킴 검사가 아니라 open 업데이트가 실제 수정이라고 분석했다. Kilo Code는 10월 22일 v7.8.16에, OpenWork는 10월 23일 내장 엔진 1.18.33에 반영했다. OpenCode 2 계열에도 같은 변경(PR #51412)이 있지만 2.x 영향 범위는 확인되지 않았다. 같은 시기의 OpenCode Console 침해와는 별개다.

확인 방법

  • 버전: 윈도·WSL 단말마다 opencode --version으로 1.0.137~1.18.32를 찾는다. 내장된 open 버전은 npm ls open으로 안 보일 수 있으니 이 값으로 판단한다(분석).
  • 서버: 실행 없이 opencode.json·opencode.jsonc 사본에서 MCP 서버의 url과 command("type": "remote" 서버 포함)를 먼저 확인한다. opencode mcp list는 목록을 띄우며 서버에 연결하므로 의심 설정을 검토하고 업데이트한 뒤 실행한다(일반 점검). 토큰은 ~/.local/share/opencode/mcp-auth.json에 있다(OpenCode 문서).
  • 프로세스(탐지 가설): EDR·Sysmon 이벤트 1에서 부모가 OpenCode인 powershell.exe -EncodedCommand를 뽑아 [Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('값'))으로 풀고 $(를 찾는다. 공식 지표가 아니며 정상 로그인도 같은 프로세스를 남긴다(분석).

고치는 법

  1. 1.18.33 이상으로 올린다(opencode upgrade). Kilo Code는 7.8.16 이상(사전 릴리스), OpenWork는 내장 v1 엔진 1.18.33 이상 빌드를 쓴다.
  2. 못 올린 단말은 검증하지 않은 원격 MCP 서버를 뺀다(Pillar). API 키로 인증하는 서버는 "oauth": false로 자동 OAuth를 끄고(OpenCode 문서), 신뢰하지 않은 서버에 opencode mcp auth·opencode mcp debug를 돌리지 않는다(분석).
  3. MCP 클라이언트를 만드는 팀은 원격 주소를 인자 배열로 넘기고 OAuth 탐색을 설정한 서버 출처에 묶는다(Pillar). open 10.x에 원격 주소를 넘기는 코드는 npm ls open --all과 코드 검색으로 찾는다.

3. x402 SDK: 악성 API가 에이전트 지갑 잔액을 통째로 요구할 수 있었다

x402는 서버가 402 Payment Required로 결제를 요구하면 클라이언트가 서명한 결제 데이터를 붙여 다시 요청하는 AI 에이전트용 결제 표준으로, 리눅스 재단 산하 x402 재단이 관리한다(The Hacker News 보도). V12는 취약점 25건을 찾아 8월 12일 치명 3건과 고위험 13건을 신고했고, 치명 3건은 8월 18일 릴리스로 고쳐졌다. 나머지 22건의 내용은 공개되지 않았고, 세 건 모두 공격 보고는 없다.

원인과 공격 조건

  • 결함 1, 지출 한도 없음: 기본 클라이언트는 한도 없이 서버가 낸 첫 결제 옵션에 서명했다. 악의적 API는 평범한 요청을 해당 토큰 잔액 전부를 요구하는 결제로 바꿀 수 있었고, 소액 결제로 지갑 주소를 먼저 알아낼 수도 있었다(V12). 자동 서명하고 앱이 한도를 두지 않은 에이전트가 대상이다. 수정 버전의 기본값은 인식된 달러 연동 자산만 건당 1달러까지 허용하며, spendControls: false(Python spend_controls=False)는 통제를 모두 끈다.
  • 결함 2, 승인을 결제로 인정: TypeScript Solana facilitator(결제를 검증·제출하고 수수료를 내는 서비스)는 세 번째 지시를 유형 확인 없이 송금(TransferChecked)으로 읽었다. 첫 바이트만 다른 승인(ApproveChecked, 0x0d)이 V12 로컬 시험에서 isValid: true로 통과해 판매자는 돈을 받지 못한 채 자원을 넘길 수 있었다. @x402/svm 2.0.0~2.22.0이 해당되고 Python·Go는 해당 없다(The Hacker News 보도).
  • 결함 3, 다른 사이트 로그인 서명: SIWx(지갑 서명 로그인) 자동 래퍼는 402 응답이 준 메시지의 domain·uri가 접속한 사이트인지 보지 않았다. 악성 서버가 표적 사이트의 로그인 챌린지를 넘겨 서명을 받으면 그 사이트에 에이전트 지갑으로 로그인할 수 있었다(V12). 2.23.0부터 createSIWxPayload는 402 응답의 최종 URL을 세 번째 인자로 받아 출처가 다르면 서명을 거부한다.

악용 정황과 권고 부재

재단은 보안 권고를 내지 않았고 변경 이력에도 보안 수정이라 적지 않아, 10월 23일 기준 수정 직전 릴리스에 npm audit·PyPI 경고가 없었다(The Hacker News 보도). 10월 26일 GitHub 보안 권고 목록에도 없다. @x402/core 2.27.0(9월 22일)은 /api%2Fpremium처럼 경로 구분자를 인코딩해 결제 없이 유료 경로에 닿던 별도 문제도 고쳤다.

확인 방법과 고치는 법

  • 버전: npm ls @x402/core @x402/svm @x402/extensions --all, pip show x402, go list -m all로 보고 최신(2.28.0, 2.25.0, v2.28.0)으로 올린다(일반 점검). TypeScript는 @x402/fetch·@x402/axios를 올리면 core가 따라오고, SIWx는 @x402/extensions, Solana facilitator는 @x402/svm도 올린다(The Hacker News 보도).
  • 설정: spendControls: false, spend_controls=False, 인자 두 개짜리 createSIWxPayload 호출을 찾는다. 못 올리면 TypeScript의 registerPolicy, Go의 RegisterPolicy, Python의 register_policy·max_amount로 금액 상한을 건다(공식 코드 기준). V12는 건당·총 예산과 허용 토큰·네트워크·수취인 강제를 권했다.
  • 지갑과 정산: 실제 한도는 지갑 잔액과 외부 서명기 제한뿐이었다(V12). 에이전트 지갑은 쓸 만큼만 넣어 분리하고, facilitator 운영자는 결제 성공 거래와 실제 입금을 대조한다(일반 점검).

우리 환경에서 확인할 것

확인할 곳 볼 내용 예시 조건
내려받기 폴더·에이전트 설정 지시 파일, MCP 서버·주소 키, 신뢰 기록 AGENTS.md·앤트로픽 도구용 .md, 모르는 [mcp_servers.*], 넣지 않은 ANTHROPIC_BASE_URL, 내려받기 폴더 신뢰
패키지 기록·DNS 로그 MALFEX 흔적 function-color·function-flag, /tmp/ptools/ac.log, %APPDATA%\node.exe, cdnzona.discloud.app
윈도·WSL 단말 OpenCode·파생 제품 1.0.137~1.18.32, Kilo Code 7.8.16 미만, 검증 안 한 remote 서버
EDR 프로세스 기록 OpenCode의 PowerShell -EncodedCommand 값에 $((가설)
사내 코드 open·x402 사용 open 11 미만에 원격 URL 전달, x402 2.23.0·2.20.0·v2.23.0 미만, spendControls: false
facilitator 정산 기록 입금 없는 결제 성공 거래인데 실제 입금 없음

대응 순서

오늘

  1. 보안팀: 내려받기 폴더에서 에이전트를 띄우지 말라고 개발자 전원에게 공지한다.
  2. 개발자: 내려받기 폴더와 에이전트 설정 파일을 점검하고, 이상이 보이면 지우기 전에 사본·해시·시각을 보안팀에 넘긴다.
  3. 보안팀: MALFEX 흔적을 찾는다. 걸린 PC는 격리·증거 보존 뒤 깨끗한 PC에서 자격 증명을 바꾼다(침해사고 1시간 골든타임 액션북).
  4. IT 운영: 윈도·WSL의 OpenCode 1계열은 1.18.33 이상, Kilo Code CLI는 7.8.16 이상 수정 빌드(사전 릴리스), OpenWork는 내장 v1 엔진 1.18.33 이상인지 각각 확인해 올리고, 못 올린 단말은 검증 안 한 원격 MCP 서버를 뺀다.
  5. x402 개발팀: 최신 버전으로 올리고 spendControls: false 사용처를 찾는다.

이번 주

  1. Codex 관리자: mcp_servers 허용 목록과 허용할 승인·샌드박스 모드를 요구 사항으로 배포한다.
  2. 앤트로픽 도구 관리자: allowedProviders, 엄격한 샌드박스, MCP 허용 목록을 관리자 설정으로 배포한다.
  3. 개발자: 두 도구의 신뢰 기록에서 내려받기 폴더를 빼고 -p 자동화가 도는 폴더를 점검한다.
  4. 보안관제·패키지 담당: 에이전트 설정 파일 변경과 OpenCode의 powershell -EncodedCommand를 감시하고, 레지스트리 프록시에서 MALFEX 8개 패키지를 모두 막는다.

이번 달

  1. 보안 책임자: CVE 없이 고쳐지는 에이전트 도구를 추적한다. AI 코딩 도구·MCP 클라이언트·결제 SDK 재고(이름, 버전, 단말)를 두고 변경 이력과 보안 연구를 매주 대조한다. 앞선 사례는 AI 코딩 도구 취약점 30여 건 정리에 있다.
  2. 개발 리더: 신뢰하지 않은 파일을 다루는 에이전트 작업은 컨테이너나 가상머신에서 돌린다. OpenCode 보안 정책도 진짜 격리에는 Docker나 가상머신을 권한다.
  3. 결제 에이전트 담당: 에이전트별 건당·일 한도, 허용 수취인, 지갑 잔액 상한을 정책으로 정한다.

자가점검

'아니오'가 나온 항목부터 대응 순서로 돌아간다.

1. 개발자들이 내려받기 폴더에서 코딩 에이전트를 띄우지 않는가

Forever 측정으로는 고객사의 약 절반이 그렇게 쓴다.

2. 에이전트가 켤 수 있는 MCP 서버를 관리자 허용 목록으로 제한했는가

허용 목록이 없으면 지시 파일이 등록하게 한 서버도 켜진다.

3. 모델 API 주소를 관리자 설정으로 고정했는가

주소 하나만 바뀌어도 로그인 토큰이 밖으로 나간다.

4. 윈도·WSL의 OpenCode·Kilo Code·OpenWork가 각 제품의 수정 버전 이상인가

CVE·보안 권고 기반 점검만으로는 영향 빌드를 놓칠 수 있다.

5. 결제 에이전트에 건당·총 한도와 허용 토큰·수취인이 적혀 있는가

선택형 정책은 실제로 켠 앱만 보호한다.

AI 에이전트가 무엇을 실행하고 넘기는지 먼저 확인하기

사내 AI 에이전트가 MCP 서버, 외부 API, 결제 기능을 쓴다면 보안 전문 기업 SENTRIX의 AI 심화 취약점 진단으로 프롬프트 입력, 검색 자료 접근 권한, 에이전트의 도구 실행과 데이터 전달 범위를 검증할 수 있다. 탐색은 AI가 맡고 연쇄 공격 경로의 재현과 검토는 레드팀이 하며, 재점검 범위와 횟수는 계약 때 정한다. 개발자 PC 점검이나 침해 조사를 대신하지 않고, 모든 우회의 탐지나 모델 안전 인증을 보장하지도 않는다. AI 에이전트 보안 진단 문의하기

참고 자료

AI 에이전트 도구 실행 범위 진단 상담하기

보안 실무 10년 전문가가 기업 환경에 맞는 방안을 제시합니다.