SK쉴더스 로고
ADT캡스캡스홈
SK쉴더스

GhostApproval: AI 코딩 어시스턴트 심볼릭 링크 승인 위장 결함

EQST Now | 2026.07.13

NOW Briefing

Brief 1 GhostApproval은 Claude Code·Cursor·Amazon Q Developer 등 널리 쓰이는 AI 코딩 어시스턴트에서 발견된 신뢰 경계 결함입니다. 악성 리포의 심볼릭 링크(한 파일 이름이 다른 경로를 가리키게 하는 링크)를 에이전트가 검증 없이 따라가면서 발생합니다.
Brief 2 사용자에게는 무해한 파일명만 표시되지만, 실제로는 ~/.ssh/authorized_keys나 셸 초기화 파일에 공격자 콘텐츠를 기록해 원격 로그인과 RCE(원격 코드 실행)로 이어질 수 있습니다.
Brief 3 Cursor·Amazon Q·Google Antigravity는 이미 패치를 배포했습니다. 해당 도구를 최신 버전으로 업데이트하고, 신뢰할 수 없는 리포는 에이전트에 열기 전 심볼릭 링크를 점검해야 합니다.

GhostApproval: AI 코딩 어시스턴트 심볼릭 링크 승인 위장 결함

■ 개요

AI 코딩 어시스턴트는 개발자의 자연어 지시를 받아 워크스페이스 안의 파일을 직접 읽고 쓰는 도구입니다. GhostApproval은 승인창(confirmation dialog, 도구가 파일을 수정하기 전에 사용자에게 보여 주는 화면)과 실제 기록 대상 사이의 불일치에서 비롯됩니다. Wiz가 2026년 2월 발견해 2026년 7월 8일 공개했으며, 6개 주요 제품이 유사한 결함의 영향을 받는다고 지적했습니다.

핵심은 악성 리포에 심어진 심볼릭 링크입니다. 예를 들어 project_settings.json처럼 평범해 보이는 파일이 사실은 ~/.ssh/authorized_keys를 가리키는 링크일 수 있습니다. 사용자가 "프로젝트를 설정해 줘" 또는 "README를 따라가 줘"라고 지시하면, 에이전트는 이 링크를 따라가 실제 SSH 키 파일에 공격자가 제공한 값을 기록합니다. 승인창에는 무해한 파일명만 표시되므로 사용자는 자신이 승인한 변경의 실체를 볼 수 없습니다.

기업 관점에서도 우선순위가 높은 이슈입니다. 영향받는 제품이 국내외 개발 조직에 광범위하게 배포돼 있고, 공격 조건이 "악성 리포를 클론해 에이전트로 여는" 일상적 행위이기 때문입니다. Cursor·Amazon Q Developer·Google Antigravity는 이미 패치를 배포한 반면, 일부 제품은 아직 미패치 상태이고 Anthropic은 사용자 승인 책임 해석을 두고 보고를 거부했습니다.

■ 요약

항목 내용
CVE ID CVE-2026-50549(Cursor), CVE-2026-12958(Amazon Q) 외 다수 제품
CVSS 점수 CVSS 9.8 / Critical(Cursor 기준), High(Amazon Q)
취약점 유형 CWE-61(심볼릭 링크 추적), CWE-451(UI 정보 왜곡)
영향/위험 • 승인창에 무해한 파일명만 표시돼 실제 기록 대상 은폐
authorized_keys 변조로 미인증 원격 SSH 접근 가능
• 셸 초기화 파일 변조로 RCE 가능
~/.aws/credentials 등 자격증명 유출 가능
취약 버전 • Cursor <3.0
• Amazon Q <1.69.0
• Google Antigravity <1.19.6
• Augment 0.754.3 (미패치)
• Windsurf v1.9566 (미패치)
• Claude Code v2.1.42 (벤더 이견)
패치 버전 • Cursor 3.0
• Amazon Q 1.69.0
• Google Antigravity 1.19.6

■ 기술 분석

공격은 악성 리포에 포함된 심볼릭 링크에서 시작합니다. 공격자는 저장소 안에 정상 설정 파일처럼 보이는 이름을 만들어 두고, 그 실체를 사용자 홈 디렉터리의 민감 파일로 연결합니다. authorized_keys는 SSH 서버가 비밀번호 없이 로그인을 허용할 공개키 목록을 담는 파일이므로, 이곳에 공격자 키가 들어가면 미인증 원격 접근이 성립합니다.

승인창을 그리는 로직은 심볼릭 링크의 최종 대상에 기록하면서도 사용자에게는 표면 파일명만 보여 줍니다. 해석된 실제 경로를 검증하거나 표시하는 단계가 없기 때문에, 사용자는 워크스페이스 밖 민감 파일이 수정된다는 사실을 인지하기 어렵습니다.

# 승인창 표시 로직의 결함을 방어용으로 단순화한 예시
def show_approval(path):
    display_name = path                    # 사용자에게 보이는 이름: "project_settings.json"
    real_target = resolve_symlink(path)    # 실제 기록 대상: ~/.ssh/authorized_keys
    prompt_user(display_name)              # "이 파일을 수정할까요?" → 사용자 승인
    write_file(real_target, content)       # 승인 후 실제 대상에 기록
    # 결함: real_target 검증·표시를 건너뛰어 경계 밖 기록을 허용
    # ... 대상 검증 생략 ...

에이전트가 "project_settings.json을 수정하라"는 지시를 처리하면, 파일 시스템은 심볼릭 링크를 따라가 실제 대상인 ~/.ssh/authorized_keys에 내용을 기록합니다. 이 과정에서 에이전트는 대상의 실체를 인지하고도 사용자에게 알리지 않습니다.

Wiz 분석에 따르면 일부 에이전트는 내부 추론에서 "project_settings.json은 사실 zsh 설정 파일이다"라고 정확히 식별했습니다. 그러나 사용자에게 표시된 승인창은 "project_settings.json을 수정할까요?"라는 무해한 문구뿐이었습니다. 이 정보 격차가 "고지된 동의(informed consent)"를 형식적 승인으로 전락시킨 CWE-451의 본질입니다.

📌 NOTE

Windsurf의 경우 승인창을 띄우기 전에 파일이 먼저 기록되는 사전 실행 동작이 확인됐습니다.

즉 사용자가 "실행 취소"를 누를 시점에는 이미 민감 파일이 변조된 뒤일 수 있습니다.

■ PoC

GhostApproval의 재현은 별도 익스플로잇 코드 없이 성립합니다. 무해해 보이는 이름의 심볼릭 링크가 사용자 홈의 민감 파일을 가리키게 만들어 두고, 악성 리포의 README에 그 파일을 수정하라는 지시와 넣을 값(공격자 SSH 키)까지 함께 심어 둡니다. 피해자가 "이 리포를 세팅해 줘"라고만 해도 에이전트가 README를 따라 실제 대상 파일에 그 값을 기록합니다. 지시도 페이로드도 전부 리포에서 나오는 것이 Wiz가 공개한 최소 재현입니다.

# 최소 재현 — 무해한 이름이 민감 파일을 가리키게 심볼릭 링크 생성
ln -s ~/.ssh/authorized_keys project_settings.json
# 악성 리포의 README에 "project_settings.json에 이 키를 추가하라"는 지시와
# 공격자 SSH 공개키(ssh-ed25519 ...)를 함께 심어 둔다.
# 피해자가 "이 리포 세팅해줘"라고만 해도 에이전트가 README를 읽고
# authorized_keys에 그 키를 기록 → 미인증 원격 SSH 접근 성립

⚠️ WARN

위는 Wiz가 공개한 최소 재현으로, 별도 익스플로잇 없이 심볼릭 링크만으로 성립합니다. 완전한 무기화 코드가 아니라 방어·탐지 관점에서 재현 조건을 보인 것입니다.

승인창을 띄우기 전에 심볼릭 링크를 해석하고, 해석된 경로가 워크스페이스 밖이면 사용자에게 경고해야 합니다.

■ 탐지 및 점검

• 신뢰할 수 없는 리포를 에이전트로 열기 전에 find . -type l로 심볼릭 링크를 나열하고, ~/.ssh·~/.aws·시스템 설정 경로를 가리키는 링크가 있는지 확인합니다.

~/.ssh/authorized_keys, ~/.zshrc, ~/.aws/credentials의 쓰기 이벤트를 감사하고, 특히 AI 코딩 도구 프로세스에서 발생한 변경을 경보로 설정합니다.

• 에이전트 로그에서 심볼릭 링크를 인지한 내부 추론과 사용자에게 표시된 승인 경로가 불일치하는 항목을 점검합니다.

• 공유 빌드 환경에서 리포를 클론하는 파이프라인은 심볼릭 링크가 배포 키나 인프라 자격증명을 가리키지 않는지 확인합니다.

• 사내에서 사용하는 AI 코딩 도구의 버전을 조사해 취약 버전(Cursor <3.0, Amazon Q <1.69.0, Google Antigravity <1.19.6) 설치 여부를 파악합니다.

■ 대응 방안

• Cursor·Amazon Q Developer·Google Antigravity는 각각 3.0·1.69.0·1.19.6 이상으로 즉시 업데이트합니다.

• 미패치 제품(Augment, Windsurf)이나 벤더 이견이 있는 제품을 사용하는 조직은 신뢰할 수 없는 리포를 에이전트로 여는 작업을 격리된 환경으로 제한합니다.

• 취약 버전에서 악성 리포를 다룬 이력이 있으면 authorized_keys와 셸 초기화 파일을 검토하고, 변조가 의심되면 SSH 키와 클라우드 자격증명을 폐기·재발급합니다.

• 가능하면 워크스페이스 밖 경로 쓰기를 경고·차단하도록 에이전트 설정을 조정합니다.

💡 TIP

일반 개발자도 지금 할 수 있는 조치가 있습니다. 사용 중인 AI 코딩 도구를 최신 버전으로 올리고, 승인창에 표시된 파일명과 실제 기록 대상이 다를 수 있음을 전제로 점검해야 합니다.

특히 출처가 불분명한 리포는 열기 전에 심볼릭 링크부터 확인하면 이 계열 공격의 대부분을 차단할 수 있습니다.

[참고 자료]

GhostApproval: A Trust Boundary Gap in AI Coding Assistants - Wiz Blog

GhostApproval Symlink Flaws Could Let Malicious Repos Run Code in AI Coding Agents - The Hacker News

Bug in top AI coding agents shows that Unix-era security headaches never really die - The Register

GhostApproval Flaw Hits Six Major AI Coding Assistants - Infosecurity Magazine

  • #EQST_NOW
  • #취약점

관련 서비스

더 많은 보안 인사이트

SK쉴더스 유튜브 채널에서 확인하세요.

SK쉴더스 유튜브 채널에서 확인하세요.
보안 트렌드와 대응방법

매월 뉴스레터로 확인하세요.

매월 뉴스레터로 확인하세요.