docs: archive macOS Keychain and Preflight bypass review reports from cline and claude
This commit is contained in:
+41
@@ -0,0 +1,41 @@
|
|||||||
|
# 리뷰 리포트 — Job dbab0e07
|
||||||
|
|
||||||
|
- **리뷰 대상**: 커밋 `36b3910` — (1) `create_session.sh` agy 인증 사전검증을 파일 기반으로 우회해 macOS 키체인 접근 Hang 방지, (2) `lib.sh provision_isolation()`에 Darwin 전용 `~/Library/Keychains` 심링크 시딩 추가로 격리 모드 인증 토큰 소실 해결
|
||||||
|
- **리뷰어**: claude (planner-reviewer)
|
||||||
|
- **리뷰 방식**: 정적 분석(bash -n, shellcheck 기준선 대비) + 계측 스텁/가짜 HOME/uname 오버라이드 기반 실행 검증
|
||||||
|
|
||||||
|
## 1. 설계 타당성
|
||||||
|
|
||||||
|
- **Hang 우회**: agy 격리 lever가 `HOME=<root>`이고(lib.sh 주석의 Phase 0 실측 매트릭스), macOS에서 `agy models`가 키체인 접근 프롬프트로 비대화식 환경에서 블로킹되는 문제를, 디스크상 토큰 파일(`~/.gemini/oauth_creds.json` 또는 `~/.gemini/antigravity-cli/antigravity-oauth-token`) 존재 시 CLI 호출 자체를 생략하는 방식으로 회피 — 검사 파일 경로 2개가 `provision_isolation()`이 agy 자격증명으로 시딩하는 파일 목록과 정확히 일치함(저장소 내부 지식과 정합).
|
||||||
|
- **토큰 소실 해결**: 격리 시 `HOME=<root>`로 바뀌면 macOS 키체인 경로(`$HOME/Library/Keychains`)가 빈 격리 홈을 가리켜 자격증명 조회가 실패하는 구조 — 실제 Keychains 디렉터리를 심링크로 시딩하는 것은 이 파일의 기존 철학("auth/config files are SYMLINKED ... never copied — token refresh must converge on the real files")과 일치하는 올바른 해법.
|
||||||
|
|
||||||
|
## 2. 실행 검증 (전부 실측)
|
||||||
|
|
||||||
|
- **사전검증 우회(Case A)**: 가짜 HOME에 토큰 파일 배치 + 호출 기록 스텁 `agy`를 PATH 선두에 두고 `create_session.sh --dry-run --agent agy` 실행 → **`agy` 바이너리가 단 한 번도 실행되지 않음**(Hang 원인 원천 제거 확인), exit 0.
|
||||||
|
- **폴백 보존(Case B)**: 토큰 파일 없는 빈 HOME → `agy models`가 정확히 1회 호출되고 스텁 실패 시 기존 오류 메시지("agy is not authenticated")와 exit 1이 그대로 동작 — 미인증 조기 차단 시맨틱 유실 없음.
|
||||||
|
- **Keychains 시딩**: lib.sh를 소싱한 격리 하네스에서 `uname`을 Darwin으로 오버라이드하고 가짜 HOME(`Library/Keychains/login.keychain-db` 포함)으로 `provision_isolation agy` 실행 →
|
||||||
|
- 심링크 정상 생성, 격리 홈 경유 read-through로 실제 키체인 데이터 접근 확인.
|
||||||
|
- `seeded` 출력에 `Library/Keychains`가 기존 포맷대로 병합됨.
|
||||||
|
- **재프로비저닝 멱등성**: 2회 실행에도 `ln -sfn`의 `-n` 덕에 중첩 링크(`Keychains/Keychains`) 없이 동일 결과.
|
||||||
|
- **🔑 삭제 안전성(최중요)**: create rollback의 `rm -rf "$ISOLATION_ROOT"` 시뮬레이션 → **심링크만 제거되고 실제 키체인 파일은 온전히 생존**함을 실측 확인(rm -rf는 심링크를 따라 들어가지 않음). `seeded` 목록을 순회하며 삭제하는 소비자는 코드베이스에 존재하지 않음(생성·기록 전용)도 grep으로 확인.
|
||||||
|
|
||||||
|
## 3. 정적 분석
|
||||||
|
|
||||||
|
- `bash -n` 양 파일 통과. `shellcheck -S warning`: 변경 전 기준선(fc24af4) 대비 양 파일 모두 **경고 0건 → 0건, 신규 경고 없음**.
|
||||||
|
|
||||||
|
## 4. 유실 검사
|
||||||
|
|
||||||
|
- agy 외 에이전트(claude/cline/hermes)의 provision 분기·사전검증 분기는 바이트 단위로 무변경. Darwin 가드로 Linux에서 Keychains 시딩 완전 스킵(Linux 회귀 없음).
|
||||||
|
|
||||||
|
## 5. 비차단(Non-blocking) 지적 사항
|
||||||
|
|
||||||
|
1. **사전검증 약화** — 파일 존재가 토큰 유효성을 보증하지 않으므로, 만료/폐기된 토큰은 이제 preflight를 통과하고 TUI 기동 단계에서야 실패가 드러남. Hang 대비 합리적 트레이드오프이나 오류 표면화 시점이 늦어짐.
|
||||||
|
2. **Darwin 미게이팅** — 우회 분기가 OS 무관하게 적용되어, Hang이 없던 Linux에서도 엄격 검사가 생략됨(부수적으로 네트워크 호출 생략이라 빨라지는 이점은 있음). 엄격성이 중요해지면 `uname` 게이트 추가 고려.
|
||||||
|
3. **자격증명 격리 부재(의도된 설계)** — 격리 세션이 실제 키체인을 공유하게 되나, 시딩의 목적 자체가 인증 공유이므로 기존 심링크 시딩 철학과 일치. 기록 차원의 언급.
|
||||||
|
4. **macOS 실기기 미검증** — Security.framework가 심링크된 `$HOME/Library/Keychains`를 실제로 수용하는지는 Linux 환경에서 실측 불가. 메커니즘 수준(경로 해석·링크·멱등성·삭제 안전성)은 전부 검증 완료.
|
||||||
|
|
||||||
|
## 6. 결론
|
||||||
|
|
||||||
|
두 수정 모두 고장 메커니즘을 정확히 겨냥했고, 우회·폴백·시딩·멱등성·삭제 안전성이 전부 실행으로 입증되었으며 정적 분석 신규 경고와 기존 동작 유실이 없다. 비차단 4건은 후속 개선/기록 수준이다.
|
||||||
|
|
||||||
|
[VERDICT: PASS]
|
||||||
@@ -0,0 +1,162 @@
|
|||||||
|
# ✅ Peer Review Report: macOS 키체인 Hang 우회 및 격리 모드 인증 토큰 소실 수정 (Job 14943484)
|
||||||
|
|
||||||
|
**Job**: `14943484` · **Reviewer**: Reviewer B (Cline, `canary-projects-multi-agent-mux-reviewer-cline`)
|
||||||
|
**Review Target**: 커밋 `36b3910` "fix(mac-compat): bypass keyring auth check hang and link macOS Library/Keychains to isolated home"
|
||||||
|
**Files Changed**: `lib.sh` (+8/-0), `create_session.sh` (+4/-1) — 2 files, 12 insertions, 1 deletion
|
||||||
|
**Review Scope**: 작업 목표 "create_session.sh 및 lib.sh에서 macOS 키체인(keyring) 접근 차단으로 인한 비대화식 Hang 현상과 격리 모드(--isolate) 시 인증 토큰 소실 문제를 각각 파일 기반 사전 검증 우회 및 Library/Keychains 폴더 링크 추가를 통해 해결" — 린트, 동작성, 유실 관점 교차 리뷰
|
||||||
|
**Method**: 커밋 diff 분석 + `bash -n`/`shellcheck` 정적 분석 + 인증 바이패스 로직 4케이스 검증 + Darwin 가드 검증 + 경로 일치성 확인 + seeded 패턴 일관성 확인 + 타 agent keychain 필요성 분석
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 변경 사항 개요
|
||||||
|
|
||||||
|
### 1.1 파일 기반 사전 검증 우회 (create_session.sh 라인 92-98)
|
||||||
|
|
||||||
|
```diff
|
||||||
|
elif [ "$AGENT" = "agy" ]; then
|
||||||
|
- if ! agy models >/dev/null 2>&1; then
|
||||||
|
+ # Fast, non-blocking check: if token or credentials exist on disk, assume authenticated to prevent keyring hang
|
||||||
|
+ if [ -f "$HOME/.gemini/oauth_creds.json" ] || [ -f "$HOME/.gemini/antigravity-cli/antigravity-oauth-token" ]; then
|
||||||
|
+ true
|
||||||
|
+ elif ! agy models >/dev/null 2>&1; then
|
||||||
|
echo "ERROR: agy is not authenticated. Please log in first." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
**목적**: `agy models` 명령이 macOS에서 키체인 접근 시 비대화식 Hang 유발. 토큰/자격증명 파일 존재 시 파일 기반으로 인증 가정하여 Hang 우회.
|
||||||
|
|
||||||
|
### 1.2 Library/Keychains 폴더 링크 추가 (lib.sh 라인 841-848)
|
||||||
|
|
||||||
|
```diff
|
||||||
|
+ # On macOS, seed ~/Library/Keychains to allow isolated agy to query Keychain Access credentials
|
||||||
|
+ if [ "$(uname)" = "Darwin" ]; then
|
||||||
|
+ mkdir -p "$root/Library"
|
||||||
|
+ if [ -d "$HOME/Library/Keychains" ]; then
|
||||||
|
+ ln -sfn "$HOME/Library/Keychains" "$root/Library/Keychains"
|
||||||
|
+ seeded="${seeded:+$seeded,}Library/Keychains"
|
||||||
|
+ fi
|
||||||
|
+ fi
|
||||||
|
```
|
||||||
|
|
||||||
|
**목적**: `--isolate` 모드 시 격리된 홈 디렉토리에 `~/Library/Keychains` 심볼릭 링크 추가 → 격리 agy가 Keychain Access 자격증명 조회 가능.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 작업 목표 달성도
|
||||||
|
|
||||||
|
| 목표 | 상태 | 확인 |
|
||||||
|
|------|------|------|
|
||||||
|
| macOS 키체인 Hang 우회 (파일 기반 사전 검증) | ✅ | 토큰 파일 존재 시 `agy models` 스킵 |
|
||||||
|
| 격리 모드 인증 토큰 소실 해결 (Keychains 링크) | ✅ | Darwin 가드 + Library/Keychains 심볼릭 링크 |
|
||||||
|
| create_session.sh 적용 | ✅ | 라인 92-98 |
|
||||||
|
| lib.sh 적용 | ✅ | 라인 841-848 (agy case) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 정적 분석
|
||||||
|
|
||||||
|
| 파일 | bash -n | shellcheck | 비고 |
|
||||||
|
|------|---------|------------|------|
|
||||||
|
| lib.sh | ✅ SYNTAX OK | ✅ 경고 없음 (clean) | 본 diff 새 경고 0건 |
|
||||||
|
| create_session.sh | ✅ SYNTAX OK | SC1091 (info, 기존 source) — **본 diff 새 경고 없음** | EXIT 1 (기존) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 동작성 검증
|
||||||
|
|
||||||
|
### 4.1 ✅ 인증 바이패스 로직 4케이스 검증
|
||||||
|
|
||||||
|
| 케이스 | 조건 | 결과 | 판정 |
|
||||||
|
|--------|------|------|------|
|
||||||
|
| 1 | `antigravity-oauth-token` 파일 존재 | BYPASS (token found) | ✅ Hang 우회 |
|
||||||
|
| 2 | `oauth_creds.json` 파일 존재 | BYPASS (oauth_creds found) | ✅ Hang 우회 |
|
||||||
|
| 3 | 파일 없음 + agy models 실패 | ERROR (not authenticated) | ✅ 정상 에러 |
|
||||||
|
| 4 | 파일 없음 + agy models 성공 | PASS (agy models succeeded) | ✅ 정상 통과 |
|
||||||
|
|
||||||
|
**검증**: 파일 존재 시 `agy models` 호출 스킵 → macOS 키체인 Hang 방지. 파일 부재 시 기존 `agy models` 체크 유지 → 미인증 감지.
|
||||||
|
|
||||||
|
### 4.2 ✅ Darwin 가드 검증 (Keychains 링크)
|
||||||
|
|
||||||
|
| 조건 | 결과 | 판정 |
|
||||||
|
|------|------|------|
|
||||||
|
| `uname` = Linux | Darwin 체크 실패 → 블록 스킵 | ✅ Linux에서 Keychains 링크 미생성 |
|
||||||
|
| `uname` = Darwin + `~/Library/Keychains` 존재 | `mkdir -p $root/Library` + `ln -sfn` 실행 | ✅ macOS에서 심볼릭 링크 생성 |
|
||||||
|
| `uname` = Darwin + `~/Library/Keychains` 부재 | `[ -d ]` 실패 → 링크 미생성 | ✅ graceful (seeded 미추가) |
|
||||||
|
|
||||||
|
### 4.3 ✅ 경로 일치성 (auth check vs provisioning)
|
||||||
|
|
||||||
|
| 파일 | create_session.sh 체크 경로 | lib.sh provisioning 경로 | 일치 |
|
||||||
|
|------|---------------------------|-------------------------|------|
|
||||||
|
| oauth_creds.json | `$HOME/.gemini/oauth_creds.json` | `$HOME/.gemini/oauth_creds.json` (라인 835) | ✅ |
|
||||||
|
| antigravity-oauth-token | `$HOME/.gemini/antigravity-cli/antigravity-oauth-token` | `$HOME/.gemini/antigravity-cli/antigravity-oauth-token` (라인 838) | ✅ |
|
||||||
|
|
||||||
|
인증 체크 파일과 격리 provisioning 파일 경로가 완전 일치 → 일관성 확보.
|
||||||
|
|
||||||
|
### 4.4 ✅ seeded 패턴 일관성
|
||||||
|
|
||||||
|
`seeded="${seeded:+$seeded,}Library/Keychains"` (라인 846) — 기존 패턴(라인 836, 839, 853)과 동일한 `${seeded:+$seeded,}` 누적 패턴. 일관성 확보 ✅
|
||||||
|
|
||||||
|
### 4.5 ✅ 타 agent keychain 필요성 분석
|
||||||
|
|
||||||
|
| Agent | 인증 방식 | Keychain 필요 | Keychains 링크 적용 |
|
||||||
|
|-------|----------|---------------|---------------------|
|
||||||
|
| claude | `.credentials.json` 파일 기반 | 아니오 | 불필요 (맞음) |
|
||||||
|
| cline | 파일 기반 settings + DB | 아니오 | 불필요 (맞음) |
|
||||||
|
| agy | macOS Keychain Access | **예** | **적용됨** ✅ |
|
||||||
|
| hermes | `auth.json` 파일 기반 | 아니오 | 불필요 (맞음) |
|
||||||
|
|
||||||
|
Keychains 링크가 agy case에만 추가된 것은 **정확한 타겟팅** — agy만 macOS Keychain 사용, 타 agent는 파일 기반 인증.
|
||||||
|
|
||||||
|
### 4.6 ✅ true 문 유효성
|
||||||
|
|
||||||
|
`if` 블록 본문으로 `true` 사용 — bash에서 유효 (no-op). `if true; then true; fi` 검증 통과. 의도: 파일 존재 시 아무 동작 없이 통과(바이패스).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 잔여 결함 (LOW — INFORMATIONAL)
|
||||||
|
|
||||||
|
### 5.1 ⚠️ 만료된 토큰 시 false positive 가능성 (LOW, 설계 트레이드오프)
|
||||||
|
|
||||||
|
**위치**: create_session.sh 라인 93
|
||||||
|
**분석**: 토큰 파일이 존재하지만 **만료/무효**한 경우, 바이패스가 `agy models` 체크를 스킵하여 세션 시작 → agy 실행 시 인증 실패 가능.
|
||||||
|
**평가**: 의도적 트레이드오프 — 원 문제는 **Hang**(무한 대기)이며, 만료 토큰으로 인한 후속 실패는 Hang보다 나음(진단 가능). 주석(라인 92)이 의도 명시.
|
||||||
|
**심각도**: LOW — BLOCKING 아님. 설계 결정으로 수용 가능.
|
||||||
|
|
||||||
|
### 5.2 ℹ️ 작업 트리 잔여 .tmp 파일 (INFO, unrelated)
|
||||||
|
|
||||||
|
**위치**: `.agents/skills/multi-agent-mux-delegate-job/multi-agent-mux-delegate-job.14657_36745.tmp` (untracked)
|
||||||
|
**분석**: 이전 delegate_job_safe 실행 잔여물. 본 diff와 무관. 무해하지만 정리 권장.
|
||||||
|
**심각도**: INFO — 본 리뷰 범위 외.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 종합 평가
|
||||||
|
|
||||||
|
### 작업 목표 달성도
|
||||||
|
"create_session.sh 및 lib.sh에서 macOS 키체인(keyring) 접근 차단으로 인한 비대화식 Hang 현상과 격리 모드(--isolate) 시 인증 토큰 소실 문제를 각각 파일 기반 사전 검증 우회 및 Library/Keychains 폴더 링크 추가를 통해 해결" — **달성**.
|
||||||
|
|
||||||
|
### 변경 품질
|
||||||
|
1. ✅ **파일 기반 Hang 우회**: 토큰/자격증명 파일 존재 시 `agy models` 스킵 — 4케이스 검증 모두 PASS
|
||||||
|
2. ✅ **Keychains 심볼릭 링크**: Darwin 가드 + `[ -d ]` 존재 확인 + `ln -sfn` — 안전한 조건부 생성
|
||||||
|
3. ✅ **경로 일치성**: auth check 파일과 provisioning 파일 경로 완전 일치
|
||||||
|
4. ✅ **타겟팅 정확**: agy case에만 Keychains 링크 추가 — 타 agent는 파일 기반 인증으로 불필요
|
||||||
|
5. ✅ **seeded 패턴 일관**: 기존 누적 패턴과 동일
|
||||||
|
6. ✅ **Darwin 가드**: Linux에서 미실행, macOS에서만 동작
|
||||||
|
|
||||||
|
### 검증 결과
|
||||||
|
- 정적 분석: `bash -n` 2/2 OK, `shellcheck` 본 diff 새 경고 없음 (lib.sh clean, create SC1091 기존만) ✅
|
||||||
|
- 인증 바이패스: 4케이스(토큰 존재/ oauth_creds 존재/ 파일 없음+실패/ 파일 없음+성공) 모두 PASS ✅
|
||||||
|
- Darwin 가드: Linux 스킵 확인 ✅
|
||||||
|
- 경로 일치성: auth check ↔ provisioning 완전 일치 ✅
|
||||||
|
- seeded 일관성: 기존 패턴과 동일 ✅
|
||||||
|
- 타 agent 분석: agy만 Keychain 사용, 타겟팅 정확 ✅
|
||||||
|
|
||||||
|
### 잔여 LOW 1건 + INFO 1건
|
||||||
|
- LOW 5.1: 만료 토큰 false positive — 의도적 트레이드오프 (Hang > 후속 실패), 주석 명시
|
||||||
|
- INFO 5.2: 잔여 .tmp 파일 (본 diff 무관)
|
||||||
|
|
||||||
|
### 판정 근거
|
||||||
|
작업 목표(키체인 Hang 우회 + 격리 토큰 소실 해결) 완전 달성. 파일 기반 바이패스 4케이스 검증 PASS, Darwin 가드 동작 확인, 경로 일치성 확보, agy 타겟팅 정확. 정적 분석 통과. 잔여 LOW 1건은 의도적 설계 트레이드오프(Hang 방지가 만료 토큰 후속 실패보다 우선). 주 개발자가 macOS 키체인 문제를 정확히 진단하고 파일 기반 우회 + Keychains 링크로 해결했으므로 PASS 판정이 타당.
|
||||||
|
|
||||||
|
[VERDICT: PASS]
|
||||||
Reference in New Issue
Block a user