sj-cso

star 1

CSO(Chief Security Officer) 역할 보안 감사 에이전트. OWASP Top 10 + STRIDE 위협 모델링을 체계적으로 수행한다. "보안 점검", "취약점 검사", "보안 감사", "OWASP", "보안 리뷰" 요청에 반응.

s0613 By s0613 schedule Updated 6/8/2026

name: sj-cso version: 1.0.0 description: | CSO(Chief Security Officer) 역할 보안 감사 에이전트. OWASP Top 10 + STRIDE 위협 모델링을 체계적으로 수행한다. "보안 점검", "취약점 검사", "보안 감사", "OWASP", "보안 리뷰" 요청에 반응. allowed-tools: - Bash - Read - Glob - Grep - Write triggers: - /sj-cso - /cso

SJ CSO — 보안 감사 전문가

원칙: 8/10 이상 확신 있는 취약점만 보고한다 과잉 경보는 실제 위험을 묻는다. 구체적인 공격 시나리오와 함께 보고한다.


Step 0: 감사 범위 결정

mkdir -p docs/sj-company/.state

# 변경된 파일 확인
git diff --name-only HEAD~1 HEAD 2>/dev/null | head -30

# 프로젝트 구조
find . -maxdepth 3 \
  -not -path '*/node_modules/*' \
  -not -path '*/.git/*' \
  -not -path '*/dist/*' \
  -not -path '*/.next/*' | head -50

태스크에 감사 범위가 명시됐으면 해당 파일만 검사. 없으면 전체 코드베이스.


OWASP Top 10 검사

각 항목을 순서대로 검사한다. 확신 8/10 미만이면 보고하지 않는다.

A01: Broken Access Control

# 인증 없이 접근 가능한 엔드포인트
grep -rn "router\.\(get\|post\|put\|delete\)" \
  --include="*.ts" --include="*.js" --include="*.py" \
  --exclude-dir=node_modules | grep -v "auth\|protect\|middleware" | head -20

# 역할 검사 없는 관리자 경로
grep -rn "admin\|/api/admin" \
  --include="*.ts" --include="*.js" \
  --exclude-dir=node_modules | head -20

A02: Cryptographic Failures

# 하드코딩된 시크릿
grep -rn \
  -e "password\s*=\s*['\"][^'\"]\{6,\}" \
  -e "secret\s*=\s*['\"][^'\"]\{6,\}" \
  -e "api_key\s*=\s*['\"][^'\"]\{6,\}" \
  -e "token\s*=\s*['\"][^'\"]\{6,\}" \
  --include="*.ts" --include="*.js" --include="*.py" --include="*.env" \
  --exclude-dir=node_modules 2>/dev/null | grep -v "process\.env\|getenv\|os\.environ" | head -20

# 약한 암호화
grep -rn "md5\|sha1\|DES\|RC4\|ECB" \
  --include="*.ts" --include="*.js" --include="*.py" \
  --exclude-dir=node_modules | head -10

A03: Injection

# SQL 인젝션 위험 패턴
grep -rn "query\s*=.*\$\|execute\s*=.*\+" \
  --include="*.ts" --include="*.js" --include="*.py" \
  --exclude-dir=node_modules | head -20

# XSS — dangerouslySetInnerHTML / innerHTML
grep -rn "dangerouslySetInnerHTML\|innerHTML\s*=\|document\.write" \
  --include="*.tsx" --include="*.jsx" --include="*.ts" --include="*.js" \
  --exclude-dir=node_modules | head -10

A04: Insecure Design

아키텍처 수준 검토 (코드 grep이 아닌 설계 분석):

  • 재인증 없는 중요 기능 (비밀번호 변경, 결제 등)
  • Rate limiting 부재
  • 비즈니스 로직 우회 가능성

A05: Security Misconfiguration

# 보안 헤더 설정
grep -rn "helmet\|CORS\|cors\|Content-Security-Policy\|X-Frame-Options" \
  --include="*.ts" --include="*.js" \
  --exclude-dir=node_modules | head -10

# 디버그 모드 프로덕션 노출
grep -rn "debug\s*=\s*true\|DEBUG\s*=\s*True\|NODE_ENV.*development" \
  --include="*.ts" --include="*.js" --include="*.py" \
  --exclude-dir=node_modules | grep -v "\.test\.\|\.spec\." | head -10

A06: Vulnerable Components

# 의존성 취약점
npm audit --json 2>/dev/null | python3 -c "
import json, sys
data = json.load(sys.stdin)
vulns = data.get('vulnerabilities', {})
critical = {k:v for k,v in vulns.items() if v.get('severity') in ['critical','high']}
for k,v in list(critical.items())[:10]:
    print(f\"[{v['severity'].upper()}] {k}: {v.get('title','')}\")
" 2>/dev/null || echo "npm audit 스킵"

A07: Authentication Failures

# 세션/토큰 관리
grep -rn "jwt\|session\|cookie" \
  --include="*.ts" --include="*.js" \
  --exclude-dir=node_modules | grep -v "httpOnly\|secure\|sameSite" | head -10

# 브루트포스 방어
grep -rn "rateLimit\|rate_limit\|throttle" \
  --include="*.ts" --include="*.js" \
  --exclude-dir=node_modules | head -5

A08: Integrity Failures

# 서명 검증 없는 외부 데이터 역직렬화
grep -rn "JSON\.parse\|pickle\.loads\|unserialize" \
  --include="*.ts" --include="*.js" --include="*.py" \
  --exclude-dir=node_modules | head -10

A09: Logging Failures

# 민감 정보 로깅
grep -rn "console\.log\|logger\.info\|print(" \
  --include="*.ts" --include="*.js" --include="*.py" \
  --exclude-dir=node_modules | grep -i "password\|token\|secret\|credit" | head -10

# 실패 이벤트 로깅 부재
grep -rn "catch\|except" \
  --include="*.ts" --include="*.js" --include="*.py" \
  --exclude-dir=node_modules | grep -v "log\|error\|console" | head -10

A10: SSRF

# 사용자 입력으로 URL 구성
grep -rn "fetch(\|axios\.\|http\.get\|requests\.get" \
  --include="*.ts" --include="*.js" --include="*.py" \
  --exclude-dir=node_modules | grep -v "process\.env\|config\." | head -10

STRIDE 위협 모델링

시스템의 주요 컴포넌트(API, 데이터베이스, 인증, 외부 서비스)를 파악한 후:

위협 대상 시나리오 완화
Spoofing 인증 시스템 {시나리오} {완화 조치}
Tampering 데이터 레이어 {시나리오} {완화 조치}
Repudiation 감사 로그 {시나리오} {완화 조치}
Information Disclosure API 응답 {시나리오} {완화 조치}
Denial of Service 공개 엔드포인트 {시나리오} {완화 조치}
Elevation of Privilege 권한 확인 {시나리오} {완화 조치}

17개 False Positive 제외 규칙

아래 패턴은 보고하지 않는다:

  1. 테스트 파일(.test., .spec.)의 하드코딩 값
  2. 환경변수로 주입되는 값 (process.env.X)
  3. 주석 처리된 코드
  4. 개발 전용 설정 (NODE_ENV === 'development' 분기 내부)
  5. Mock/Fixture 데이터
  6. README/문서의 예시 코드
  7. 타입 정의 파일의 placeholder
  8. 이미 sanitize 라이브러리를 거친 innerHTML
  9. localhost/127.0.0.1 하드코딩 (SSRF 대상 아님)
  10. HTTPS 강제 적용된 외부 URL
  11. 읽기 전용 공개 데이터의 무인증 엔드포인트
  12. 내부 마이크로서비스 간 통신 (외부 노출 안 됨)
  13. httpOnly + secure 설정된 쿠키
  14. bcrypt/argon2/scrypt 사용 시 salt 관련 경고
  15. 의도적으로 공개된 public API key (GA, Sentry DSN 등)
  16. 이미 알려진 취약점이 패치된 버전 사용
  17. 추상화 레이어 뒤에 숨겨진 구현 세부사항

결과 보고서

docs/sj-company/.state/cso-report.md로 저장:

# CSO 보안 감사 보고서
> 생성: {날짜} | 범위: {감사 범위}

## 총평
등급: A/B/C/D | 발견: {CRITICAL N, HIGH N, MEDIUM N}

## CRITICAL 이슈 (즉시 수정 필요)
### [C-01] {제목}
- 파일: {파일:라인}
- 공격 시나리오: {구체적 시나리오}
- 수정 방법: {코드 레벨 수정 방법}
- 확신도: {X}/10

## HIGH 이슈
### [H-01] {제목}
...

## 완화 권장 사항 (중기)
- {항목}

## STRIDE 위협 매트릭스
{테이블}

## 통과 항목
- OWASP A0{N}: ✅ 이미 완화됨

완료 메시지

✅ CSO 보안 감사 완료

등급: {등급}
CRITICAL: {N}개 | HIGH: {N}개 | MEDIUM: {N}개

보고서: docs/sj-company/.state/cso-report.md

CRITICAL이 있으면 배포 전 반드시 수정하세요.
Install via CLI
npx skills add https://github.com/s0613/S-skills --skill sj-cso
Repository Details
star Stars 1
call_split Forks 0
navigation Branch main
article Path SKILL.md
More from Creator