**Descrição:** Um atacante, que controla a entrada HTML fornecida ao dompdf, pode ler imagens arbitrárias do sistema de arquivos do servidor, evitando a restrição `chroot`. A vulnerabilidade é explorável na configuração padrão. **Condições de exploração:** Um usuário externo **Pesquisador:** Nikita Sveshnikov (Tecnologias Positivas) ## Pesquisa dompdf restringe o acesso aos arquivos locais usando o mecanismo `chroot`. Por padrão, `chroot` está definido no diretório raiz do dompdf (`Options.php: 350 - 351 `): _Listing 1. `chroot` settings_ ``` $rootDir = realpath(__DIR__. "/../"); $this->setChroot(array($rootDir)); // resultado: chroot = ["/path/ to/vendor/dompdf/dompdf"] ``` Quando o HTML refere um arquivo local, `Opções::validateLocalUri()` verifica que o caminho reside dentro `сhoroot`. Um link direto para o arquivo fora deste diretório é bloqueado corretamente: _Listing 2. Bloqueando link_ ``` ``` ### Como a proteção é evitada: Um atacante enrola o link para o arquivo alvo no formato SVG e o entrega através de `data:` URI:.

_Listing 3. Ligação de envolvimento no SVG_ ``` ``` Dentro da base 64 a carga útil é um SVG contendo o elemento ` ` que aponta para o arquivo alvo: _Listing 4. Apontando para o arquivo de destino_ ``` ``` ### Por que o bypass funciona: O problema é que o dompdf manipula o SVG duas vezes: primeiro através do seu próprio validador e depois através do `php-svg-lib` — e o segundo passe não aplica a proteção que o primeiro passa. **Passo 1.** O protocolo `data://` não tem regras de validação (`Options.php: 546 - 547 `): _Listing 5. Falta de regras_ ``` caso "data://": quebra; // nenhumas regras ``.

O conteúdo SVG passa sem cheques. **Passo 2.** dompdf pré- parses o SVG e valida os links dentro dele (`Cache.php: 137 - 183 `), mas interpreta incorretamente o caminho de uma referência de recurso externo (imagem) quando o SVG está codificado por dados- URI. **Passo 3.** Ao renderizar, o backend PDF passa o SVG para `php-svg-lib` com links externos ativados (`lib/Cpdf.php: 6315 - 6319 `):.

_Listing 6. Passando o SVG_ ``` $doc = novo \Svg\Document(); $doc->alvoReferências Externais = true; // forçou $doc-> loadFile($file); ``` `php-svg-lib` é uma biblioteca separada que não tem informações sobre o diretório `chroot` ou as regras de validação dompdf. **Passo 4.** O manuseador ` ` em blocos `php-svg-lib` somente `phar://`, tudo o resto é permitido quando permiteReferências Externas é verdadeiro (`php-svg-lib/src/Svg/Tag/ Image.php: 60 - 68 `): _Listing 7. `phar://` bloqueando_ ``` if ($ scheme === "phar". ($ este->documento-> permiteReferências Externas === falso && $ scheme! == "dados")) { retorno; } $this->documento->getSurface()->drawImage($this->href,...); ``` **Passo 5.** `drawImage()` invoca `file_get_content()` sem restrições (`php-svg-lib/src/Svg/Surface/SurfaceCpdf.php: 171 - 172 `):.

_Listing 8. `file_get_contents()` call_ ``` $data = file_get_contents($image); // lê Qualquer caminho ``` Não há verificação do chroot. Nenhuma validação de protocolo. O arquivo é lido e incorporado no PDF. ### Um exemplo de exploração: _Listing 9. Um exemplo de um código vulnerável (html) 2 pdf.php)_ ``` require_ once __ DIR__. '/ vendor/autoload.php'; $dompdf = novo Dompdf\Dompdf(); $dompdf->loadHtml($_POST['html']); $dompdf->rending(); $dompdf->stream('poc.pdf'), ['Ataque' => false]); ```. _Listing 10. Um ataque de exemplo no código vulnerável_ ``` $file = $_GET['file']?? '/tmp/user_files/user_ 1 /private_ image. png';.

$svg = ' '. ' '. ' '. $html = ' '. ' '. ' '; $url = ' 2 pdf.php'; $data = ['html' => $html]; $headers = ["Content-type: app/x- www- form- urlencoded"]; // use a tecla 'http' mesmo que você envie o pedido para $options = [ 'http' => [ 'header' => $headers, 'method' => 'POST', 'content' => http_build_query($data), 'ignore_errors' => true, ], ]; $context = stream_context_create($options); $response = file_get_content($url, false, $context); ``.

_Figura 1. A imagem foi lida com sucesso_. ## Créditos Nikita Sveshnikov (Tecnologias Positivas) Registro de aconselhamento: GHSA- cx 96 - 42 px-. 69 FM. Identificadores relacionados: CVE- 2026 - 56722. Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 22 T 21: 30: 01.000 Z e lista a sua última modificação como 2026 - 07 - 22 T 21: 30: 01.000 Z.

Gravidade: MODERAR. Dados de pontuação publicados: CVSS_V 4: CVSS: 4.0 /AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/África do Sul:N. Software afetado e informações de versão: Packagist dompdf/dompdf — ECOSISTEM: introduzido 0, corrigido 3.1.6. Classificação e evidência: identificadores de fraqueza CWE- 20, CWE- 22. O registro contém 5 suporte de referências nestes tipos: WEB, PACKAGE.