fix(security): mcp.json 로컬 저장이 0644 — 자격 파일 권한이 경로마다 갈렸다 - #258
Merged
Conversation
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
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
mcp.json은isSecretRel이 시크릿으로 분류하는 파일(서버 정의=임의 command, env=토큰)인데 동기화로 받으면 0600, 로컬에서 만들면 0644였다. 실측으로 확인(이 기기의 워크스페이스 파일이 실제 0644).로컬 우선 제품에서 OS 사용자 경계가 마지막 경계다 — 크루는 권한 게이트가 막지만 같은 기기의 다른 도구·에이전트·계정은 게이트 밖이고, 파일 권한만이 방어다. 고객 기기의 코딩 에이전트가 Argo 파일을 읽은 사고와 같은 계열.
saveMcp에mode: 0o600+chmod(기존 파일은 mode 인자가 무시됨)🤖 Generated with Claude Code