Skip to content

fix(security): mcp.json 로컬 저장이 0644 — 자격 파일 권한이 경로마다 갈렸다 - #258

Merged
beyondworks merged 2 commits into
mainfrom
fix/mcp-json-mode
Aug 18, 2026
Merged

fix(security): mcp.json 로컬 저장이 0644 — 자격 파일 권한이 경로마다 갈렸다#258
beyondworks merged 2 commits into
mainfrom
fix/mcp-json-mode

Conversation

@beyondworks

Copy link
Copy Markdown
Owner

mcp.jsonisSecretRel이 시크릿으로 분류하는 파일(서버 정의=임의 command, env=토큰)인데 동기화로 받으면 0600, 로컬에서 만들면 0644였다. 실측으로 확인(이 기기의 워크스페이스 파일이 실제 0644).

로컬 우선 제품에서 OS 사용자 경계가 마지막 경계다 — 크루는 권한 게이트가 막지만 같은 기기의 다른 도구·에이전트·계정은 게이트 밖이고, 파일 권한만이 방어다. 고객 기기의 코딩 에이전트가 Argo 파일을 읽은 사고와 같은 계열.

  • saveMcpmode: 0o600 + chmod(기존 파일은 mode 인자가 무시됨)
  • 회귀 테스트 2건 — 변이 확인: 수정을 되돌리면 2/2 red, 복원하면 2/2 green

🤖 Generated with Claude Code

beyondworks and others added 2 commits August 19, 2026 00:25
isSecretRel이 시크릿으로 분류하는 파일인데, 동기화로 내려오면 0600(sync.mjs)이고 로컬
저장만 mode를 안 줘 0644였다 — 같은 파일의 권한이 경로에 따라 갈렸다(실측 2026-08-19).
mcp.json은 서버 정의(임의 command)와 env(토큰)를 담는다.

로컬 우선 제품에서 OS 사용자 경계가 마지막 경계다. 크루는 권한 게이트가 막지만 같은 기기의
다른 도구·계정은 게이트 밖이라, 파일 권한이 유일한 방어다.

- saveMcp에 mode 0600 + chmod(기존 파일은 mode 인자가 무시된다)
- 회귀 테스트 2건 — 변이(수정 되돌림)로 2/2 red 확인 후 채택

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Windows CI 실패(자가 발견). Node가 Windows에서 mode 인자를 무시하므로 0600 단언이 성립하지
않는다. 조용히 건너뛰지 않고 '윈도우는 별도 수단이 필요하다'는 사유를 테스트에 남긴다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@beyondworks
beyondworks merged commit 997ca22 into main Aug 18, 2026
2 checks passed
beyondworks added a commit that referenced this pull request Aug 19, 2026
분리 검수(다른 컨텍스트) MED-C·MED-2·LOW.

MED-C — codex는 v0.1.41부터 config.toml로 실제 MCP를 받는다. 그런데 크루 카드와 마켓은
여전히 "CLI 러너에서는 MCP가 실행되지 않는다 — SDK 러너로 바꾸라"고 말했다. 직전 커밋에서
크루별 `mcp:` 범위 지정을 codex 주입에도 걸어 놓고, 바로 그 UI 밑에 "어차피 안 돈다"가
함께 뜨는 상태였다 — "안내와 실제가 갈리면 안내가 거짓"이라는 그 커밋의 논지가 정면으로 깨진다.

판정을 kind가 아니라 **MCP를 실제로 받는가**로 바꿨다. 카탈로그에 `mcp: true`(codex)를 두고
/api/runners가 실어 나른다. 조건은 `kind === 'cli' && !r.mcp` — gemini·antigravity는 벤더
비대화 경로가 MCP를 안 받으므로 경고가 그대로 뜬다(러너 중립성: 못 하는 건 화면에 정직하게).
문구도 Codex를 막힌 쪽에서 빼고 다시 썼다(ko·en).

MED-2 — 범위를 통과한 MCP의 env 토큰이 config.toml에 평문으로 실리는데 기본 모드로 쓰였다.
mcp.json을 0600으로 쓰는 것과 같은 근거(PR #258)인데 codex 쪽만 빠져 있어 같은 비밀이 더
느슨하게 복제됐다. config.toml 0600 + 베이스 codex-home 0700(턴 홈 mkdtemp와 같은 등급).
Windows는 POSIX 모드가 없어 미적용 — mcp.json과 같은 한계이고 테스트에 사유를 적었다.

LOW — 살균 후 이름 충돌 방어. 'my.tool'과 'my tool'이 함께 오면 [mcp_servers.my_tool]이 두 번
찍혀 TOML 파싱이 깨진다 = 이 함수가 피하려던 "턴 전체 사망"의 재현. 뒤엣것을 빼고 로그로 남긴다.

검증:
- /api/runners 실응답 확인(격리 :3199) — codex mcp=true, gemini·antigravity·SDK 전부 false.
- 마켓 배너 실렌더 확인 — 옛 문구("CLI 러너(Codex…") 사라짐, 새 문구 노출, Codex가 막힌
  목록에서 빠짐.
- 테스트 2건 추가(0600 실측·중복 테이블 부재), 변이 확인: 두 가드 제거 시 각각 red.
- 899건 fail 0, next build 통과.

미검증: codex 실턴으로 config.toml이 실제로 먹히는지는 이 세션에서 안 돌렸다(파일 생성·권한·
내용까지만). 크루 카드 경고의 화면 확인은 CLI 러너 크루 + MCP 설치 픽스처가 필요해 미실시 —
조건이 읽는 데이터(r.mcp)까지만 라이브 확인. Windows 축 미실측.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant