보안과 운영 자세
gatekit의 훅은 세션의 모든 프롬프트·도구 호출·종료 이벤트에서 실행되고, 워커 백엔드는 프로젝트에 쓰기 권한을 가진 다른 CLI를 띄운다. 이 표면이 아래 기본값들을 결정한다.
훅은 자기 오류로 세션을 막지 않는다
모든 훅은 hookio.run을 통과하며 언제나 exit 0으로 끝난다. 내부 예외는 .gatekit/runs/hook-errors.log에 한 줄로 추가된다.
자기 상태를 파싱하지 못하거나 버그를 만나거나 시간이 초과된 게이트는 "동작을 허용하고 기록한다"로 격하된다. "멈추거나 사용자 세션을 죽인다"가 되지 않는다. 깨진 게이트 스크립트는 기록된 성가심이지 장애가 아니다.
이것은 보안 자세이자 신뢰성 자세다. 하네스가 세션을 망가뜨리면 사용자는 하네스를 꺼버리고, 그 순간 강제되는 규칙이 하나도 없어진다.
워커 샌드박스는 기본 on이고 bypass는 거부된다
.gatekit/config.json의 워커 백엔드는 기본적으로 샌드박스 상태로 실행된다. Codex 백엔드의 기본 argv는 codex exec --sandbox workspace-write이며, 프로젝트 워크스페이스 안의 파일만 편집하고 밖은 건드리지 않는다.
샌드박스 우회는 명시적 opt-in이다.
- 백엔드가 자기 설정 항목에
"unsafe": true를 직접 설정해야 한다. - gatekit은 사용자를 대신해 이 값을 설정하지 않는다.
workers enable은 argv에 bypass·dangerous·yolo 계열 플래그가 있는데"unsafe"가 없으면 활성화를 거부한다.- unsafe로 실행되면 잡 영수증(
job.json)에 그 사실이 기록된다.
조용히 bypass 모드로 떨어지는 코드 경로는 없다. 샌드박스가 꺼져 있다면 설정이 그렇게 되어 있기 때문이고, 그 사실은 잡 이력에 남는다.
비밀정보는 원장과 로그에 남지 않는다
아래 파일들은 전부 구조적 상태만 담도록 설계됐다. 해시, 판정, 범위, 타임스탬프다.
| 파일 | 내용 |
|---|---|
.gatekit/runs/<session_id>.json | 세션 원장 |
.gatekit/runs/hook-errors.log | 훅 오류 한 줄 로그 |
.gatekit/jobs/<job_id>/ | 잡 기록 |
.gatekit/approvals.json | 승인 기록 |
API 키·토큰·자격 증명은 여기에 들어가지 않는다. 이 중 하나에 비밀정보를 쓰는 코드 경로를 발견하면 그것은 버그다. 재현 정보를 담은 공개 이슈를 열지 말고 비공개로 보고한다.
목업과 웹 콘텐츠는 데이터이지 지시가 아니다
목업 이미지, 스크린샷, 스크랩한 웹 페이지 등 외부에서 흘러 들어와 interview나 mockup 파이프라인을 지나는 텍스트는 추론 대상 데이터로만 취급된다. 어떻게 표현되어 있든 에이전트가 따라야 할 지시로 다루지 않는다.
이런 출처의 콘텐츠에 에이전트를 겨냥한 지시문이 들어 있는 것처럼 보이면, 그것은 따를 것이 아니라 원장에 gap으로 표시할 사항이다.
승인이 필요한 행위
gatekit이 사용자를 대신해 하지 않는 일들이다.
| 행위 | 누가 하는가 |
|---|---|
spec/05-gate.md 승인 | 사용자만. 커맨드가 AskUserQuestion으로 묻는다 |
| Codex 백엔드 활성화 | 설명 후 사용자 확인 필요 |
| Codex를 기본 백엔드로 지정 | 별도 확인 필요 |
"unsafe": true 설정 | gatekit은 절대 설정하지 않는다 |
| doctor의 처방 실행 | 실행 전에 묻는다 |
특히 doctor는 05-gate.md를 다시 쓰거나, 승인을 기록하거나, unsafe 백엔드를 켜는 처방을 절대 자동 실행하지 않는다. 이것들은 사용자의 결정이며 사용자 자신의 커맨드를 통해 이루어진다.
쓰기 범위는 선언이 아니라 강제다
태스크의 write_scope는 잡 러너가 설정하는 GATEKIT_TASK_ID 환경변수를 근거로 PreToolUse 쓰기 게이트가 강제한다.
태스크는 실수로도, 잘못 동작하는 프롬프트로도 선언된 범위 밖에 쓸 수 없다. 게이트가 도구 호출 경계에서 거부하며, 이는 워커가 스스로 무엇을 해도 된다고 믿는지와 무관하다.
범위를 확인할 수 없으면 거부한다. task.json을 읽을 수 없는 태스크 id를 주장하는 워커는 모든 쓰기를 거부당한다.
아티팩트 경로 탈출 차단
완료 기준의 artifacts 경로에는 세 가지 제약이 있다.
- 상대 경로여야 한다.
..를 포함할 수 없다.os.path.realpath해석 후에도 프로젝트 루트 안에 있어야 한다.
심볼릭 링크로 루트 밖을 가리키면 fail이다. 쓰기 게이트도 같은 방식으로 경로를 정규화한다. 상대 입력은 루트 기준으로 해석하고 심볼릭 링크를 풀어서, 링크를 이용해 프로젝트 밖에 착지하는 것을 막는다.
취약점 보고
gatekit에서 보안 문제를 발견하면 공개 이슈를 열지 말고 비공개로 보고한다. 연락처는 저장소의 SECURITY.md에 있다.