Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-45806 — A importação remota de imagens do Penpot permite que um editor de arquivos autenticado transforme um recurso normal de conveniência de mídia em SSRF de origem de backend, porque URLs controladas pelo atacante cruzaram para um caminho de busca de servidor que segue redirecionamentos sem filtragem de destino. | Kitploit
Ferramentas/GitHubGitHub/0xmrma/cve-2026-45806
Análise de VulnerabilidadesExploraçãoSegurança WebTestes de PenetraçãoPapers e PesquisaAprendizado e Educação
GitHub0xmrma/cve-2026-45806

CVE-2026-45806

Ver Repositório
1há 2 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →

Sobre

A importação remota de imagens do Penpot permite que um editor de arquivos autenticado transforme um recurso normal de conveniência de mídia em SSRF de origem de backend, porque URLs controladas pelo atacante cruzaram para um caminho de busca de servidor que segue redirecionamentos sem filtragem de destino.

Compartilhar

CVE-2026-45806

A importação remota de imagens do Penpot permitia que um editor de arquivos autenticado transformasse um recurso comum de mídia em um SSRF de origem do backend, porque URLs controladas pelo atacante cruzavam para um caminho de busca do servidor que seguia redirecionamentos sem filtragem de destino.

Introdução

Encontrei esse problema ao revisar o Penpot, a plataforma de design e colaboração de código aberto, com uma pergunta muito específica em mente:

O que acontece quando uma ferramenta de design colaborativo permite que um usuário entregue ao backend uma URL de imagem remota para buscar?

Neste caso, essa pergunta levou a um bug real.

O fluxo de importação remota de imagens do Penpot aceitava uma URL controlada pelo usuário e fazia com que o backend a buscasse a partir do contexto de rede do servidor, sem impor restrições de destino para alvos de loopback ou rede privada. O cliente HTTP compartilhado também seguia redirecionamentos automaticamente.

Isso transformou um recurso comum de mídia em uma primitiva SSRF autenticada de origem do backend e, por fim, tornou-se CVE-2026-45806.

Penpot: Penpot no GitHub
CVE: CVE-2026-45806
CVSS: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N

Isso afetou o Penpot. Em seu site oficial e kit de mídia, o Penpot afirma ter uma base de usuários em crescimento de +1M e diz que dezenas de milhares de organizações o utilizam, incluindo Blender, Mozilla, Fedora, NTT Data, MIT, , , , e .

Société Générale
Cisco
Fujitsu
Indra
ByteDance
photo0

Cadeia de Ataque

editor de arquivos autenticado -> URL de imagem remota controlada pelo atacante -> create-file-media-object-from-url -> fetch download-image do backend com redirecionamentos habilitados -> requisição final chega a um endpoint de imagem exclusivo interno -> SSRF de origem do backend / alcançabilidade interna


O que o Penpot Faz

Penpot é uma plataforma de design e colaboração de código aberto.

Ele lida com coisas como:

  • edição colaborativa de arquivos
  • fluxos de trabalho de equipe e projeto
  • mídia e ativos carregados
  • caminhos de renderização e pré-visualização
  • operações de design baseadas em navegador apoiadas por processamento no lado do servidor

Isso significa que seu caminho de importação de mídia está em um limite de confiança real.

A pergunta importante aqui não era se o Penpot suporta importar imagens remotas.

A verdadeira pergunta era:

O Penpot restringe onde o backend pode se conectar quando um usuário importa uma imagem remota?

Neste caso, não.


Por que Esse Bug Valeu a Pena ser Analisado

Muitas pessoas subestimam os recursos de importação remota.

Isso é um erro.

No momento em que uma aplicação:

  • aceita uma URL controlada pelo atacante,
  • faz a requisição a partir do backend,
  • e transforma essa requisição em um fluxo de trabalho normal do produto,

ela cria um limite de confiança de saída real.

Esse era o problema aqui.

Esse bug não estava na renderização de imagens. Não estava no armazenamento de arquivos. Não estava nas verificações de permissão comuns para editar um arquivo.

Era uma clássica falha de confiança no lado do servidor:

  • uma URL controlada pelo atacante entrou no sistema,
  • o backend a buscou diretamente,
  • redirecionamentos foram permitidos,
  • e nenhum controle de destino era visível no caminho revisado.

Isso é suficiente para criar uma vulnerabilidade real.


O Limite no Qual Foquei

Eu não abordei o Penpot fazendo fuzzing cego de métodos RPC aleatórios ou procurando por crashes primeiro.

A abordagem mais forte foi identificar o limite de segurança mais promissor.

Para o Penpot, isso era a importação remota de mídia.

Por quê?

Porque esse recurso combina:

  • entrada de URL controlada pelo atacante
  • requisições de saída de origem do backend
  • validação de conteúdo que ocorre apenas após a requisição ser feita
  • um fluxo de trabalho de design onde buscas bem-sucedidas são tratadas como operações normais de mídia

Esse era o limite certo para inspecionar.

E foi exatamente onde o bug residia.


Causa Raiz

O bug se resume a uma pequena cadeia de confiança.

No frontend:

root@kitploit:~
(defn upload-media-url
  [name file-id url]
  (rp/cmd!
   :create-file-media-object-from-url
   {:name name
    :file-id file-id
    :url url
    :is-local true}))

a url controlada pelo usuário é enviada diretamente para a chamada RPC.

Em seguida, no backend:

root@kitploit:~
(sv/defmethod ::create-file-media-object-from-url
  ...
  [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id] :as params}]
  (files/check-edition-permissions! pool profile-id file-id)
  ...
  (let [_    (files/get-minimal-file cfg file-id)
        mobj (create-file-media-object-from-url cfg (assoc params :profile-id profile-id))])

e:

root@kitploit:~
(defn- create-file-media-object-from-url
  [cfg {:keys [url name] :as params}]
  (let [content (media/download-image cfg url)

o backend verifica que o chamador pode editar o arquivo de destino e, em seguida, passa a URL controlada pelo atacante para media/download-image.

A implementação do fetch está aqui:

root@kitploit:~
(defn download-image
  "Download an image from the provided URI and return the media input object"
  [{:keys [::http/client]} uri]
  ...
  (http/req! client
             {:method :get :uri uri}
             {:response-type :input-stream})

E o cliente HTTP compartilhado está configurado como:

root@kitploit:~
(http/build-client {:connect-timeout 30000
                    :follow-redirects :always}))

Essa é toda a vulnerabilidade:

  • o atacante controla a URL
  • o backend realiza a requisição
  • redirecionamentos são seguidos automaticamente
  • nenhuma filtragem de destino é aplicada antes da requisição ser feita

Por que isso é explorável

Porque o atacante precisa apenas de:

  • uma conta válida no Penpot
  • permissão de edição em um arquivo
  • um alvo que retorne conteúdo de imagem aceito

A cadeia de ataque é direta:

  • o atacante fornece uma URL
  • o Penpot a busca a partir do backend
  • o primeiro salto pode ser público ou aparentemente inofensivo
  • o alvo do redirecionamento pode ser interno
  • se a resposta final parecer uma imagem permitida, a importação é concluída

Esse é todo o bug.


O que Torna Isso um Problema de Segurança, Não Apenas um Comportamento Normal de Importação Remota

A distinção importante é onde a requisição ocorre.

A pergunta não é:

"O Penpot pode importar imagens de URLs?"

A verdadeira pergunta é:

"Um usuário autenticado pode fazer o backend do Penpot se conectar a destinos internos que o usuário não deveria conseguir alcançar através da aplicação?"

Neste caso, a resposta foi sim.

Isso importa porque há uma diferença real entre:

  • um navegador buscando uma URL fornecida pelo usuário, e
  • o backend buscando essa URL a partir da posição de rede do servidor

A validação de imagem não remove essa diferença.

Ela estreita alguns casos de exfiltração direta, mas não remove a condição de SSRF nem a quebra do limite de rede.


PoC

Validei esse problema com uma prova local controlada diretamente ligada ao caminho de código revisado do Penpot.

O objetivo não era atingir infraestrutura de terceiros. O objetivo era provar a propriedade de segurança exata:

  • execução de requisição estilo backend
  • seguimento de redirecionamento
  • pivô bem-sucedido para um endpoint exclusivo interno
  • conclusão sob as mesmas restrições orientadas a imagem que o Penpot impõe

Construí um validador Java autocontido que espelhava o comportamento relevante:

  • GET do lado do backend para uma URI controlada pelo chamador
  • seguimento automático de redirecionamentos
  • verificações de aceitação de imagem baseadas em content-type e content-length

Validei dois casos.

Caso 1: fetch interno direto

O validador solicitou:

root@kitploit:~
http://127.0.0.1:7790/internal.png

Resultado observado:

  • URI solicitada: http://127.0.0.1:7790/internal.png
  • URI final: http://127.0.0.1:7790/internal.png
  • status: 200
  • content type: image/png
  • artefato escrito com sucesso

Isso provou que a lógica de fetch estilo importação aceitou diretamente um endpoint de imagem exclusivo interno.


Caso 2: fetch interno assistido por redirecionamento

O validador então solicitou:

root@kitploit:~
http://localhost:7791/redirect-to-internal

Esse endpoint retornou um redirecionamento HTTP para:

root@kitploit:~
http://127.0.0.1:7790/internal.png

Resultado observado:

  • URI solicitada: http://localhost:7791/redirect-to-internal
  • URI final: http://127.0.0.1:7790/internal.png
  • status: 200
  • content type: image/png
  • artefato escrito com sucesso

O ouvinte exclusivo interno registrou a requisição redirecionada.

Isso provou a alegação mais importante:

  • a URL inicial controlada pelo atacante pode diferir do destino final
  • redirecionamentos são seguidos automaticamente
  • o fetch final do backend pode chegar a um endpoint exclusivo interno e ainda ter sucesso

Por que a PoC Foi Construída Dessa Forma

O payload aqui foi intencionalmente simples:

  • resposta PNG pequena e válida
  • alvo de redirecionamento explícito
  • ouvinte exclusivo interno vinculado ao loopback

Isso importava porque o Penpot não apenas busca bytes arbitrários e para. Ele realiza validação orientada a mídia após a requisição.

Portanto, a prova correta não era:

"o backend pode tentar se conectar a algum lugar"

A prova mais forte era:

"o backend pode ser levado a se conectar a algum lugar interno e concluir a requisição com sucesso sob as mesmas restrições semelhantes a imagem que o recurso espera"

Isso é exatamente o que a validação demonstrou.


Por que Isso Ainda Valia a Pena Ser Reportado

Uma reação comum a bugs SSRF como este é:

"o alvo ainda precisa retornar uma imagem"

Essa observação é verdadeira, mas incompleta.

Ela não remove a vulnerabilidade.

Ela apenas indica quais alvos internos são mais diretamente úteis.

Esse problema ainda permite:

  • alcançabilidade interna de origem do backend
  • pivô assistido por redirecionamento para espaço de loopback ou rede privada
  • interação com endpoints internos que retornam imagens
  • abuso de confiança de rede a partir da posição do servidor Penpot

Isso ainda é uma quebra real de limite de segurança.

Especialmente em ambientes auto-hospedados, serviços internos muitas vezes existem especificamente atrás desse limite.


Gravidade e Classificação

Esse problema foi finalmente atribuído a uma gravidade Alta no CVSS:

  • CWE-918: Server-Side Request Forgery (SSRF)
  • CVSS:
root@kitploit:~
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N

Essa classificação faz sentido.

A alegação não é que um atacante não autenticado pode comprometer instantaneamente todas as implantações do Penpot a partir do nada.

A alegação é que qualquer editor de arquivos autenticado normal pode transformar o Penpot em uma primitiva de requisição de backend contra destinos internos, incluindo acesso assistido por redirecionamento a alvos de loopback e rede privada.

Houve alguma discussão sobre gravidade durante a divulgação, principalmente em torno de:

  • serviços internos que exigem autenticação
  • o conteúdo buscado precisar passar na validação de imagem
  • a exploração depender do conhecimento da infraestrutura interna

Essas são restrições justas para discutir.

Mas elas não removem o problema central:

  • URL controlada pelo atacante
  • origem da requisição no lado do backend
  • seguimento de redirecionamento
  • nenhuma política de destino de saída no caminho revisado

Isso é uma vulnerabilidade SSRF real e defensável.


Análise da Correção

A correção importante aqui não é um tratamento mais rigoroso de MIME.

A verdadeira correção é a política de destino de saída.

Uma remediação correta para essa classe de bug precisa:

  1. permitir apenas http e https
  2. resolver e rejeitar intervalos de loopback, RFC1918/privados, link-local, multicast, não especificados e de serviço de metadados antes de conectar
  3. verificar novamente cada salto de redirecionamento contra a mesma política
  4. considerar desabilitar redirecionamentos para este recurso ou limitá-los rigidamente
  5. adicionar cobertura de regressão para:
    • localhost
    • alvos privados diretos
    • casos de redirecionamento para privado
    • cenários estilo DNS rebinding

Essa é a direção correta da correção porque isso não era um bug de análise de imagem. Era um bug de limite de confiança de rede.


Divulgação

Esse problema foi reportado privadamente através do fluxo de relatórios de segurança do GitHub.

O relatório incluiu:

  • análise de causa raiz em nível de código-fonte
  • um modelo de validação local robusto
  • prova baseada em redirecionamento de pivô interno
  • evidências de artefatos e logs
  • orientação de remediação

Os mantenedores confirmaram o problema e começaram a trabalhar em uma resolução.

O problema foi posteriormente atribuído:

CVE-2026-45806


O que Esse Bug Realmente Ensina

A lição principal aqui é simples:

importação remota de mídia é um limite de confiança de saída, não apenas um recurso de conveniência

Muitos desenvolvedores pensam em termos de:

  • URL aceita
  • requisição bem-sucedida
  • imagem passa na validação
  • mídia armazenada

Esses são detalhes de implementação.

A verdadeira questão de segurança é:

onde o backend tem permissão para se conectar em nome de um usuário?

Se essa pergunta não for respondida explicitamente, recursos como importação remota se tornam superfícies SSRF por padrão.

Esse bug também reforça algo importante sobre a revisão de SSRF:

  • redirecionamentos importam
  • validação de conteúdo não substitui política de rede
  • SSRF autenticado ainda é grave quando cruza limites de confiança internos

Essa é a verdadeira lição.


Pontos-Chave

  • importação remota de imagens é um limite de confiança real do backend
  • recursos autenticados ainda podem expor SSRF grave
  • seguir redirecionamentos torna caminhos de fetch de saída muito mais perigosos
  • validação apenas de imagem estreita alguns caminhos de abuso, mas não remove SSRF
  • provar um caminho de redirecionamento interno bem-sucedido é mais forte do que apenas mostrar uma tentativa de conexão falha
  • a correção correta é política de destino de saída, não validação cosmética de resposta

Palavras Finais

Essa vulnerabilidade não era sobre um payload chamativo.

Era sobre fazer a pergunta certa sobre o limite de confiança.

O Penpot permitia que um editor de arquivos autenticado fornecesse uma URL de imagem remota, e o backend confiava nessa URL mais do que deveria. O tratamento de redirecionamento fez o resto.

É por isso que isso se tornou CVE-2026-45806.

Baixar ferramenta