← 목록
기타 2026-07-09 4KB 읽기 3분

보안 레드팀 — JWT/인증/검증 라이브러리 "신뢰 가능" 판정 적대적 공격

개요

인증카드.md(/Users/ef/crowny-rpnkit/라이브러리카드/인증카드.md)가 "JWT.한선 서명검증 자체는 신뢰 가능"이라 내린 판정을 실제 공격 코드로 검증. 검증카드.md의 SQL안전() 등도 재공격. 전부 실제 한선씨 코드로 컴파일+실행해 통과/거부를 실측(무접촉, 라이브 파일 미수정).

무엇을 했는지

  1. JWT.한선 서명 위조 5종 공격(alg:none류/헤더조작/서명절단/키추측/exp) — 서명 위조는
전부 방어 확인(원 판정 유지), exp 미확인은 CRITICAL 재확인(카드와 동일).
  1. ★신규 최상위 CRITICAL 발견: 무작위()srand() 없이 rand()를 그대로 사용 —
전 세계 모든 crownyc 프로세스가 완전히 동일한 난수 시퀀스(16807, 475531, ...)를 낸다. 이는 인증카드가 "float 오해"로 진단한 3개 CRITICAL(TOTP비밀키/솔트/세션ID 관련)의 근본원인을 대체한다 — 카드의 수정안("2인자로 교체")만으로는 예측가능성이 해결되지 않음을 실측으로 증명(세션ID를 공격자가 서버와 완전 독립적으로 사전계산해 100% 일치시킴).
  1. 세션삭제 후 권한상승 실공격 재현: role=admin 저장 → 세션삭제(로그아웃) → 탈취한
세션ID로 관리자 전용 함수를 여전히 호출 가능함을 실증(세션가져오기/세션읽기 삭제반영 비대칭 악용).
  1. SQL안전() 우회 범위 확대: 검증카드는 대소문자 문제만 지적했으나, OR/AND/SELECT/
WHERE/SLEEP/BENCHMARK가 블록리스트에 아예 없어 숫자맥락·블라인드 인젝션이 전부 통과함을 17개 페이로드로 실증.
  1. 솔트 고정값 → 레인보우 공격 재현: 서로 다른 두 계정이 같은 비밀번호를 쓰면 저장값이
완전히 동일함을 직접 증명(공격자 사전계산 해시 하나로 여러 계정 동시 매치).
  1. XSS안전() URI스킴 우회: javascript:/data: 스킴, 속성 breakout 페이로드가 완전 무변형
통과함을 실증 + <script> 본문 텍스트가 태그 제거 후에도 잔존함을 신규 확인.
  1. JWT 서명 비교가 memcmp(비상수시간) 구현임을 코드 레벨로 확인(원격 타이밍 실공격은
미실증, 과장 안 함).

관련 파일

  • 최종 보고서: /Users/ef/crowny-rpnkit/적대검증/레드팀/보안_레드팀.md
  • 공격 예제 6종(전부 컴파일+실행 검증됨): /Users/ef/crowny-rpnkit/적대검증/레드팀/공격예제/
  • 재검증 스크립트: /Users/ef/crowny-rpnkit/적대검증/레드팀/레드팀검증.sh (6/6 PASS)
  • 원본 카드: /Users/ef/crowny-rpnkit/라이브러리카드/인증카드.md, .../검증카드.md
  • 근본원인 소스: /Users/ef/CrownyOS/crownyc/crownyc.c:15000(opcode 613, RANDOM), :6140(opcode 162, EQ/memcmp)

잔여 이슈 (파동② 제안, 보고서 §8)

  • P(-1) 신규 최우선: crownyc.c VM 시작부에 srand() 호출 추가(엔트로피 소스 권장) —
이게 없으면 카드가 제안한 다른 모든 "무작위() 2인자 교체" 수정이 예측가능성 관점에서 무의미.
  • P0(카드 유지): 세션삭제() 복합키 전체삭제, SQL안전() 블록리스트 대규모 보강(또는 파라미터화
강제 전환), 솔트생성() §1 선행수정 후 재검증, JWT검증() exp 강제.
  • P1: XSS안전() URI스킴 차단 헬퍼. P2: JWT 서명 비교 상수시간화.
  • 실제 코드 수정은 이번 레드팀 범위 밖(라이브 무접촉 지시) — 파동② 착수 시 진행.