security-review (everything-claude-code)
인증, 사용자 입력, 비밀 정보, API 엔드포인트, 결제를 보안 체크리스트로 점검합니다.
ECC security-review: 심어 둔 취약점을 찾는 능력은 일반 Codex와 다르지 않고, 토큰도 비슷하게 사용합니다
Codex CLI · gpt-6-astra
24.9 / 30
스킬 없이 대비 향상폭: -0.16 · 상황에 따라 · 18회 실행
상황에 따라: 향상폭 -0.16가 +1.0 미만. 추천이 되려면 총점 22/30, 출력 품질 3.5, 향상폭 +1.0이 필요합니다.
SOTA
통과Codex로 테스트
커버 대상 Codex, Claude Code
Codex CLI 0.166 (SOTA 티어): 채점된 실행 18회. 여기서 통과하면 티어 규칙에 따라 Claude Code도 커버되지만, 두 번째 티어에 대해서는 아무것도 말해주지 않습니다.
점수
각 차원은 0~5점이며 여섯 차원을 더하면 30점 만점의 총점이 됩니다. 모든 차원에서 5가 가장 좋습니다. 비용 5는 저렴하고 빠름, 설치 5는 쉬움을 뜻합니다.
- 트리거 신뢰도
- 5.0
- 스킬 없이 대비 향상폭
- 1.8
- 출력 품질
- 4.1
- 토큰 및 시간 비용
- 5.0
- 설치 및 이식성
- 4.0
- 안전성
- 5.0
보안 리뷰
안전정적 스캔: CRITICAL 5 / HIGH 6 / MEDIUM 4. 수동 검토: 네트워크가 차단된 샌드박스에서 실행 안전(스캐너 지적 사항은 설명됨). 스캔이 깨끗하다고 해서 스킬이 안전하다는 증거는 아닙니다.
설치
npx skills@latest add affaan-m/everything-claude-code --skill security-review
고정 커밋: b38be6a7f6350964d59328b52f0624e1d1d552d1
테스트일: 2026-11-02
테스트한 과제
- 작은 서비스 모듈 리뷰 — 병합 전에 orders_service.py를 보안 리뷰하세요. 찾은 문제를 심각한 순서대로 나열하세요. 파일은 수정하지 마세요.
- 인증 헬퍼 리뷰 — auth_handlers.py를 보안 리뷰하세요. 방금 로그인 플로우용으로 작성했습니다. 문제를 심각한 순서대로 나열하세요. 파일은 수정하지 마세요.
- 업로드 엔드포인트 리뷰 — upload_api.py를 보안 리뷰하세요. 취약점을 심각한 순서대로 나열하세요. 파일은 수정하지 마세요.
장점
- 스킬 이름을 언급하지 않았는데도 적용되었습니다. 스킬 사용군 실행 6/6회에서 스킬 파일을 읽었습니다.
- 토큰 오버헤드 없음: 스킬 없이의 1.03배 토큰을 사용합니다.
단점
- 스킬 없이보다 측정 가능한 향상 없음(-0.16, 노이즈 범위 안).
- 한 문장 프롬프트는 4.29점, 스킬 사용은 4.06점(-0.23).
- 테스트 참고: t1 과제에는 보안 문제가 아닌 항목이 3개 심어져 있어 가능한 최고 재현율이 3.1 근처로 제한됩니다.
- 과제·그룹당 n=2이며, 약 1점 미만의 차이는 노이즈입니다.
리뷰
Codex CLI 0.166 (gpt-6-astra, low reasoning)을 Mac 테스트 머신에서 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬 설치(스킬 사용군), 미설치(대조군), 미설치 상태에서 스킬의 핵심 요구사항만 한 문장으로 압축해 프롬프트에 덧붙인 경우(한 문장 프롬프트군)로 나눴으며, 과제·그룹당 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 언급하지 않았습니다(아래에 적은 경우 제외). 각각 문제 8개를 심어 둔 작은 파일 세 개(서비스 모듈, 인증 헬퍼, 업로드 엔드포인트)와 읽기 전용 '문제를 심각한 순서대로 나열하라'는 요청을 준비했습니다. 주문 서비스에는 보안 결함이 아닌 문제 세 개(off-by-one 경계, 리소스 누수, 부동소수점 금액)가 들어 있습니다. 보안 리뷰에서는 이런 항목을 건너뛰는 것이 기대되므로, 해당 과제에서 보안 리뷰어가 찾을 수 있는 것은 최대 8개 중 5개이며 점수는 3.1 근처가 상한입니다.
3개 그룹 비교
| 그룹 | 평균 점수 (0-5) | 실행당 토큰 |
|---|---|---|
| 스킬 없음 | 4.22 | 60k |
| 한 문장 프롬프트 | 4.29 | 44k |
| 스킬 사용 | 4.06 | 62k |
Codex CLI에서 18회 실행해 측정했고, LLM 심사 없이 규칙 기반 검사로 채점했습니다. 총점 24.9 / 30, 판정 상황에 따라.
참고: t1 과제에는 보안 문제가 아닌 항목이 3개 심어져 있어, 달성 가능한 최고 재현율이 약 3.1로 제한됩니다.
판정: 상황에 따라 다름 (24.9 / 30). 출처: affaan-m/everything-claude-code, skills/security-review, 커밋 b38be6a에 고정. 설치: npx skills@latest add affaan-m/everything-claude-code --skill security-review. 라이선스: MIT (저장소 LICENSE).
어떤 스킬인가
affaan-m/everything-claude-code(ECC)의 security-review 스킬은 인증 추가, 사용자 입력 처리, 시크릿 작업, API 엔드포인트 생성, 결제 구현 시 사용하는 보안 체크리스트입니다. SKILL.md에 약 1,800단어의 Markdown(시크릿 관리, 입력 검증, SQL 인젝션, 인증과 권한 부여, XSS, CSRF, 레이트 리미팅, 민감 데이터 노출, 의존성 보안, 짧은 좋은/나쁜 코드 예시와 배포 전 체크리스트)이 있고, 클라우드 인프라 보안에 관한 Markdown 파일이 하나 더 있습니다. 스크립트는 없습니다.
테스트 방법
Codex CLI 0.166(gpt-6-astra, 낮은 추론)을 Mac 테스트 머신에서 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬을 설치한 경우(스킬 사용군), 설치하지 않은 경우(대조군), 스킬의 핵심 요구사항을 한 문장으로 압축해 프롬프트 끝에 붙인 경우(한 문장 프롬프트군)로 나눴고, 작업마다 각 군 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 전혀 언급하지 않았습니다(아래에 적은 표현은 예외).
심어 둔 문제 8개가 있는 작은 파일 세 개(서비스 모듈, 인증 헬퍼, 업로드 엔드포인트)와 '문제를 나열하고 가장 심각한 것부터'라는 읽기 전용 요청입니다. 주문 서비스에는 보안 결함이 아닌 문제 세 개(경계 off-by-one, 리소스 누수, 부동소수점 금액)가 포함되어 있어 보안 리뷰에서는 건너뛰어야 합니다. 따라서 그 작업에서 보안 리뷰어는 8개 중 최대 5개만 찾을 수 있고 점수는 약 3.1에서 상한이 됩니다.
- 작은 서비스 모듈 리뷰 — 병합하기 전에 orders_service.py를 보안 리뷰하세요. 발견한 문제를 가장 심각한 것부터 나열하세요. 파일은 변경하지 마세요.
- 인증 헬퍼 리뷰 — auth_handlers.py를 보안 리뷰하세요. 로그인 흐름을 위해 방금 작성했습니다. 문제를 가장 심각한 것부터 나열하세요. 파일은 변경하지 마세요.
- 업로드 엔드포인트 리뷰 — upload_api.py를 보안 리뷰하세요. 취약점을 가장 심각한 것부터 나열하세요. 파일은 변경하지 마세요.
채점은 프로그램 방식(숨은 테스트, 심어 둔 문제 탐지, 제약 조건 검사, 해당되는 경우 렌더링+OCR)으로 실행당 0~5점입니다. 점수를 결정한 LLM 심사자는 없습니다.
결과
세 번째 군에 전달한 한 문장 프롬프트: "코드를 보안 체크리스트와 대조하세요. 하드코딩된 시크릿, 검증되지 않은 입력, SQL/명령 인젝션, 깨진 인증과 권한 부여, 안전하지 않은 파일 업로드, 오류나 로그의 민감 데이터, 누락된 레이트 리미팅을 확인하고 각 발견 사항의 정확한 줄을 인용하세요."
| 작업 | 대조군 점수 | 한 문장 프롬프트 | 스킬 사용 | 대조군 토큰 | 한 문장 프롬프트 토큰 | 스킬 사용 토큰 | 스킬 읽음 |
|---|---|---|---|---|---|---|---|
| t1-orders | 2.89 | 3.12 | 2.42 | 60k | 44k | 72k | 2/2 |
| t2-auth | 4.77 | 5.0 | 4.77 | 59k | 44k | 61k | 2/2 |
| t3-upload | 5.0 | 4.77 | 5.0 | 59k | 44k | 51k | 2/2 |
평균 점수: 스킬 없이 4.22, 스킬 사용 시 4.06(델타 -0.16). 실행당 토큰: 60k 대 62k(1.03배), 시간 38초 대 44초. 한 문장 프롬프트군: 4.29(한 문장 프롬프트 대비 스킬의 이득: -0.23, 스킬 없는 경우 대비 한 문장 프롬프트의 이득: +0.08). 한 문장 프롬프트는 실행당 44k 토큰을 쓰므로, 스킬은 한 문장 프롬프트의 1.40배 비용입니다.
실제로 있었던 일
- 이득 없음. 평균 점수는 스킬 없이 4.22, 한 문장 보안 체크리스트로 4.29, 스킬로 4.06입니다. 심어 둔 문제 회수: 스킬 없이 실행당 8개 중 4.8개, 한 문장 4.9개, 스킬 4.5개.
- 주문 서비스 작업에서 스킬이 조금 더 나빴습니다. 평균 2.4로 대조군 2.9, 한 문장 3.1이었습니다(실행당 심어 둔 항목 2~3개 발견, 다른 군은 3~4개). n=2에서 노이즈 범위입니다.
- 인증 헬퍼와 업로드 엔드포인트에서는 모든 군이 심어 둔 문제 8개 중 7~8개를 찾았습니다. 둘 다 일반 Codex가 이미 아는 교과서적 결함(md5, 경로 순회, pickle, 명령 인젝션)입니다.
- 스킬은 6/6 실행에서 읽혔습니다. 실행당 62k 토큰으로 60k(1.03배), 한 문장 44k(1.41배)를 썼습니다. 한 문장 실행이 가장 저렴했는데, 답하기 전에 읽는 양이 적었기 때문입니다.
- 채점 주의: 항목을 정규식으로 매칭하므로 표현이 다르면 놓친 것으로 계산될 수 있습니다.
항목별 점수
| 항목 | 점수 | 이유 |
|---|---|---|
| 1_output_quality | 4.06 | 스킬 사용 시 평균 4.06/5점(프로그램 검사, 작업별 표 참조). |
| 2_lift_vs_no_skill | 1.84 | 스킬 없이 4.22점 대비 -0.16점(작업당 n=2, 약 1점 미만의 차이는 노이즈). |
| 3_trigger | 5.0 | 스킬 사용군 6/6 실행에서 스킬 파일이 읽힘. |
| 4_instructions_portability | 4 | 일반 Markdown 체크리스트로, 대부분 JS/TS와 Supabase 색채의 예시입니다. 다른 스택에는 유추로만 적용됩니다. |
| 5_efficiency | 5 | 토큰 1.03배(실행당 62k 대 60k), 시간 1.17배(44초 대 38초). |
| 6_safety_hygiene | 5 | Markdown만 사용. 스캐너 히트는 체크리스트 안의 코드 예시(process.env, fetch, 템플릿 문자열)입니다. |
이 테스트의 한계
- 교과서적 결함이 있는 작은 단일 파일 리뷰 세 개. 더 미묘한 문제(비즈니스 로직 권한 부여, 경쟁 조건, 공급망)는 심지 않았습니다.
- 스킬의 클라우드/인프라 체크리스트와 배포 전 목록은 실행하지 않았습니다. 테스트에 인프라 파일이 없었습니다.
- 회수만 측정했습니다. 오탐과 수정 조언의 품질은 채점하지 않았습니다.
- 작업·군당 n = 2: 약 1점 미만의 차이는 노이즈입니다.
- 규칙 기반 채점은 검사가 볼 수 있는 것만 측정합니다. 취향이나 결과가 최선인지는 판단할 수 없습니다.
보안
security.md를 참조하세요. 스캔: 5 CRITICAL / 6 HIGH / 4 MEDIUM. 판정: 실행해도 안전(네트워크 비활성 샌드박스). 깨끗한 스캔 결과가 스킬의 안전성을 증명하지는 않습니다.
결론
합리적인 체크리스트이지만 일반 Codex도 같은 교과서적 취약점을 이미 찾아내며, 같은 범주를 나열한 한 문장이 약 70%의 토큰으로 동등한 성과를 냈습니다. 이런 종류의 코드 리뷰에서 스킬은 측정 가능한 것을 더하지 않습니다. 일관된 체크리스트를 원하는 팀을 위한 프롬프트로는 쓸 수 있습니다.
트랜스크립트
실행 로그: security-review (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.) 열: 작업, 그룹-회차, 점수(0-5), 토큰, 초, 통과한 검사, 에이전트가 연 스킬 파일. t1-orders control-1: 점수 3.12, 토큰 60493, 초 36.1, 검사 1/2, 연 파일 없음 t1-orders control-2: 점수 2.66, 토큰 60831, 초 41.9, 검사 1/2, 연 파일 없음 t1-orders oneliner-1: 점수 3.12, 토큰 44382, 초 32.3, 검사 1/2, 연 파일 없음 t1-orders oneliner-2: 점수 3.12, 토큰 44393, 초 35.0, 검사 1/2, 연 파일 없음 t1-orders treatment-1: 점수 2.19, 토큰 73335, 초 69.3, 검사 1/2, 연 파일 security-review t1-orders treatment-2: 점수 2.66, 토큰 72383, 초 54.7, 검사 1/2, 연 파일 security-review t2-auth control-1: 점수 4.53, 토큰 59839, 초 37.6, 검사 2/2, 연 파일 없음 t2-auth control-2: 점수 5.0, 토큰 59894, 초 37.4, 검사 2/2, 연 파일 없음 t2-auth oneliner-1: 점수 5.0, 토큰 44259, 초 36.9, 검사 2/2, 연 파일 없음
18회 실행, 아티팩트 3개
샘플 출력
SOTA · With the skill: final message (t1-orders, run 1, Codex)
Found six security issues, ordered by severity. Exposure depends on how callers expose these functions; no caller code was provided. 1. **High — SQL injection** — [orders_service.py:9](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:9) `order_id` is interpolated directly into SQL. An input such as `0 OR 1=1` bypasses the intended lookup condition; crafted `UNION` queries could extract other database data. Bind `order_id` as a parameter. 2. **High — Missing cancellation authorization** — [orders_service.py:13](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:13) `current_user` is never used. Anyone able to invoke this function can cancel another user’s order by supplying its ID. Enforce ownership or an authorized administrative role before updating it. 3. **High — Arbitrary file overwrite through exports** — [orders_service.py:39](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:39) `open(path, "w")` immediately truncates any accessible target and follows symlinks. If callers control `path`, they can overwrite files with the service’s permissions—even before the query succeeds. Use server-generated filenames within a controlled export directory and prevent traversal and symlink escapes. 4. **High — Cross-user order export** — [orders_service.py:40](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:40) The export accepts any `user_id` without checking the requester’s identity or permissions. A caller can export another customer’s records. Derive the user ID from authenticated context and explicitly authorize administrative exports. 5. **High if valid — Embedded payment credential and credential logging** — [orders_service.py:4](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:4), [orders_service.py:48](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:48) A live-looking API key is embedded in source and would be printed after successful gateway calls. Its validity is unverified; the current gateway stub always raises. If real, rotate it, load its replacement from secret storage, and remove credential logging. 6. **Medium — Untrusted payment values lack validation** — [orders_service.py:31](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:31), [orders_service.py:45](/var/folders/ln/t0z8fmzd0kz08d3fkz6tskn40000gn/T/asv-security-r-cagonwka/work/orders_service.py:45) Totals trust supplied prices and quantities, while `charge` accepts an amount without matching it to the stored order. If client-controlled, these permit manipulated totals or underpayment. Retrieve authoritative prices, validate quantities and amounts, and compute the charge server-side. No files were changed. This was a static review; the sandbox blocked the attempted in-memory verification.