
CVE-2026-67598 — Emlog Pro: AI 어시스턴트에서 비활성화된 TLS 인증서 검증(MITM → API 키 탈취). CWE-295, CVSS 9.1. @IlhomjonR이(가) 보고함.
| CVE ID | CVE-2026-67598 |
| 제품 | emlog/emlog — Emlog Pro |
| 영향 범위 | Emlog Pro 2.6.23까지 |
| 취약점 유형 | CWE-295: 부적절한 인증서 검증 |
| CVSS v4.0 | 9.1 — 치명적(Critical) |
| CVSS v3.1 | 7.4 — 높음(High) |
| 공격 벡터 | 네트워크 인접 · 권한 불필요 · MITM |
| CNA | VulnCheck · GHSA-hf85-99vj-m4c5 |
| 예약 / 공개 | 2026-07-29 / 2026-08-03 |
| 연구자 | Ilhomjon Rustamov (@IlhomjonR) |
Emlog Pro에는 관리자용 AI 어시스턴트(admin/ai.php + include/service/ai.php)가 포함되어 있으며,
구성된 LLM 공급자에게 아웃바운드 HTTPS 호출(채팅, 스트리밍, 이미지 생성)을 수행합니다 — 그리고
@em-help 명령을 위한 Bing 스크래핑 헬퍼도 포함합니다.
모든 아웃바운드 요청 헬퍼는 조건 없이 TLS 인증서 검증을 비활성화합니다:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
검증은 구성된 공급자 URL이나 네트워크 경로와 관계없이 꺼져 있으므로, Emlog 서버와 api_url 사이에
위치한 네트워크 인접 / 중간자(MITM) 공격자는 위조된 인증서로 TLS 세션을 투명하게 가로챌 수 있으며:
Authorization: Bearer <apiKey> 헤더 탈취 — 사이트가 비용을 지불하는 LLM 공급자의 API 키.query_database 및 update_config 도구 접근 권한을
보유한 LLM을 구동합니다.이는 순수한 전송 보안 결함이며, AI 도구 호출 확인 UI 뒤에 숨겨진 것이 아닙니다.
flowchart LR
A["🖥️ Emlog server<br/>AI assistant"] -->|"HTTPS request<br/>Bearer <apiKey>"| M{"😈 MITM attacker<br/>(forged cert)"}
M -->|"TLS verify DISABLED<br/>→ accepted"| P["☁️ LLM provider"]
M -.->|"🔑 reads API key"| X["Key exfiltrated"]
M -.->|"💉 forged response"| A
A -->|"acts on injected<br/>AI output"| T["⚙️ query_database /<br/>update_config tools"]
classDef bad fill:#7f1d1d,stroke:#ef4444,color:#fff;
classDef ok fill:#1e3a8a,stroke:#3b82f6,color:#fff;
class M,X bad;
class A,P,T ok;include/service/ai.php — CURLOPT_SSL_VERIFYPEER / CURLOPT_SSL_VERIFYHOST 호출 위치:
| 함수 | 용도 |
|---|---|
send() | LLM 채팅 요청 |
sendStream() | 스트리밍 채팅 응답 |
sendImageRequest() | AI 이미지 생성 |
fetchSearchHtml() | @em-help용 Bing 스크래핑 |
# 1. Configure the AI assistant with any OpenAI-compatible provider URL + API key.
# 2. Put a MITM proxy with an UNTRUSTED CA between Emlog and the provider:
mitmproxy --mode reverse:https://api.provider.example -p 8443
# 3. Trigger any AI chat / image-gen / @em-help request from the admin panel.
# 4. Result: request succeeds despite the untrusted cert, and the
# "Authorization: Bearer ..." header is readable in the proxy log
# → certificate validation is confirmed disabled.
감사 대상 Emlog Pro 2.6.23 인스턴스의 스크린샷은 screenshots/에 있습니다 —
홈페이지 및 관리자 로그인.
include/service/ai.php의 모든 아웃바운드 호출에서 TLS 검증을 활성화하세요:
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
사설 CA를 사용하는 자체 호스팅 / OpenAI 호환 엔드포인트는 사용자 지정 CA 번들(
CURLOPT_CAINFO)로 지원해야 합니다 — 절대 전체적으로 검증을 비활성화하는 방식으로는 안 됩니다.
동일한 AI 기능을 감사하던 중, Ai::queryDatabase()가 blog 테이블에 대한 직접 SQL 쓰기는 특별히
차단하지만 role / password를 보유한 user 테이블은 차단하지 않는 것으로 확인되었습니다.
@em-help를 통한 간접 프롬프트 주입 경로(실시간 Bing 결과 + 스크래핑된 FAQ가 query_database /
update_config 도구 접근 권한을 가진 모델에 전달됨)와 결합하면, write_article이 블로그 게시물을
처리하는 방식처럼 user / options 쓰기를 범위가 좁은 도구로 라우팅하는 하드닝이 필요합니다.
전체 내용은 **REPORT.md**에 있습니다(위 CVE와 별도로 추적됨).
| 날짜 | 이벤트 |
|---|---|
| 2026-07-24 | Emlog Pro 2.6.23(커밋 ff5637e) 감사 중 취약점 발견 |
| 2026-07-29 | VulnCheck를 통해 CVE 예약 |
| 2026-08-03 | CVE-2026-67598 공개 |
조정된 공개(coordinated disclosure)의 일환으로 교육 및 방어적 보안 목적으로 게시됨.
발견 및 보고: Ilhomjon Rustamov (@IlhomjonR) · CNA: VulnCheck