Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

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

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

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-3456-OAuth2-PKCE-Race-Condition-Account-Takeover- — CVE-2026-3456용 Python PoC로, OAuth2 PKCE 레이스 컨디션 계정 탈취를 시연하며 취약한 인증 서버와 동시성 code-verifier 익스플로잇 스크립트를 포함합니다. | Kitploit
도구/GitHubGitHub/george0papasotiriou/cve-2026-3456-oauth2-pkce-race-condition-account-takeover-
Authentication & AuthorizationVulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityAPI Security
GitHubgeorge0papasotiriou/cve-2026-3456-oauth2-pkce-race-condition-account-takeover-

CVE-2026-3456-OAuth2-PKCE-Race-Condition-Account-Takeover-

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-3456용 Python PoC로, OAuth2 PKCE 레이스 컨디션 계정 탈취를 시연하며 취약한 인증 서버와 동시성 code-verifier 익스플로잇 스크립트를 포함합니다.

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

8. CVE-2026-3456 – OAuth2 PKCE 레이스 조건 (계정 탈취)

개요

OAuth2 권한 부여 서버의 레이스 조건으로 인해, 공격자는 짧은 시간 창 안에서 PKCE code_verifier를 추측하거나 무차별 대입하여 합법적인 클라이언트가 인증 코드를 교환하기 전에 피해자의 인증 코드를 재사용할 수 있습니다.

심각도: 높음 (계정 탈취)

시뮬레이션 (Python HTTP 서버)

root@kitploit:~
#!/usr/bin/env python3
"""
vulnerable_auth_server.py - Authorization server with race condition window.
"""
import time, random, hashlib, base64, secrets
from http.server import HTTPServer, BaseHTTPRequestHandler
import urllib.parse

# Simulated storage
auth_codes = {}  # code -> {client_id, redirect_uri, code_challenge, scope, user}
tokens = {}

def generate_code():
    return secrets.token_urlsafe(16)

class AuthHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        parsed = urllib.parse.urlparse(self.path)
        params = urllib.parse.parse_qs(parsed.query)
        if parsed.path == '/authorize':
            # User approves, redirect with code
            code = generate_code()
            auth_codes[code] = {
                'client_id': params.get('client_id', ['unknown'])[0],
                'redirect_uri': params.get('redirect_uri', [''])[0],
                'code_challenge': params.get('code_challenge', [''])[0],
                'user': '[email protected]'
            }
            redirect = f"{params['redirect_uri'][0]}?code={code}&state={params.get('state',[''])[0]}"
            self.send_response(302)
            self.send_header('Location', redirect)
            self.end_headers()
        elif parsed.path == '/token':
            # Token endpoint (POST) but simplified as GET for demo
            code = params.get('code', [''])[0]
            verifier = params.get('code_verifier', [''])[0]
            if code in auth_codes:
                entry = auth_codes[code]
                # Check PKCE: SHA256(verifier) == challenge?
                challenge = base64.urlsafe_b64encode(hashlib.sha256(verifier.encode()).digest()).decode().rstrip('=')
                if challenge == entry['code_challenge']:
                    # Race condition: we do not invalidate code immediately (small window)
                    # Attacker can try to redeem same code with a different verifier if they win race.
                    access_token = secrets.token_urlsafe(32)
                    tokens[access_token] = entry['user']
                    # Insecure: code still present for a few milliseconds
                    # To simulate, we add a deliberate delay
                    time.sleep(0.1)  # window of opportunity
                    del auth_codes[code]  # remove after use (but after sleep)
                    self.send_response(200)
                    self.end_headers()
                    self.wfile.write(f'access_token={access_token}'.encode())
                else:
                    self.send_response(400)
                    self.end_headers()
                    self.wfile.write(b'invalid code_verifier')
            else:
                self.send_response(400)
                self.end_headers()
                self.wfile.write(b'invalid code')
        else:
            self.send_response(404)
            self.end_headers()

server = HTTPServer(('0.0.0.0', 5000), AuthHandler)
print("Auth server on :5000")
server.serve_forever()

CVE-2026-3456 – OAuth2 PKCE 레이스 조건 (계정 탈취)

Severity: High

📖 개요

OAuth2 권한 부여 서버의 PKCE 흐름에 존재하는 취약점으로 인해, 공격자는 레이스 조건을 통해 PKCE를 우회하여 합법적인 클라이언트보다 먼저 인증 코드를 교환할 수 있습니다. 서버는 코드를 원자적으로 무효화하지 못하므로, 악의적인 검증자(verifier)를 시도할 수 있는 시간 창이 남게 됩니다.

⚙️ 취약점 세부 정보

  • 유형: 레이스 조건 / TOCTOU
  • 영향: 피해자의 액세스 토큰 획득을 통한 계정 탈취.
  • 근본 원인: 토큰 엔드포인트는 PKCE를 확인하고 토큰을 발급한 뒤 코드를 제거하지만, 코드는 잠시 동안 유효한 상태로 남습니다. 캡처된 코드를 가진 공격자(예: 오픈 리다이렉트를 통해)는 여러 검증자(verifier)를 동시에 시도할 수 있습니다.

🧪 익스플로잇 데모

  1. 취약한 인증 서버를 시작합니다:
    root@kitploit:~
    python vulnerable_auth_server.py
    
  2. 레이스 익스플로잇을 실행합니다:
    root@kitploit:~
    python race_condition_exploit.py
    
도구 다운로드