Eazler AI Lab AI Engineering Journal
본문으로 건너뛰기
보안◷ 8분 읽기

GitSpawn 공개 한 달 뒤, 당시 미수정 4건 중 3건에서 수정 코드 확인

zip이나 공유 폴더로 받은 저장소의 .git/config에 적힌 명령이, 코딩 에이전트가 실행한 git status 때문에 승인 없이 실행되는 문제입니다. 개발사 저장소와 CVE 기록을 대조했고, git이 어떤 명령에서 그 설정을 실행하고 무엇으로 막히는지는 직접 시험했습니다

목차

코딩 에이전트는 프로젝트 상태를 파악하려고 git status 같은 명령을 스스로 실행합니다. Manifold Security의 보고에 따르면 일부 에이전트는 폴더를 열자마자, 일부는 첫 메시지·첫 입력이나 리뷰 명령을 실행할 때 이 명령을 돌립니다. 보안 회사인 Manifold는 2026-09-01, 이때 저장소 자신의 git 설정에 적힌 명령이 그대로 실행되는 결함을 일곱 개 에이전트에서 찾았다고 공개하고 이 결함 계열을 GitSpawn이라고 불렀습니다. 공개 시점에 8건 중 4건이 고쳐지지 않은 상태였습니다. 이 글에서는 그 4건이 한 달 뒤 어떻게 됐는지 각 개발사의 저장소·변경 기록·CVE로 확인하고, git이 어떤 명령에서 그 설정을 실행하는지와 어떤 방법으로 막을 수 있는지를 직접 시험했습니다.

범위: Manifold 공개 글(2026-09-01), 개발사 저장소·변경 기록·보안 권고·CVE, git 2.53.0 시험(macOS)원문 확인·시험: 2026-10-07 · 에이전트는 실행하지 않음

핵심 요약

3 / 4
공개 당시 미수정 결함 중 수정 코드가 확인된 것
Hermes·Qwen Code·Grok Build. Claude Code /ultrareview는 미확인
3 / 10
시험한 git 명령 중 저장소 설정의 명령을 실행한 것
status·diff·ls-files
막지 못함
전역 git 설정에 fsmonitor = false를 넣은 경우
저장소 설정이 전역 설정보다 우선
가장 중요한 결론: 이 문제는 에이전트의 승인 절차나 샌드박스가 아니라, 에이전트가 맥락을 읽으려고 스스로 실행하는 git 호출에서 생깁니다. 그래서 에이전트의 승인·샌드박스 설정으로는 막을 수 없고, 사용자가 git 쪽에서 막을 수 있는 방법도 한정적입니다(아래 직접 시험). 공개 당시 미수정으로 보고된 4건 중 3건은 지금 개발사 저장소에 수정 코드가 있지만, 배포 버전과의 연결이 확인되지 않거나 수정 범위를 스스로 한정한 곳도 있습니다. 사용자가 할 수 있는 가장 확실한 일은 zip이나 공유 폴더로 받은 프로젝트를 에이전트로 열기 전에 .git/config와 .gitattributes를 텍스트 편집기로 확인하는 것이고, 그다음은 가능하면 폴더째 받는 대신 원격 저장소에서 다시 git clone하는 것입니다. clone은 저장소의 .git/config를 옮겨 오지 않습니다.

먼저 알아 둘 용어

  • .git/config는 저장소마다 있는 git 설정 파일입니다. 사용자 전체에 적용되는 전역 설정(~/.gitconfig)보다 우선합니다.
  • core.fsmonitor는 파일이 많은 저장소에서 git status를 빠르게 하려는 설정입니다. git은 모든 파일을 검사하는 대신 이 설정에 적힌 프로그램에게 무엇이 바뀌었는지 묻습니다. git 공식 문서는 이 값에 내장 모니터를 켜는 true나 외부 프로그램 경로를 쓸 수 있다고 설명합니다. 경로가 들어 있으면 git은 그 프로그램을 실행합니다.
  • 작업 공간 신뢰 확인은 처음 여는 폴더에서 "이 폴더를 신뢰하느냐"고 묻는 화면입니다. Manifold는 일부 에이전트가 이 화면이 뜨기 전, 일부는 로그인하기 전에 git을 실행했다고 보고했습니다.
  • CVE와 GHSA는 공개된 보안 결함의 식별 번호입니다. CVE는 국제 공통 번호, GHSA는 GitHub 보안 권고 번호입니다.

GitSpawn은 무엇인가 — Manifold의 보고

Manifold Security의 공격 보안 엔지니어 Francisco Rosales가 2026-09-01 공개한 글의 요지는 이렇습니다.

  • 경로: 에이전트가 맥락을 읽으려고 실행하는 git status·git diff는 실행 전에 인덱스(git이 파일 상태를 기록해 두는 목록)를 새로 고치고, 이때 저장소의 core.fsmonitor에 적힌 명령을 실행합니다. 에이전트가 저장소 설정을 걸러내지 않으면 그 명령이 사용자 권한으로 실행됩니다.
  • 권한 밖: 이 명령은 에이전트 코드가 직접 시작한 하위 프로세스이므로, 샌드박스 바깥에서 승인 화면 없이 실행된다고 적었습니다.
  • 전달 방식: git clone·fetch·pull로는 전달되지 않습니다. .git 폴더째 옮기는 경로, 즉 zip 파일·공유 드라이브·동기화 폴더·USB로 받은 프로젝트가 대상입니다. Manifold의 시연은 모두 zip을 썼습니다.
  • 규모: 일곱 개 에이전트에서 8건을 찾았고, 공개 시점에 4건이 미수정이었습니다. 다섯 건은 다른 연구자가 먼저 같은 내용을 신고한 중복이었다고 적어, 여러 곳에서 독립적으로 발견되고 있다고 밝혔습니다. 이름을 밝히지 않은 다른 에이전트에서도 같은 결함을 찾았다고 적었습니다.
에이전트신고일공개 시점(9/1) 상태
Claude Code (core.fsmonitor)2026-06-26수정됨 — 2.1.196
Cursor2026-07-08수정됨
Qwen Code2026-07-07미수정 — 0.22.3에서 재확인
Goose2026-07-13수정됨 — 1.44.0, CVE-2026-72718
Grok Build2026-07-14미수정 — 1.0.13에서 재확인
Claude Code (/ultrareview, 다른 설정 키)2026-07-15미수정 — 2.1.252에서 재확인
Hermes Agent2026-07-20미수정 — 0.21.0에서 재확인, CVE-2026-71963
OpenAI Codex2026-07-20수정됨

출처: Manifold Security 공개 글의 일정표. Manifold는 에이전트 실행 시점을 감시하는 제품을 파는 회사이고, 이 글은 그 회사의 자체 연구입니다. /ultrareview 건은 core.fsmonitor가 아닌 다른 설정 키이며, 미수정이라는 이유로 키 이름을 공개하지 않았습니다.

한 달 뒤 — 미수정 4건의 현재 기록

에이전트를 직접 실행해 확인하지는 않았습니다. 아래 내용은 2026-10-07에 각 개발사의 공개 저장소·변경 기록·보안 권고·CVE 레코드를 확인해 정리한 것입니다.

에이전트공개 이후 기록배포 버전에 들어갔는가남은 것
Hermes Agent9/2 PR #101483 병합 — "악성 저장소의 .git/config로 더는 실행되지 않음". 9/3 VulnCheck가 CVE-2026-71963 공개(영향 0.18.2~0.21.0, 수정 커밋 f6234d0). 10/1 PR #130661 병합 — 작업 공간 스냅샷·worktree 처리 등 그때까지 빠져 있던 호출 지점에서, 저장소가 이름을 정하는 필터(filter.<이름>.clean/smudge)와 훅·fsmonitor를 막음9/2 수정은 v2026.9.24 릴리스에 포함. 10/1 수정은 아직 릴리스 전9/7에 열린 PR #105008은 작업 트리에 변경이 있을 때 git diff 경로에서 clean 필터가 실행되는 틈을 지적했고, 아직 열려 있음. #130661이 이 경로까지 덮는지는 PR 본문에 적혀 있지 않음
Qwen Code9/12 PR #11669 병합 — 내부 git 호출에서 fsmonitor 도우미, 외부 diff·textconv 프로그램, 서명 프로그램을 끔0.23.4(9/14)부터 포함. 최신 0.25.0(10/5)PR 본문에 이 수정은 "일반적인 샌드박스가 아니다", 환경 상속 등 일부 항목은 아직 남아 있다고 적혀 있음. 관련 이슈 #10561·#10193 열림
Grok Build공개된 소스 저장소의 8/31 동기화에서 fsmonitor.rs 추가 — 세션이 실행하는 git status에 -c core.fsmonitor=false(또는 내장 모니터만 허용)를 붙임확인하지 못함. 소스 저장소는 내부 저장소에서 통째로 동기화되고, npm 배포 버전(최신 1.0.46)과 소스의 버전 표기가 맞지 않음이 코드는 Manifold 공개(9/1) 하루 전에 들어왔으므로 공개 이후의 수정은 아님. Manifold가 9/1에 재확인한 1.0.13(8/28 배포)은 이 코드보다 앞선 버전이고, 8/31~9/1에 나온 1.0.14~1.0.16에 들어갔는지는 확인하지 못함
Claude Code /ultrareview변경 기록 2.1.285(9/29)~2.1.290(10/5)에 /ultrareview 업로드가 저장소의 git 설정을 다루는 방식을 바꾼 항목이 여럿 있음 — core.worktree·worktree별 설정(2.1.285), 필터 드라이버와 "git 설정 파일 때문에 업로드를 멈춘 경우"의 오류 문구(2.1.290)—Manifold가 키 이름을 밝히지 않아, 이 변경들이 보고된 결함의 수정인지 기록만으로 확인할 수 없음

이미 수정된 쪽에도 참고할 기록이 있습니다. Claude Code의 core.fsmonitor 건은 Manifold가 2.1.196에서 수정됐다고 적었지만, 변경 기록의 2.1.196 항목에는 이 수정이 따로 적혀 있지 않습니다. 같은 계열의 다른 경로인 "작업 트리 안의 중첩 저장소가 설정한 clean 필터를 Claude Code 자체 git 호출이 실행하던 문제"는 2.1.265(9/8)에서 고쳐졌다고 적혀 있습니다. Goose는 GitHub 보안 권고 GHSA-r5pp-p5r8-466r(7/24 공개, 1.44.0 미만 영향)로 수정 사실을 공개했고, 최신 릴리스는 v1.53.0입니다.

수정 코드가 있다는 것과 그 버전을 쓰고 있다는 것은 다릅니다. Hermes의 두 번째 수정은 아직 릴리스되지 않았고, Grok Build는 어느 배포 버전부터 보호 코드가 들어갔는지 공개 기록으로 확정되지 않습니다. 또 Hermes와 Qwen Code의 수정 PR은 모두 core.fsmonitor뿐 아니라 diff.external, 저장소가 이름을 정하는 필터, 훅 경로(core.hooksPath) 같은 여러 설정을 함께 다룹니다. 실행 경로가 하나가 아니라는 뜻입니다.

직접 시험 — git은 어떤 명령에서 실행하고, 무엇으로 막히는가

에이전트는 실행하지 않고 git만 시험했습니다. 환경은 macOS, git 2.53.0입니다. 시험용 저장소의 .git/config에 core.fsmonitor로 기록 파일에 한 줄을 남기고 끝나는 스크립트를 걸어 두고, 명령마다 기록이 남는지 셌습니다. 스크립트는 실행될 때마다 기록을 남기므로, 아래 표의 숫자는 명령 한 번에 스크립트가 실행된 횟수입니다.

git 명령스크립트 실행 횟수
git status --porcelain=2 --branch2
git status --porcelain2
git diff --name-only HEAD2
git diff2
git ls-files2
git log -1 --oneline0
git rev-parse --show-toplevel0
git branch --show-current0
git remote -v0
git worktree list0

Manifold가 예로 든 git status --porcelain=2 --branch와 git diff --name-only HEAD는 모두 스크립트를 실행했습니다. 스크립트를 실행한 명령 계열은 status·diff·ls-files 세 가지입니다. 작업 트리(체크아웃된 실제 파일들)의 변경을 확인하는 명령은 인덱스를 새로 고치므로, 에이전트가 프로젝트 상태를 파악하려고 흔히 쓰는 명령이 곧 실행 경로가 됩니다.

막는 방법git status 한 번에 스크립트 실행 횟수결과
명령줄에 -c core.fsmonitor=false0막힘
환경변수 GIT_CONFIG_COUNT=1, GIT_CONFIG_KEY_0=core.fsmonitor, GIT_CONFIG_VALUE_0=false0막힘
전역 설정 파일에 fsmonitor = false2막히지 않음 — 저장소 설정이 우선
git --no-optional-locks status2막히지 않음

전달 경로도 확인했습니다. 시험 저장소를 git clone한 사본에는 core.fsmonitor 설정이 없었고, zip으로 묶었다 푼 사본에는 설정이 그대로 남아 git status에서 스크립트가 실행됐습니다. Manifold의 "clone으로는 전달되지 않고 폴더째 옮길 때만 전달된다"는 설명과 일치합니다.

git 공식 문서는 환경변수 GIT_CONFIG_COUNT로 넣은 설정이 "설정 파일의 값보다 우선하고, git -c로 명시한 값보다는 뒤진다"고 적고 있습니다. 시험 결과도 그대로였습니다. 이 방법은 core.fsmonitor 하나만 막는다는 점에 주의해야 합니다. 앞 절의 수정 PR들이 함께 다룬 다른 실행 경로(diff.external, 필터, 훅 경로)는 이 시험에서 확인하지 않았습니다.

체크리스트

할 일왜
zip·공유 폴더·USB로 받은 프로젝트는 에이전트로 열기 전에 .git/config와 .gitattributes를 텍스트 편집기로 열어 봅니다. fsmonitor, external, filter., hooksPath, include가 있으면 무엇을 가리키는지 확인합니다.git/config 확인은 Manifold의 권고이고, .gitattributes와 나열한 키는 개발사 수정 PR들이 다룬 경로입니다. git status 같은 명령으로 확인하면 그 명령 자체가 설정을 실행하므로(직접 시험) 텍스트로 엽니다
가능하면 폴더째 받지 말고 원격 저장소에서 git clone합니다clone한 사본에는 원본의 .git/config가 따라오지 않았습니다(직접 시험)
쓰는 에이전트의 버전을 확인합니다. Goose 1.44.0 이상, Qwen Code 0.23.4 이상, Hermes v2026.9.24 이상(필터 경로까지는 다음 릴리스), Claude Code 2.1.196 이상(core.fsmonitor 건. 중첩 저장소의 clean 필터 건은 2.1.265)공개 기록상 수정이 들어간 첫 버전입니다. 이 버전이면 안전하다는 뜻은 아닙니다 — Claude Code /ultrareview 건은 수정 여부를 확인하지 못했고, Grok Build는 기준 버전을 확정하지 못했습니다
셸 환경에 GIT_CONFIG_COUNT로 core.fsmonitor=false를 넣는 방법을 검토합니다저장소 설정보다 우선해 막혔습니다. 다만 fsmonitor 하나만 막고, 큰 저장소에서 fsmonitor를 일부러 쓰는 경우 속도가 느려지며, 에이전트가 하위 git 프로세스에 이 환경을 그대로 넘기는지는 확인하지 않았습니다
에이전트나 개발 도구를 직접 만든다면, 백그라운드에서 실행하는 git 호출에 -c core.fsmonitor=false 같은 덮어쓰기를 붙이고 다른 실행 설정도 함께 점검합니다Manifold의 권고이고, Grok Build·Qwen Code·Hermes가 실제로 택한 방식입니다

아직 결론이 아닌 것

  • 에이전트를 실행해 확인하지 않았습니다. 각 에이전트의 현재 상태는 개발사 저장소·변경 기록·보안 권고·CVE를 읽고 판단한 것입니다. 수정 코드가 있다는 것과 그 경로가 실제로 막혔다는 것은 같지 않습니다.
  • Grok Build는 배포 버전을 확정하지 못했습니다. 공개 소스에 보호 코드가 들어간 날짜(8/31)는 확인했지만, npm으로 배포되는 버전 중 어느 것부터 포함됐는지는 기록으로 연결되지 않습니다.
  • Claude Code /ultrareview 건은 확인하지 못했습니다. 보고된 설정 키가 공개되지 않아, 변경 기록의 관련 항목이 그 수정인지 알 수 없습니다.
  • 직접 시험에서는 git의 core.fsmonitor 동작만 다뤘습니다. macOS, git 2.53.0 한 환경입니다. 다른 실행 설정(diff.external, 필터, 훅 경로)과 다른 git 버전·운영체제는 시험하지 않았습니다.
  • 근거의 상당 부분이 보안 회사 한 곳의 글입니다. Manifold는 관련 제품을 파는 회사입니다. 다만 Hermes의 수정 PR과 VulnCheck의 CVE, Goose의 보안 권고가 같은 결함을 독립적으로 기록하고 있습니다.
  • Manifold가 이름을 밝히지 않은 다른 에이전트에서도 같은 결함을 찾았다고 적었으므로, 이 표에 없는 도구가 안전하다는 뜻은 아닙니다.

참고자료

모두 2026-10-07에 원문을 열어 확인했습니다.

출처이 글이 가져온 것구분
Manifold Security, GitSpawn (Francisco Rosales, 2026-09-01)결함의 경로·전달 방식, 8건의 신고일과 공개 시점 상태, 권고보안 회사 자체 연구
Hermes PR #101483 · #130661 · #105008수정 날짜·범위, 릴리스 포함 여부(GitHub 비교 API)1차(개발사)
CVE-2026-71963 (VulnCheck, 2026-09-03)Hermes 영향 버전 0.18.2~0.21.0, 수정 커밋1차(CVE 레코드)
Qwen Code PR #11669 · 이슈 #10561 · #10193수정 범위와 PR이 밝힌 한계, 포함된 첫 버전(0.23.4), 열린 이슈1차(개발사)
xai-org/grok-build (fsmonitor.rs, git_status.rs), npm @xai-official/grok보호 코드와 그 첫 동기화 날짜, 배포 버전1차(개발사 소스)
Goose GHSA-r5pp-p5r8-466rCVE-2026-72718, 영향·수정 버전1차(개발사)
Claude Code 변경 기록 (2.1.196, 2.1.265, 2.1.285~2.1.290)clean 필터 수정, /ultrareview의 git 설정 처리 변경, fsmonitor 수정 항목이 따로 없음1차(개발사)
git-config 문서core.fsmonitor의 동작, GIT_CONFIG_COUNT의 우선순위1차(공식 문서)
이 글의 시험 (2026-10-07, macOS, git 2.53.0)명령별 실행 여부, 막는 방법별 결과, clone·zip 전달 차이직접 측정

개발사가 수정을 릴리스하거나 Manifold가 추가 내용을 공개하면 이 글을 고치고 개정 날짜를 적겠습니다.

뉴스레터

매주 일요일, 그 주의 새 리포트를 보내 드립니다

한 주에 나온 리포트를 한 통에 모아 보내고, 새 글이 없는 주는 건너뜁니다. 리포트 소식 외에는 보내지 않습니다.

받은 주소는 새 리포트 알림에만 사용하며, 언제든 해지할 수 있습니다. 개인정보처리방침
발행처

Eazler AI Lab은 주식회사 이즐러가 발행하는 AI 엔지니어링 연구 노트입니다. 1차 자료를 원문으로 읽고, 확인하지 못한 것은 확인하지 못했다고 씁니다.

편집 기준 · 검증 방법론 →

새 리포트 요약은 Threads @eazler.inc에도 올립니다.

AI 에이전트 도입·자동화 구축 문의는 hello@eazler.com