Skip to content

test: CSRF 공격 매트릭스 검증 자동화#146

Open
seonghooncho wants to merge 1 commit intodevelopfrom
feature/csrf-attack-matrix-validation-145
Open

test: CSRF 공격 매트릭스 검증 자동화#146
seonghooncho wants to merge 1 commit intodevelopfrom
feature/csrf-attack-matrix-validation-145

Conversation

@seonghooncho
Copy link
Contributor

근본 목적

Cross-site 도메인 구조에서 SameSite 쿠키 단독 방어가 불충분한 조건을 기준으로, 현재 Origin/Referer 기반 CSRF 방어가 실제 공격 요청을 차단하고 정상 요청을 통과시키는지 자동화 실험으로 계량 검증한다.

비목적

JWT/Redis JTI 구조 변경, 인증 정책 변경, CSRF 필터 로직 리팩터링은 본 PR 범위에서 제외한다.

변경 요약

  • Docker 기반 CSRF 검증 스택 추가
    • docker/security/docker-compose.csrf-matrix.yml
    • docker/security/env.csrf-matrix.example
  • CSRF 공격 매트릭스 정의 추가
    • scripts/security/csrf-attack-matrix.json
  • 자동 실행/집계 스크립트 추가
    • scripts/security/run-csrf-attack-matrix.sh
    • scripts/security/score-csrf-attack-matrix.sh
  • 실험 수행/해석 문서 추가
    • docs/security/csrf-attack-matrix-validation.md

검증

  • 정적 검증

    • bash -n scripts/security/run-csrf-attack-matrix.sh
    • bash -n scripts/security/score-csrf-attack-matrix.sh
    • jq empty scripts/security/csrf-attack-matrix.json
    • .ai/scripts/verify-purpose-focus.sh docs --staged
    • .ai/scripts/verify-before-commit.sh
  • 실행 검증

    • 단일 드라이런
      • SCENARIOS=C1 ./scripts/security/run-csrf-attack-matrix.sh
    • 전체 매트릭스 1회
      • ./scripts/security/run-csrf-attack-matrix.sh
      • 결과: /tmp/syncly-csrf-matrix/results-20260226T113929Z.ndjson
      • 집계: /tmp/syncly-csrf-matrix/summary-20260226T113929Z.json

실험 수행 및 결과 해석 (서술)

이번 실험은 "공격이 막혔는지"와 "정확히 CSRF 필터가 막았는지"를 분리해서 해석했다. 이유는 현재 체인에서 CORS와 CSRF 필터가 모두 403을 만들 수 있기 때문이다.

  1. 먼저 모든 시나리오를 Origin/Referer/쿠키 조합으로 고정했다.
  2. 각 시나리오를 독립 실행해 상태 코드와 응답 코드(CSRF403 여부)를 기록했다.
  3. 지표는 두 층위로 계산했다.
    • security_block_level: 403 차단 자체를 탐지로 계산
    • csrf_filter_level: CSRF403를 탐지로 계산

실측 결과(request level):

  • security_block_level: TP=6, FN=0, FP=0, TN=3, detection_rate=1.0, false_positive_rate=0.0
  • csrf_filter_level: TP=2, FN=4, FP=0, TN=3, detection_rate=0.3333, false_positive_rate=0.0

이 결과가 의미하는 바:

  • 공격 6건(A1~A6)은 모두 최종적으로 차단됐다(보안 차단 관점에서는 100%).
  • 하지만 CSRF403로 명시 차단된 것은 2건(A3, A4)뿐이다.
  • 나머지 4건(A1, A2, A5, A6)은 403이지만 CSRF403 코드가 없어서, 실행 관찰상 CORS 단계 차단으로 해석된다.
  • 정상 요청(C1, C2, C3)은 모두 통과했고 오차단은 관찰되지 않았다.
  • C4(쿠키 없음)는 필터 적용 경계 검증용 진단 케이스이며 401(JWT401_07)로 확인됐다.

엔지니어링 판정:

  • "공격 요청 차단"이라는 목적은 현재 실험 범위에서 충족됐다.
  • 다만 "CSRF 필터 단독 성능"을 주장하려면 CORS와 분리된 추가 실험이 필요하다.
  • 포트폴리오 문구는 "최종 차단 성능"과 "필터 기여도"를 분리해 기술해야 해석 왜곡을 줄일 수 있다.

관련 이슈

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant