core.fsmonitor로 터지는 AI 코딩 에이전트 RCE — GitSpawn 8건 정리와 점검 명령

mini_knows·2026년 9월 13일

AI 트렌드·이슈

목록 보기
100/119

안녕하세요, 미니지식공간입니다.

core.fsmonitor 하나로 AI 코딩 에이전트에서 임의 명령 실행이 일어난다. Manifold Security가 2026년 9월 1일 공개한 GitSpawn 연구는 CLI 에이전트 7종에서 같은 유형의 결함 8건을 확인했고, 공개 시점에 4건이 미패치였다. 모델 문제가 아니라 세션 시작 시 에이전트가 띄우는 git 하위 프로세스 문제다.

에이전트는 시작 직후 배경에서 git status / git diff를 돌린다 → 이 명령들은 인덱스를 갱신한다 → 인덱스 갱신은 .git/config의 core.fsmonitor 값을 명령으로 실행한다 → 저장소가 그 값을 정한다. 샌드박스 밖, 승인 프롬프트 없음.


1. 싱크가 어디에 있나

에이전트가 부르는 git은 전혀 특별하지 않다. Manifold가 예로 든 두 가지는 이렇다.

git status --porcelain=2 --branch
git diff --name-only HEAD

둘 다 직접 쳐도 이상할 게 없는 명령이다. 그런데 작업 트리를 만지는 git 명령은 대부분 실행 전에 인덱스를 리프레시한다. 그 리프레시가 싱크다.

core.fsmonitor는 대형 저장소용 성능 설정이다. git이 디스크의 모든 파일을 확인하는 대신, 변경 목록을 알려 줄 헬퍼 프로그램에게 물어보고, 그 프로그램을 인덱스 리프레시 도중 실행한다. 문서화된 의도된 동작이다.

문제는 git이 이 설정을 저장소 자신의 .git/config에서 읽는다는 점이다. 저장소는 이렇게 실을 수 있다.

[core]
    fsmonitor = <command>

에이전트가 배경 git 호출에서 저장소 설정을 스트립하지 않으면, 저 <command>가 에이전트를 실행한 사용자 권한으로 호스트에서 돈다. 에이전트 자신의 코드가 스폰한 하위 프로세스이므로 샌드박스 바깥이고, 툴 승인 모델은 이 실행을 관측하지 못한다.

그리고 이런 성격의 설정이 core.fsmonitor 하나만 있는 것은 아니다. Manifold는 8건 중 하나가 core.fsmonitor 버그가 아닌 다른 설정 키를 쓰며, 해당 키는 미패치 상태라 공개하지 않았다고 밝혔다.

전달 경로 제약이 중요하다. git은 이 설정을 전송하지 않는다. 악성 URL을 clone하거나 fetch, pull 해도 아무 일도 없다. 저장소가 .git 디렉터리를 품은 파일 묶음으로 도착해야 한다 — zip, 공유 드라이브, 동기화 폴더, USB. 연구진은 모든 PoC에서 zip을 썼다고 적었다.

2. 영향 범위와 상태 (2026-09-01 공개 시점)

에이전트제보일벤더 대응상태
Claude Code (core.fsmonitor)06-26같은 날 접수된 건과 중복 처리패치 — 2.1.196
Claude Code (ultrareview)07-15내부 티켓과 중복 처리미패치 — 2.1.252 재확인
Cursor07-08선행 제보와 중복 처리패치
OpenAI Codex07-20선행 제보와 중복 처리패치
Goose07-13인정, CVE 할당패치 — 1.44.0 / CVE-2026-72718
Qwen Code07-07Alibaba SRC 접수미패치 — 0.22.3 재확인
Grok Build07-1407-01 "참고" 종결 건과 중복미패치 — 1.0.13 재확인
Hermes Agent07-205개 채널 6회 연락, 미분류미패치 — 0.21.0 / CVE-2026-71963

트리거 시점이 도구마다 다르다. Claude Code와 Hermes는 workspace-trust 프롬프트 수락 전에, Qwen Code는 사용자 인증 전에, Grok Build는 프롬프트 첫 키 입력에 실행된다.

CVE는 두 건뿐이다. CVE-2026-72718(Goose)은 GHSA-r5pp-p5r8-466r로 2026-07-24 공개됐고 CVSS v4 7.0(High), CWE-94다. CVE-2026-71963(Hermes)은 벤더가 아니라 독립 CNA인 VulnCheck가 할당했는데, The Hacker News는 2026-09-02 기준 MITRE CVE 목록에서 이 번호의 공개 기록을 찾지 못했다고 보도했다 — 등재 상태는 확인 필요.

3. 내 환경 점검

아래는 The Hacker News가 정리한 사용자 권고와 Manifold 블로그의 "What to do about it" 항목을 그대로 옮긴 것이다(출처: https://thehackernews.com/2026/09/malicious-git-configs-can-make-claude.html, https://www.manifold.security/blog/ai-coding-agents-git-hijack). 새로 만든 명령은 없다.

# 1) 파일로 받은 저장소 안에서 로컬 설정 확인
git config --get core.fsmonitor

# 2) 전역 설정 감사
git config --global --list | grep fsmonitor

# 3) 전역 기본값 끄기
git config --global core.fsmonitor false

에이전트로 디렉터리를 열기 전에 .git/config를 직접 열어 보는 것이 1차 방어다. 살펴볼 키는 core.fsmonitor, core.hooksPath, 그리고 clean/process 필터가 딸린 attr.tree다(The Hacker News 정리). 값으로 프로그램을 지정하는 설정은 전부 실행 후보로 봐야 한다.

한 가지 주의. 3번은 전역 기본값만 끈다. 저장소 로컬 설정이 전역보다 우선하므로 받은 폴더가 자기 .git/config에 값을 실어 두면 그대로 살아난다. 전역 설정은 보조 수단이고, 폴더 점검과 도구 업데이트가 본 수단이다.

4. 에이전트를 만든다면: 배경 git 호출 위생

Manifold가 벤더에게 제시한 완화책은 한 줄이다(출처: Manifold 블로그 "What to do about it").

# 배경 컨텍스트 수집 호출에서 저장소 설정을 무력화한다
git -c core.fsmonitor=false status

-c로 넘긴 값이 저장소 설정을 덮어쓴다. 핵심은 "에이전트가 사용자 대신 부르는 모든 git 호출"에 이 위생을 적용하는 것이다. 브랜치 확인, diff 수집, 서브에이전트용 worktree 생성까지 전부 해당된다.

5. Goose 케이스로 본 근본 원인

GHSA 권고문이 근본 원인을 코드 수준으로 적어 두었으므로 그대로 옮긴다(출처: https://github.com/aaif-goose/goose/security/advisories/GHSA-r5pp-p5r8-466r).

crates/goose-cli/src/commands/review/handler.rs의 git_command()가 리뷰용 git 호출을 -c core.quotePath=off 하나만 붙여 구성하고, core.fsmonitor는 스트립하지 않는다. 이어서 touched_files()와 collect_diff()가 git diff --name-only HEAD / git diff HEAD를 실행해 리뷰 컨텍스트를 모으는데, 이 과정에서 인덱스가 리프레시되며 공격자가 통제하는 core.fsmonitor 명령이 호출된다.

즉 -c 플래그를 쓸 줄 몰라서가 아니라, 한 개만 붙이고 나머지를 생각하지 않은 것이 결함이다. 영향 버전은 1.44.0 미만, 권고문의 Impact 항목은 이 실행이 사용자 환경을 그대로 상속하므로 환경변수의 시크릿과 프로바이더 API 키까지 유출될 수 있다고 적었다.

6. 처음 나온 이야기는 아니다

같은 계열의 선행 연구가 있다.

  • Pillar Security, "Week of Sandbox Escapes"(2026-07-20 공개). Cursor, Codex, Gemini CLI, Antigravity에서 샌드박스를 정면으로 깨지 않고 탈출했다. 에이전트는 규칙을 다 지키는데, 에이전트가 쓴 파일을 샌드박스 밖 도구가 나중에 실행·로드·스캔한다는 구조다. Cursor의 .claude 훅 설정 건이 CVE-2026-48124로 3.0.0에서 수정됐고, Codex CLI는 git show를 이름만 보고 allowlist에 넣은 문제가 v0.95.0에서 수정됐다.
  • Cymulate(2026-04). 같은 패턴을 "Configuration-Based Sandbox Escape(CBSE)"로 명명해 Claude Code, Gemini CLI, Codex CLI를 대상으로 문서화했다.
  • Sonar는 2026년 4월 같은 싱크를 보고했고, Anthropic이 2.0.34(2025-11-05)에서 신뢰 다이얼로그 승인 전 git status 실행을 없애 한 번 막았다고 기록했다. 그런데 Manifold는 2.1.193(2026-06-25 릴리스)에서 같은 시작 동작이 다시 나타났다고 보고했다.

도구 이름은 바뀌어도 형태는 같다. 에이전트가 자기가 쓰지 않은 무언가(저장소, 스킬, MCP 서버, 플러그인)를 파일로 받아 들고, 도착했다는 이유로 신뢰한다. MCP 서버 쪽 인증 경계가 어디서 무너졌는지는 CVE-2026-59822 LiteLLM MCP 인증 우회 정리에서 다룬 적이 있다.

자주 묻는 질문

Q. git clone만 해도 뚫리나?
아니다. Manifold는 git이 이 설정을 전송하지 않는다고 명시했다. clone / fetch / pull은 안전하고, .git 디렉터리가 들어 있는 폴더를 파일 형태로 받았을 때만 성립한다.

Q. 실제 공격에 쓰인 사례가 있나?
공개 자료 기준으로 악용 보고는 없다. The Hacker News는 2026-09-02에 CISA KEV 카탈로그 2026.09.01 버전(1,687건)을 확인했지만 해당 CVE들이 등재돼 있지 않았다고 밝혔다.

Q. Codex CLI는 어느 버전부터 안전한가?
The Hacker News 정리 기준 0.102.0~0.130.0이 영향 범위이고 0.131.0에서 수정됐다. 같은 기사에서 2026-09-02 시점 최신 릴리스는 0.152.1이었으므로, 0.131.0 아래로 핀 고정된 설치본은 그대로 노출된다. Desktop 빌드는 별도 버전 체계이니 원문의 버전 목록을 확인하는 편이 정확하다.

마무리

권한 설정 화면이 아니라 런타임이 기준이다. 에이전트가 세션 시작 시 실제로 무슨 프로세스를 띄우는지, 그 호출이 저장소 설정을 걸러내는지가 이번 연구의 관측점이었다. 파일로 받은 저장소를 에이전트로 여는 습관이 있다면 .git/config 확인을 워크플로우에 넣어 두는 편이 좋다.

Manifold는 재현용 악성 저장소를 공개하지 않았고 미패치 설정 키 하나도 이름을 밝히지 않았다. 이 글도 같은 선에서 점검·완화 방법만 정리했다.

출처

본 글은 공개 자료를 바탕으로 정리했으며, 세부 내용·수치는 원 출처·공식 문서와 대조 확인을 권장합니다. 버전별 패치 상태는 2026년 9월 1~2일 기준이며 이후 변경됐을 수 있습니다.

profile
작지만 알아야 할 모든 것

0개의 댓글