모든 스킬

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.2260k
한 문장 프롬프트4.2944k
스킬 사용4.0662k

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에서 상한이 됩니다.

  1. 작은 서비스 모듈 리뷰 — 병합하기 전에 orders_service.py를 보안 리뷰하세요. 발견한 문제를 가장 심각한 것부터 나열하세요. 파일은 변경하지 마세요.
  2. 인증 헬퍼 리뷰 — auth_handlers.py를 보안 리뷰하세요. 로그인 흐름을 위해 방금 작성했습니다. 문제를 가장 심각한 것부터 나열하세요. 파일은 변경하지 마세요.
  3. 업로드 엔드포인트 리뷰 — upload_api.py를 보안 리뷰하세요. 취약점을 가장 심각한 것부터 나열하세요. 파일은 변경하지 마세요.

채점은 프로그램 방식(숨은 테스트, 심어 둔 문제 탐지, 제약 조건 검사, 해당되는 경우 렌더링+OCR)으로 실행당 0~5점입니다. 점수를 결정한 LLM 심사자는 없습니다.

결과

세 번째 군에 전달한 한 문장 프롬프트: "코드를 보안 체크리스트와 대조하세요. 하드코딩된 시크릿, 검증되지 않은 입력, SQL/명령 인젝션, 깨진 인증과 권한 부여, 안전하지 않은 파일 업로드, 오류나 로그의 민감 데이터, 누락된 레이트 리미팅을 확인하고 각 발견 사항의 정확한 줄을 인용하세요."

작업대조군 점수한 문장 프롬프트스킬 사용대조군 토큰한 문장 프롬프트 토큰스킬 사용 토큰스킬 읽음
t1-orders2.893.122.4260k44k72k2/2
t2-auth4.775.04.7759k44k61k2/2
t3-upload5.04.775.059k44k51k2/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_quality4.06

스킬 사용 시 평균 4.06/5점(프로그램 검사, 작업별 표 참조).

2_lift_vs_no_skill1.84

스킬 없이 4.22점 대비 -0.16점(작업당 n=2, 약 1점 미만의 차이는 노이즈).

3_trigger5.0스킬 사용군 6/6 실행에서 스킬 파일이 읽힘.
4_instructions_portability4

일반 Markdown 체크리스트로, 대부분 JS/TS와 Supabase 색채의 예시입니다. 다른 스택에는 유추로만 적용됩니다.

5_efficiency5토큰 1.03배(실행당 62k 대 60k), 시간 1.17배(44초 대 38초).
6_safety_hygiene5

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.

Pro 보기