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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
drupal-openai-provider-ssrf-cve-2026-13233 — CVE-2026-13233 (Drupal OpenAI Provider, SA-CONTRIB-2026-053): response-URL SSRF / 로컬 파일 읽기. 신뢰할 수 없는 업스트림, 프롬프트가 아님. 안전한 재현기 + 탐지. 1.1.1/1.2.2에서 수정됨. | Kitploit
도구/GitHubGitHub/kuninogu/drupal-openai-provider-ssrf-cve-2026-13233
Vulnerability AnalysisWeb SecurityLearning & Education
GitHubkuninogu/drupal-openai-provider-ssrf-cve-2026-13233

drupal-openai-provider-ssrf-cve-2026-13233

CVE-2026-13233 (Drupal OpenAI Provider, SA-CONTRIB-2026-053): response-URL SSRF / 로컬 파일 읽기. 신뢰할 수 없는 업스트림, 프롬프트가 아님. 안전한 재현기 + 탐지. 1.1.1/1.2.2에서 수정됨.

저장소 보기

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
1개월 전아직 검토되지 않음

Drupal OpenAI Provider — 응답 URL을 통한 SSRF / 로컬 파일 읽기 (CVE-2026-13233)

신뢰할 수 없는 업스트림: 응답이 지시한 URL을 가져온(fetch) 프로바이더. Drupal OpenAI Provider(ai_provider_openai) · SSRF(CWE-918) · CVE-2026-13233 · SA-CONTRIB-2026-053

상태: 조율된 공개 완료(2026-07-10). Drupal 보안 팀에 비공개로 보고되었고, 수정 후 CVE-2026-13233 / 권고 SA-CONTRIB-2026-053으로 공개되었습니다(Moderately critical 등급). 작성자는 **발견자 겸 수정 개발자(finder & remediation developer)**로 기재되었습니다.

AI '연결 지점(connection point)'에서 발생한 전형적인 권한 부여 / 입력 검증 결함에 대한 연구입니다: AI 이미지 생성 프로바이더가 스킴 허용 목록(scheme allowlist)이 없는 범용 함수를 사용하여 업스트림 API 응답에 포함된 URL을 가져왔습니다. 구성된 업스트림이 신뢰할 수 있는 기본값이 아닌 배포 환경(자체 엔드포인트 사용(bring-your-own-endpoint) / 프록시 / 자체 호스팅 게이트웨이 / 손상된 릴레이)에서는 응답이 서버를 file:// 또는 내부 주소로 향하게 할 수 있었습니다.

싱크(sink)에 도달하는 신뢰할 수 없는 입력은 업스트림 응답 URL이지 사용자의 프롬프트가 아닙니다.

  • 분류(공개 기준): SSRF(CWE-918). 이 SSRF에는 file:// 로컬 파일 읽기가 포함되었으며, 작성자의 내부 분석에서는 CWE-73 / CWE-441에도 매핑되었습니다.
  • 심각도: Drupal Moderately critical(SA-CONTRIB-2026-053) — Drupal 등급 체계의 중간대역 ≈ CVSS Medium; CVSS Critical/High는 아님. 작성자의 공개 전 자체 평가: 최소(floor) 3.1 / 조건부 5.3 (Medium); 이전의 6.5 / 7.4는 철회되었으며, 중간 등급 평가가 이를 뒷받침했습니다.
  • 영향 범위: Drupal 코어 11.2에서 Drupal OpenAI Provider(ai_provider_openai) < 1.1.1 및 1.2.0–1.2.1(1.2.1 감사 완료)
  • 수정 버전: 1.1.1 / 1.2.2 · CVE: CVE-2026-13233 · 권고: https://www.drupal.org/sa-contrib-2026-053

확인된 시연(confirmed) vs. 확인되지 않은 것(unverified)

모든 검증은 직접 소유한 네트워크 격리 샌드박스에서 **모의 업스트림(mock upstream)**을 대상으로 수행되었습니다. 실제 OpenAI API는 호출되지 않았습니다. 누출 오라클(leak oracle)은 합성 데이터뿐입니다.

확인됨(동적으로 시연됨):

  • 비관리자 트리거 → 업스트림이 선택한 로컬 파일의 서버 측 읽기(실행별 고유 마커로 임의 경로 입증; 제공된 본문이 마커와 원시 바이트(raw byte) 단위로 일치; 마커는 앱 컨테이너에만 존재하고 모의 서버에는 없음 — '모의 서버가 자체 파일을 반환했다'는 가능성 배제).
  • settings.php 읽기는 sha256 바이트 일치(35,182B)로 확인 — 콘텐츠는 출력되지 않았으며, 따라서 DB 자격 증명이 범위에 포함됩니다.
  • 공용 포트가 없는 서비스로부터의 내부 HTTP SSRF 응답 획득(내부 토큰 원시 바이트 일치).
  • 권한 부여 경계: 동일한 계정이 관리자 설정 라우트에서 403을 받음(200 대 403 대비).
  • AI 권한이 없는 편집자가 관리자가 구성한 실제적인 필드 위젯 'Generate' 플로우를 통한 정상 HTTP 도달 가능.

미검증(명시적으로 주장하지 않음):

  • 클라우드 메타데이터(IMDS) 자격 증명 탈취 — 동일한 싱크에서 메커니즘상 가능하나 시도하지 않음.
  • 기본 클래스 쌍둥이의 동적 도달 가능성 — 이 프로바이더에서는 재정의됨(이 대상에 대해서는 죽은 코드); 별도의 주장이 아닌, 수정 이식을 위한 동일 근본 원인의 변형으로 기록.
  • 수동적인 '저장 전용(save-only)' 자동화(automator) 트리거 — 테스트 결과 음성(negative). '단순 저장'만으로는 트리거되지 않습니다.
  • 저장형 XSS(콘텐츠 유형 혼동) 및 음성-텍스트 동시성 경합 — 별개의 단서이며 입증되지 않음.

영향 받지 않음: TLS를 통한 기본 api.openai.com. host 설정은 관리자 / 설정 동기화(config-sync) / 배포가 제어하므로 — 런타임의 비관리자 공격자는 이를 변경할 수 없습니다.


근본 원인 및 수정 방향 (요약)

응답 URL이 모든 등록된 PHP 스트림 래퍼(file, php, http, data, phar, …)를 허용하는 범용 fetch에 전달되었습니다. response_format은 기본값이 url이므로 취약한 분기가 기본 경로입니다. file://는 PHP의 기본 파일시스템 래퍼이며 allow_url_fopen의 적용을 받지 않습니다 (이전의 'allow_url_fopen 필요' 주장은 틀렸으며 철회되었습니다).

호출 지점뿐만 아니라 프리미티브(primitive) 자체를 수정하십시오:

  1. 원격 가져오기에 범용 fetch를 사용하지 말고, 주입된 HTTP 전용 클라이언트를 사용하십시오.
  2. 요청 전에 스킴이 http/https인지 검증하고, 리디렉션을 비활성화하십시오(30x 응답이 file://로 튈 수 있음).
  3. 심층 방어: 확인된 사설/link-local/루프백 호스트를 거부하거나 구성된 이미지 CDN 호스트(들)로 제한하고, 크기 / 콘텐츠 유형 / 이미지 디코드를 검증하십시오.
  4. 동일한 수정을 기본 클래스에 이식하여 형제 프로바이더들이 이를 상속받게 하십시오(그렇지 않으면 불완전한 수정이 됩니다).
  5. 회귀 테스트는 거부 케이스 우선: file://…, http://169.254.169.254/…, 302→file:// 리디렉션이 모두 거부되어야 합니다.

전체 방향: docs/fix-direction.md.


디렉터리 구조

root@kitploit:~
.
├── README.md                          # this file (English, canonical)
├── README_ja.md                       # Japanese mirror
├── SECURITY.md                        # reporting policy + responsible-disclosure disclaimer
├── .gitignore                         # blocks secrets / primary evidence from being committed
├── docs/
│   └── fix-direction.md               # root-cause fix + variant hunt + minimal-diff sketch (EN)
├── reproducer/                        # SAFE reproducer only (sandbox, mock upstream, benign oracle)
│   ├── README.md                      # how to stand up the network-isolated sandbox
│   ├── verdict.md                     # what "success" means: raw-byte match + 200-vs-403 + exit codes
│   ├── mock-openai-server.py          # benign mock; default happy-path PNG, ssrf_demo → file:///etc/hostname only
│   └── docker-compose.yml             # TEMPLATE: isolated Drupal sandbox + mock (you add the vulnerable target)
├── detections/
│   ├── README.md
│   ├── sigma/web-egress-to-internal-after-imagegen.yml
│   ├── sigma/php-sensitive-file-open.yml
│   ├── sentinel/imagegen-egress-correlation.kql
│   └── splunk/imagegen-content-type-mismatch.spl
└── timeline.md                        # disclosure timeline (single source of truth)

문서는 현재 일본어(.ja.md)이며, 영어 정식 번역은 TODO입니다. 이 저장소에서 제외된 것: 무장(arming) 페이로드 및 즉시 사용 가능한 파일 읽기 PoC. 공개된 reproducer/는 단일 무해 오라클(/etc/hostname)을 사용해 모의 서버를 대상으로 결함 메커니즘을 시연합니다 — 임의 경로 읽기, settings.php 탈취, IMDS는 없습니다. 실사용 사이트를 공격하는 도구가 아닙니다. 1.1.1 / 1.2.2로 업데이트하십시오.


안전한 재현기(Safe Reproducer)

목표: 실사용 대상 익스플로잇이나 비밀 노출 없이 연구자가 결함 *유형(class)*을 확인할 수 있게 합니다. 모든 과정이 오프라인으로 실행됩니다.

  • 격리: 앱과 모의 업스트림을 격리된 네트워크에 두는 docker compose(언어 프리미티브 검사는 --network none). 자격 증명은 마운트되지 않습니다. 모의 서버는 실제 API와 통신하지 않습니다.
  • 신뢰할 수 없는 업스트림 모델의 충실한 재현: 모의 서버는 '신뢰할 수 없는 프록시/자체 호스팅 게이트웨이를 가리키는 host' 역할을 합니다. 합성 대상 URL을 반환하도록 **대역 외(out-of-band)**로 무장합니다(프롬프트 경유가 아님) — 이는 수정된 공격자 모델(업스트림이 URL을 선택하고 사용자는 트리거만 함)을 반영합니다.
  • 무해한 오라클만 사용:
    • file:///etc/hostname 및 앱 컨테이너 내부에만 기록된 실행별 고유 마커 → 앱이 업스트림이 선택한 경로를 읽었음을 입증(마커는 모의 서버에 없음).
    • settings.php는 sha256 바이트 일치로 검증되며 콘텐츠는 출력되지 않음 → 노출 없이 'DB 자격 증명이 범위 내'임을 입증.
    • 공용 포트가 없는 내부 HTTP 서비스 → 합성 토큰으로 내부 SSRF 응답 획득을 입증.
  • 판정 기준은 HTTP 200이 아닌 원시 바이트: 성공 = 제공된 본문이 예상 합성 값과 바이트 단위로 일치하고, 200 대 403 권한 부여 대비가 있어야 합니다. 종료 코드는 엄격합니다(0 악용 가능 / 1 사전 조건 불충족 / 2 재현 안 됨 / 3 정리 실패 / 99 오류). 를 참조하십시오.

reproducer/README.md를 참조하십시오.


공개 타임라인

timeline.md를 참조하십시오. 요약:


탐지 가이드

실무자용 탐지는 detections/에 있으며, 근거는 docs/detection-engineering.md에 있습니다. 간단히 요약하면:

  • API 호출 후 짧은 시간 창 안에 169.254.169.254 / 루프백 / RFC1918로의 비정상 이그레스(egress)(프록시 / EDR)와 이미지 생성을 트리거한 주체(앱 감사)를 상호 연관시키십시오. 이그레스만으로 알림을 발생시키지 마십시오.
  • file:// 읽기는 네트워크에 닿지 않으므로 — 호스트 감사(auditd/EDR)를 통해 웹 프로세스의 민감 파일 열기를 탐지하되, 베이스라인을 설정하여 이미지 생성 요청 내에서 패턴을 벗어난 읽기만 발화(fire)하도록 하십시오.
  • 매직 바이트가 이미지가 아닌 image/*로 선언된 바이트를 소급하여 탐지하십시오.
  • 대부분의 AI 통합은 어떤 사용자가 어떤 URL을 가져왔는지 기록하지 않습니다 — {request_id, actor, target_url, scheme, resolved_ip, content_type} 형식의 fetch 감사 레코드를 추가하십시오. 표준 로그만으로는 이를 포착할 수 없습니다.

참고 자료

  • OWASP Top 10 A10:2021 — 서버 측 요청 위조(Server-Side Request Forgery)
  • CWE-918 SSRF · CWE-73 파일 이름/경로의 외부 제어 · CWE-441 의도하지 않은 프록시/릴레이 · CWE-610 외부에서 제어되는 참조
  • PHP 스트림 래퍼(file://는 기본 파일시스템 래퍼이며 allow_url_fopen의 적용을 받지 않음)
  • Drupal 보안 팀 — 프로젝트의 'Report a security vulnerability'(보안 취약점 신고)를 통한 조율된 공개
  • 권고: Drupal SA-CONTRIB-2026-053 — https://www.drupal.org/sa-contrib-2026-053
  • CVE: CVE-2026-13233 (CNA: Drupal.org)

보안 공지

  • 공개가 완료되었으므로(CVE-2026-13233 / SA-CONTRIB-2026-053) 제품/버전/코드 세부 정보는 공개된 상태입니다. 먼저 1.1.1 / 1.2.2로 업데이트하십시오 — 패치되지 않은 사이트가 여전히 존재합니다.
  • reproducer/는 샌드박스 전용이며 합성 오라클을 사용합니다. 실사용 대상 익스플로잇이 아니며 비밀 정보를 포함하지 않습니다. 소유하지 않았거나 테스트 권한이 없는 시스템에 대해 실행하지 마십시오.
  • 실제 동작하는 파일 읽기 PoC와 비밀 정보가 포함된 1차 증거는 여기에 포함되지 않습니다 — 패치되지 않은 배포가 존재하는 한, 수정 이후에도 의도적으로 그렇습니다.

책임 있는 공개 고지(Responsible Disclosure Disclaimer)

모든 연구는 작성자가 직접 소유한 네트워크 격리 샌드박스에서 모의 업스트림을 대상으로 수행되었으며 — 실제 벤더 API에 접촉한 적이 없고, 제3자 시스템을 테스트한 적도 없습니다. 이 발견은 먼저 Drupal 보안 팀에 비공개로 보고되었으며, 수정 및 권고(SA-CONTRIB-2026-053, CVE-2026-13233)와 함께 공개되었습니다. 벤더의 등급은 Moderately critical입니다. 작성자의 CVSS 수치는 잠정적인 자체 평가일 뿐 공식 점수가 아니며, 의도적으로 보수적으로 유지되었습니다(CVSS Critical/High 없음) — 이는 벤더의 중간대역 등급과 일치합니다. 이 자료는 방어 및 교육 목적으로 제공됩니다. SECURITY.md를 참조하십시오.

도구 다운로드
reproducer/verdict.md
  • 투명성 고지: 환경 정규화(예: 이전 root 실행으로 쓰기 불가능해진 샌드박스 파일 디렉터리 소유자 교정)는 문서화되며 저장/제공(save/serve) 경로에만 영향을 미치고, 파일 읽기 싱크 자체에는 영향을 미치지 않습니다. 이는 검토자가 이를 조작된 사전 조건으로 오해하지 않도록 공개하는 것입니다.
  • 날짜사건
    2026-06-10정적 검토로 싱크 위치 확인; 고정 경로 file:// 읽기 동적으로 확인
    2026-06-11임의 경로 읽기 + settings.php sha256 일치 + 내부 HTTP SSRF 확인
    2026-06-11프로덕션 소비자 도달 가능성(자동화 도구 내부 경로; FWA 정상-HTTP 유출)
    2026-06-11독립적인 동료 검토가 과도한 주장을 수정(공격자 모델, CVSS, allow_url_fopen); 제출 보류(HOLD)
    2026-06/07보류 항목 해소; Drupal 보안 팀에 비공개 보고; 기본 클래스 쌍둥이 결함을 drupal/ai에 플래그 지정
    2026-07-10수정 릴리스 1.1.1 / 1.2.2; 권고 SA-CONTRIB-2026-053 및 CVE-2026-13233 공개; 작성자를 발견자 겸 수정 개발자로 기재