
Git 설정을 스캔하여 저장소가 코딩 에이전트(Claude Code, Codex, Cursor, Copilot)에서 코드를 실행하도록 허용하는지 확인하는 읽기 전용 스캐너입니다. GitSpawn 클래스와 CVE-2026-45033을 다룹니다. 의존성 없음, 네트워크 없음, 원격 측정(텔레메트리) 없음.
코딩 에이전트가 폴더를 여는 순간 코드를 실행하게 만들 수 있는 저장소를 검사하는 도구입니다. GuardSkill은 그 전에 이를 확인합니다.
npx guardskill .
읽기 전용입니다. 네트워크 호출 없음, 텔레메트리 없음, 설정 없음, 계정 없음. git 설정과 훅 스크립트를 읽고, 발견한 내용을 출력한 후 종료합니다.
코딩 에이전트는 프로젝트를 여는 즉시 git status, git diff 같은 일반적인 git 명령을 실행하여 컨텍스트를 수집합니다. Git은 저장소 자체의 .git/config에서 설정을 읽으며, 그중 여러 설정은 git이 실행할 프로그램을 지정합니다. core.fsmonitor에 명령을 넣으면, 아무것도 입력하기 전에 샌드박스 밖에서 사용자의 권한으로 실행됩니다.
두 건의 공개 연구가 이를 구체적으로 보여줍니다:
.git/config는 클론으로 전송되지 않기 때문입니다. 저장소는 .git 디렉터리가 이미 포함된 파일 형태로 도착해야 합니다 — zip, 공유 드라이브, 동기화 폴더, USB 스틱, 아카이브를 푸는 에이전트 등. (, )@github/copilot 1.0.43에서 safe.bareRepository=explicit을 강제하여 수정되었습니다. (GitHub Advisory)두 글 모두에서 권장하는 사용자 측 완화 조치는 동일합니다: 에이전트로 디렉터리를 열기 전에 git 설정을 검사하십시오. 트리 전체를 수작업으로 검사하는 것은 지루한 일입니다. 이 도구는 1초 만에 처리합니다.
GuardSkill은 트리를 탐색하여 에이전트가 가져올 수 있는 모든 git 설정을 찾습니다: 프로젝트 자체의 .git, 콘텐츠로 도착한 중첩 .git, 하위 디렉터리에 숨겨진 베어 저장소, 서브모듈이나 연결된 워크트리가 남기는 .git 파일, 그리고 git이 기본 설정 옆에 유지하는 설정 — config.worktree 및 모든 .git/modules/<name>/config. 각각이 검사됩니다.
| 클래스 | 검사 항목 |
|---|---|
| 직접 실행 키 | core.fsmonitor, core.sshCommand, core.gitProxy, core.pager, core.editor, sequence.editor, diff.external, uploadpack.packObjectsHook |
| 간접 실행 키 | filter.*.clean / .smudge / .process, diff.*.textconv, merge.*.driver, mergetool.*.cmd, difftool.*.cmd, credential.helper |
| 셸 별칭 | 값이 !로 시작하는 모든 alias.* |
| 다른 곳에서 로드된 설정 | include.path, includeIf.*.path |
| 훅 | core.hooksPath 재정의, .git/hooks의 활성(비-.sample) 스크립트, 실행 전에 다운로드를 셸로 파이프하거나 base64를 디코딩하는 훅 스크립트 |
| 전송 | protocol.allow 및 protocol.<name>.allow가 always로 설정된 경우, 그리고 나머지 줄을 셸에 넘기는 ext:: 전송을 사용하는 모든 원격 또는 서브모듈 URL |
| 구조 | 트리 내부의 베어 저장소(CVE-2026-45033 벡터), 등록된 서브모듈이 아닌 중첩 .git 디렉터리, 트리 내부의 git 디렉터리를 가리키는 .git 파일 |
npx guardskill . # 현재 프로젝트 스캔
npx guardskill ~/code/some-project # 특정 경로 스캔
npx guardskill . --json # 기계 판독 가능 형식
npx guardskill . --out report.md # Markdown 보고서도 작성
npx guardskill . --fail-on critical # 중요(critical) 발견 시에만 빌드 실패
npx guardskill . --exclude test/fixtures # 디렉터리 건너뛰기
종료 코드: 0 임계값 이상의 발견 없음, 1 임계값 이상의 발견 있음(기본 임계값: high), 2 스캔 자체 실패.
CI에서:
- name: Check for git execution vectors
run: npx guardskill . --fail-on high
출력 예시:
GuardSkill - git execution-vector scan (read-only)
Path: /Users/dev/projects/inherited-project
Git configurations inspected: 2 Directories walked: 148
[CRITICAL] vendor/payload.git - Bare git repository found inside the project tree
what Git discovers bare repositories while walking directories and applies their
configuration, including keys that execute commands.
found bare repository at vendor/payload.git
do Do not open this project with a coding agent until you have inspected the directory.
[CRITICAL] vendor/payload.git/config:3 - core.fsmonitor runs an external command
found core.fsmonitor = /tmp/.x/run.sh
2 critical, 0 high, 0 medium, 0 low.
Nothing was changed - this scan only reads.
허위 경고를 울리는 보안 도구는 삭제됩니다. 이 스위트는 29개의 현실적인 정상 저장소 — git-lfs, git-crypt, husky, .githooks 규칙, 등록된 서브모듈, 자격 증명 헬퍼, 사용자 정의 편집기와 페이저, 서명 설정 — 에 대해 실행되며, 그중 하나라도 정보 수준 이상의 발견을 생성하면 빌드가 실패합니다. 또한 알려진 공격 패턴을 중심으로 구축된 22개 저장소에 대해 실행되며, 하나라도 놓치거나 잘못된 규칙에 걸리면 실패합니다.
그 위에는 회피(evasion) 스위트가 있습니다: 그 안의 모든 사례는 이미 자체 테스트를 통과한 GuardSkill 버전을 공격하여 발견되었으며, 모든 커밋에서 실행되므로 향후 변경으로 조용히 다시 열릴 수 없습니다. git이 여전히 수용하는 모든 방식으로 표기된 동일한 키(대소문자, 따옴표, 줄 연속, CRLF, BOM(바이트 순서 표시), 섹션 줄의 키), 익숙한 도구 이름을 딴 페이로드, 일상적으로 보이도록 .husky라는 이름의 훅 디렉터리, 그리고 첫 번째 버전이 찾지 못한 곳에 숨겨진 설정을 다룹니다. 견고성(robustness) 스위트는 바이너리, 빈, 잘린, 200,000줄짜리 설정, 읽을 수 없는 디렉터리, 심볼릭 링크 루프, 트리 외부를 가리키는 포인터를 입력으로 제공하며, 스택 트레이스 대신 보고서를 요구합니다.
두 가지 의도적인 설계 선택:
.githooks 디렉터리는 위험이 아닌 정보(low)로 보고됩니다 — 그러나 GuardSkill은 여전히 스크립트를 읽고, 그중 하나가 실행 전에 코드를 가져오거나 디코딩하면 critical로 상향 조정합니다.include / includeIf는 항상 보고됩니다. include는 나중에 이 목록의 어떤 키든 도입할 수 있으며, 그것이 바로 키를 숨기는 방법입니다. 직접 작성한 공유 ~/.gitconfig는 무시해도 되는 정상적인 발견입니다.npm test를 실행하는 .husky는 정보 수준이며, 발견 항목에는 무엇이 실행될지 나열됩니다. /tmp에서 무언가를 실행하는 동일한 디렉터리는 그렇지 않습니다.어떤 것도 수정하지 않습니다. 절대. 발견한 어떤 것도 실행하지 않습니다. 네트워크 호출을 하지 않으며 텔레메트리를 수집하지 않습니다 — 오프라인으로 실행해도 동일하게 작동합니다. 아직 npm 의존성, .claude/settings.json, .vscode/tasks.json 또는 MCP 서버 정의는 스캔하지 않습니다. 그것들은 다음 클래스이지 이번 것이 아닙니다. 그리고 이 도구는 신호이지 판결이 아닙니다: 발견 항목을 읽고, 증거를 살펴보고, 스스로 판단하십시오.
이 저장소의 SKILL.md는 코딩 에이전트가 익숙하지 않은 프로젝트를 열기 전에 스캔을 직접 실행할 수 있게 합니다. 디렉터리를 스킬 폴더에 복사하거나 에이전트가 저장소를 가리키게 하십시오.
npm test # 픽스처를 재생성한 후 스위트 실행
픽스처는 수동으로 커밋되는 것이 아니라 코드(test/fixtures/generate.js)로 생성되므로, 정상 또는 취약 세트를 확장하는 것은 몇 줄이면 됩니다. 새 탐지 규칙은 rules/git-exec-keys.json에 추가됩니다 — 양쪽에 픽스처가 없는 규칙은 병합되지 않습니다.
연속 모니터링, Slack/Teams 알림 및 자동 수정 풀 리퀘스트는 유료 레이어로 계획되어 있습니다. 스캐너 자체는 무료이며 MIT 라이선스로 유지됩니다. 탐지 규칙은 공개 저장소에 유지됩니다 — 규칙을 읽을 수 없는 보안 도구는 신뢰해서는 안 됩니다.
MIT. Helios IT Solutions이 구축 및 유지 관리하며, 네덜란드 IT 서비스 제공업체입니다. 보안 문제: SECURITY.md 참조.