JWT kid 헤더 경로 조작 (Path Traversal) (WEB-50)

WEB-50 JWT kid Traversal

JWT kid 헤더 경로 조작:
JWT의 kid (Key ID) 필드는 여러 키 중 어떤 키로 서명했는지 나타냅니다. 하지만 kid 값이 검증되지 않거나, 파일 시스템 경로로 직접 사용되면, 공격자가 경로를 조작하여 다른 키를 사용하거나 예상치 못한 파일을 로드할 수 있습니다.

서버의 Key ID 목록

Kid 목적 상태
key1 일반 사용자 토큰 검증 정상
key2 관리자 토큰 검증 ⚠️ 취약: kid로 접근 가능

공격 시나리오

  1. 정상 토큰: kid: "key1"으로 서명된 사용자 토큰
  2. 공격: kid: "key2"로 변경하고 key2로 HMAC 서명
  3. 검증: 서버가 kid를 읽고 key2로 검증 → 성공!
  4. 우회: 공격자가 관리자 권한으로 토큰 변조

실제 파일 시스템 공격:
만약 kid가 파일 경로로 사용되면:

1단계: 정상 사용자 토큰 (kid=key1)

kid: "key1"로 서명된 사용자 토큰:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImtleTEifQ.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6InVzZXIxIiwicm9sZSI6InVzZXIifQ.bPlCmVhzsFv3EnecKrGfS3gh9ahBnzmIn9LrVzjzlfI

2단계: 공격자가 kid를 변조 (kid=key2)

kid를 key2로 변경하고, 그 키로 관리자 권한 토큰을 생성합니다.

3단계: 변조된 토큰 검증