O `sanitizeHTMLElement` do jodit neutraliza um `javascript:` `href` usando um `href.trim(.indexOf('javascript') === 0 ` verificação. Isto omite o jodit de normalização se aplica a todos os outros atributos URL: ` isDangerousUrl` strips control bytes with ` value.replace(/[\u 0000 -\ u 0020 ]+/ g, '')' e minúsculas o valor antes de testar o esquema. Como a verificação `href` não faz nada, ela é evitada por três classes de obfuscação, todas as atirações confirmadas no clique contra o enviado 4.12.30 compilar: 1. Variantes de caso: `JAVASCRIPT:`, `Javascript:`, `jaVaScRiPt:` (a verificação é sensível ao caso). 2. Um C principal 0 controle byte, por exemplo, um `\x 01 ` prefixo antes da minúscula ` javascript:` (`trim()` ' não remove bytes no `\x 00 `-`\x 08 ` / `\x 0 e`-`\x 1 f` intervalo, mas o navegador tira um byte de controle principal antes de resolver o esquema. 3. Uma aba ou nova linha incorporada dentro do esquema, por exemplo `java\tscript:` ou `java\nscript:` (a aba/nova linha do navegador de uma URL, mas `indexOf('javascript')` vê a palavra quebrada e não corresponde).
O href perigoso sobrevive à atribuição `editor. value =` e ao LazyWalker em mudança, persiste no valor do editor armazenado. Uma vítima que clica no link em qualquer consumidor que renderiza o valor armazenado (editor somente leitura, página entregue pelo servidor, consumidor `innerHTML`) executa JS controlado pelo atacante na origem dessa página. A verificação está em `ssanitizeHTMLElement` em `src/core/helpers/html/safe-html.ts: 213 `. ```js if (safeJavaScriptLink && href && href.trim().indexOf('javascript')) === 0 ) { atr(elm, 'href', location.protocol + '//' + href); efetuado = true; } ```.
`href.trim()` remove apenas o espaço branco ASCII, e `indexOf('javascript')` é sensível ao caso e literal. Assim, a verificação não consegue disparar sempre que o esquema é superior/misto, prefixo por um byte de controle não-espaço branco, ou dividido por uma aba/nova linha incorporada - tudo o qual um navegador ainda resolve para `javascript:` ao clique (os esquemas URI são insensíveis a caso por RFC 3986 seção 3.1; bytes de controle, abas e linhas novas são removidos de uma URL durante a análise. O mesmo arquivo já contém a rotina correta, ` isDangerousUrl()` (linha) 176 ), usado para todos os outros atributos URL (`src`, `data`, `ação`, `formação', `poster', `background', `xlink:href`:.
````js function isDangerousUrl( value, tagName) { const normalized = value.replace(/[\u 0000 -\ u 0020 ]+/g, '').toLowerCase(); se (/ ^(?: javascript.vbscript.livescript.mocha):/.test(normalized)) { retorna true; } //... } ```` ` isDangerousUrl` tira cada byte de controle e espaço ASCII (`/[\u 0000 -\ u 0020 ]+/ g`) e minúsculas antes de testar o esquema, por isso ele resiste a todas as três obfuscações. Mas `href` nunca passa por ela: a lista de atributos `isDangerousUrl` é aplicada (`URL_ ATTRIBUTES`) é comentada "adesso a href", e `href` é manipulada apenas pela verificação `indexOf' mais fraca. Tanto o caminho síncrono de valores (`onAntes deSetNativaEditorValue` -> `safeHTML` -> `sanitizeHTMLElement`) como o caminho assincrono de mudança (`sanitizeAttributes` -> `sanitizeHTMLElement`) usam a mesma verificação fraca.
Controles positivos (o filtro está ao vivo): um simples minúsculo `javascript:` href IS neutralizado: o jodit reescribe o valor para `location.protocol + '//' + href', então lê `about://javascript:...' em uma página de teste sobre:blank e ` em uma página https. Um espaço ou aba ASCII principal é capturado por `trim()`; a passagem é específica para as formas não normalizadas acima. ### Prova de conceito. Configuração padrão. Atribuir uma carga útil ao editor e ler de volta o valor armazenado:.
```js const editor = Jodit.make('#editor'); editor.valor = ' clique em mim '; // editor.value getter retorna o href inalterado: // clique em mim document.getElementById('view').innerHTML = editor.valor; // Clique em "click me" executa alerta(document.domain) na origem do consumidor. `` O mesmo persiste para o formulário de controle-byte (um `\x 01 ` prefixo antes da minúscula `javascript:`) e os formulários embedded-tab/newline (`java\tscript:` / `java\nscript:`). Verificado ao vivo nos `es' enviados 2021 /jodit.min.js` para jodit 4.12.30. Controles positivos na mesma execução: ` ` desmontado; minúsculo `javascript:` neutralizado para `location.protocol + '//' + href` (`cerca de://...' na página de teste sobre:blank usada aqui, ` em uma página https).
Armazenado o clique- XSS. Um atacante com acesso de gravação a uma instância de editor (autor de conteúdo, ou autor de comentários em um aplicativo multi- usuário) armazena um link criado `javascript:`. Qualquer usuário que clica nele em uma visão que renderize o valor armazenado (editor de leitura, página entregue ao servidor, consumidor `innerHTML`) executa JS controlado pelo atacante nessa origem. É necessária uma interação do usuário (o clique). Um consumidor que re- sanitazes a saída do editor antes da renderização não é afetado. Rota `href` através do existente `isDangerousUrl()` em vez da verificação 'indexOf' sob medida. `isDangerousUrl` já tira bytes de controle e minúsculas, por isso fecha o caso, controle-byte e contornações de espaço branco embutidos imediatamente:.
````diff - se (safeJavaScriptLink && href && href.trim().indexOf('javascript')) === 0 ) { + se (safeJavaScriptLink && href && isDangerousUrl(href, elm.nodeName.toBaixaCaso())) { atr(elm, 'href', location.protocol + '//' + href); efetuado = true; } ```` Registro de aconselhamento: GHSA- j 839 - gqq 4 - gf 9 j. Identificadores relacionados: CVE- 2026 - 62324.
Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 31 T 19: 08: 20.000 Z e lista a sua última modificação como 2026 - 07 - 31 T 19: 08: 20.000 Z. Gravidade: MODERAR. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N.
Software afetado e informações de versão: pacote npm jodit — ECOSISTEM: introduzido 0, corrigido 4.12.31. Classificação e evidência: identificadores de fraqueza CWE- 79, CWE- 83. O registro contém 4 suporte de referências nestes tipos: WEB, PACKAGE.