
Drupal 11.4.8 - Alta - Remoto - XSS - AttributeXss ainda permite atributos HTMX
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · drupal-htmx-attr
Análise: https://abraxaslabs.tech/research/drupal-htmx-attr
Classe: XSS Armazenado Alcance: Remoto
Drupal core 11.4.8 (61044508) - Drupal
SA-CORE-2026-011 fechou os atributos HTMX em Xss::attributes(). Os atributos de link e menu passam por AttributeXss::sanitizeAttributes, e essa lista de exclusão ainda só descarta style e on*.
Um editor de conteúdo que pode definir um campo Link (ou um link de menu) pode armazenar hx-on-click ou data-hx-on-click. O Standard com BigPipe carrega core/htmx. Quando um administrador ou qualquer outro visualizador abre esse nó e clica no link, o HTMX executa o JS armazenado na origem do site.
| ID | ainda sem CVE |
| Classe | XSS Armazenado (atributos de evento HTMX) |
| Alcance | Remoto (usuário autenticado com escrita em campo Link / menu; a vítima visualiza e clica) |
| CWE | CWE-79 |
| CVSS | Alto: 8.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| Produto | Drupal core |
| Afetado | 11.4.8 (61044508071749629aaf3380aa85971e94df9e84) |
| Autenticação | usuário autenticado que pode escrever em um campo Link (ou link de menu). A vítima visualiza a página e clica. |
| Licença | GNU Affero GPL v3.0 |
| Laboratório | apenas 127.0.0.1 |
Escritor: um editor de conteúdo que pode definir options.attributes de um link (campo Link, link de menu, JSON:API). Vítima: qualquer pessoa cuja página carrega HTMX (Standard + BigPipe carrega core/htmx), incluindo um administrador do site que clica no link.
| Privilégio | Método / caminho | Tipo | Comprovado em laboratório ou inferido |
|---|---|---|---|
| Persistir atributos de evento HTMX em um link | POST /jsonapi/node/article com field_link.options.attributes.hx-on-click e data-hx-on-click | Integridade do campo armazenado | Comprovado em laboratório. JSON:API 201, os atributos armazenados ainda contêm hx-on-click |
Imprimir esses atributos no <a> do nó | LinkFormatter -> AttributeXss::sanitizeAttributes | Integridade do HTML | Comprovado em laboratório. O HTML de GET /node/1 contém hx-on-click e o marcador window['DRUPAL-HTMX-ATTR-WITNESS']=1 |
| Executar esse JS na origem da vítima quando ela clica | HTMX vincula hx-on-* | Integridade da sessão da vítima | Inferido a partir do HTMX + da página que carrega core/htmx. O laboratório não simulou um clique no navegador |
| Agir como o visualizador (cookie de sessão, cliques na interface de administração) | Mesmo XSS armazenado | Integridade da sessão da vítima | Inferido. O laboratório para no atributo que permanece no HTML |
Negativo: Xss::filter | Xss::filter('<a ... hx-on-click=...>') | Fechado | Comprovado fechado em laboratório. xss_keeps_hx=False |
| Escrita não autenticada do link | JSON:API sem sessão | Fechado | O laboratório fez login como uid 1 primeiro. Um estranho sem conta não pode definir o campo |
| RCE em PHP / LPE | n/a | Fechado | Este resíduo é JS de navegador, não PHP no servidor |
Mesmo resíduo de pin: Move Block sibling markup.
Fixe o drupal/drupal 11.4.8 após o SA-CORE-2026-011. Cinco buscas: XSS/HTMX, arquivo/MIME/oEmbed, JSON:API/unserialize/SQLi, auth/CSRF/Host, REST/media/Views. O acesso ao JSON:API, as chaves IN do EntityQuery (SA-004), o POI de campo serializado (SA-005) e o Host do rebuild.php (SA-007) permanecem corrigidos. A lista de exclusão do HTMX foi aplicada apenas em Xss.php.
$skip = (
in_array($attribute_name, ['style', 'srcdoc']) ||
str_starts_with($attribute_name, 'on') ||
str_starts_with($attribute_name, 'data-hx') ||
str_starts_with($attribute_name, 'hx') ||
str_starts_with($attribute_name, '-') ||
strlen($attribute_name) > 96
);
AttributeXss.php restante:
$skip = (
$attribute_name == 'style' ||
str_starts_with($attribute_name, 'on') ||
str_starts_with($attribute_name, '-') ||
strlen($attribute_name) > 96
);
Os chamadores incluem LinkFormatter.php e MenuLinkContent::getUrlObject().
Caminhos errados já registrados: tratar Xss::filter como o resíduo (ele é o controle); escrita não autenticada no JSON:API; RCE em PHP; um reverse shell. Teatro. O oráculo é o atributo que permanece no HTML do nó mais o core/htmx carregado.
python3 drupal-htmx-attr-Abraxas-Labs.py
ou
cd lab
./run.sh
Aponte apenas para http://127.0.0.1:19480. drupal:11.4.8-apache em execução, perfil Standard, JSON:API write habilitado para o laboratório. Projeto Compose drupal-htmx-attr.
SUCCESS drupal-htmx-attr how=live write=jsonapi nid=1 hx-on-click=kept jsonapi-stored=1 xss-filter=stripped htmx=loaded marker=1 version=11.4.8 DRUPAL-HTMX-ATTR-WITNESS
Copie a denylist hx / data-hx / srcdoc para AttributeXss. Incorpore-a em Xss como o docblock da classe já indica.
61044508071749629aaf3380aa85971e94df9e84)AttributeXss.php · Xss.phpGNU Affero GPL v3.0. Consulte LICENSE. Apenas laboratório loopback. Sem garantias.