Grav 2.0 torna o Twig de editor- authored em conteúdo de página por padrão e conta com o conteúdo de sandbox do Twig para contê- lo. A política de sandbox enviada permite a lista `addcss` e `addjs` no `Grav\Common\Assets` (`system/src/Grav/Common/Twig/Sandbox/SandboxDefaults.php: 307 `). Como a caixa de areia arbitra o *call* e não o seu efeito a jusante, um usuário que detém apenas direitos de edição de página pode registrar um ativo arbitrário do conteúdo da página; o tema emite- o na cabeça do documento como uma etiqueta ` ` / ` `. O URL do ativo é concatenado nessa etiqueta **sem escapar**, para que ele também possa escapar do seu próprio atributo. A análise XSS de salvamento não pode ver isto: `Securidade::detecteXssInEditorContent()` renderiza o corpo de conteúdo isoladamente e inspeciona a string devolvida, enquanto que `assets.addJs()` atua mutando o serviço de Ativos compartilhados e retorna apenas uma chave de objeto. A carga útil não contém marcação para o scanner a ser marcado. Isto não é um 'Security::detectXss()' de revascularização. É conteúdo que atinge um afundamento de saída inesperado através de um método listado.
Todos os Grav 2.0 libera cuja política de sandbox permite a lista `addcss`/ `addjs` no `Grav\Common\Assets`. A entrada anterior a 2.0.19 — foi levado para a frente sem alterações quando as listas de permissões da caixa de areia foram movidas do `system/config/security.yaml` para `SandboxDefaults` em 2.0.19. Grav 1.7 não é afetado: não tem nenhum conteúdo de sandbox do Twig e requer um `processo' explícito por página: twig`. **Realizado por um editor de página simples, sem permissão do Twig e sem mudança de configuração.** Em uma unidade de estoque instalar `security.twig_content.process_enabled` é `verdadeiro' e `system/config/system.yaml` naves `process: { markdown: true }` sem chave `twig`, assim `Security:::applyTwigContentDefault()` por omissão o `process.twig` de cada página para o valor do portão. O Twig de Conteúdo é executado em cada página que não configura explicitamente a bandeira. `security.twig_content. editor_abilitado: false` e o portão de permissão `admin.pages_twig` somente a caixa de seleção por página *override* no editor — eles não permitem que o Twig seja executado.
** O lavatório.** `Assets/ Js.php: 46 ` (e idêntico ` Css.php: 50 `, `Link.php: 41 `, `JsModule.php: 47 `) compila a etiqueta por concatenação sem fuga: ```php retorna ' asset). $this->renderQueryString(). '''. $this->renderAtributes().... ```. Para qualquer ativo remoto, ` BaseAsset::init()` armazena a string do chamador literalmente. A seguir seguem duas variantes de trabalho:.
1. Inclusão de script externo — `{{ assets.addJs(' }}` 2. Injeção de atributo com ** nenhum host controlado pelo atacante** — `{{ assets.addJs('/user/themes/quark/js/site.js', {'onload':'alert( 1 )'}) }}`, porque ` unifyLegacyArguments()` passa um argumento de segunda array diretamente nos atributos da tag e atributo *nomes* não são filtrados. O mesmo efeito é alcançável ao incorporar uma citação na própria URL. **Timing.** `Twig::processSite()` resolve `$page->content()` antes de renderizar o modelo do tema, então o registro aterriza antes da cabeça ser emitida.
` javascript:` e `data:` URLs não são exploráveis — são tratados como caminhos locais e deixados para trás quando o arquivo não existe. A execução de script persistente na própria origem do site para cada visitante da página afetada — **incluindo administradores**, o que torna isto um aumento de editor de página para superadmin:.
- Administração- Em seguida renderiza a visualização da página editada como um iframe apontado para a URL da frente real com `sandbox="allow- same- original allow- scripts allow- forms"`, por isso, simplesmente, a visualização da página do editor executa a carga útil na origem do painel de administração. O isolamento de sessão de visualização existente (`plugins.api.protect_frontend_session`) apenas suprime a sessão do lado do servidor começa a proteger a sessão da frente de um visitante; ele não isola a origem e não impede isso. - Admin- Next persiste na API do administrador **acesso e atualização dos JWT** no `localStorage ' na mesma origem. O script injetado lê diretamente, dando acesso à API portátil super- administração que sobrevive à visão da página. - Um administrador que apenas navega pelo site público enquanto está conectado é igualmente suficiente; a visualização não é necessária. Corrigido em Grav 2.0.20. - `addcss`/ `addjs` removido do método `Grav\Common\Assets` allowbox. O registro de ativos é uma preocupação de layout, não de conteúdo. Sites que realmente precisam dele podem adicionar os métodos através de `security.twig_sandbox.allowed_methods`, que é aditivo sobre os padrão enviados. - As URLs de ativos são agora escavados em HTML em cada site de renderização (`Js`, `Css`, `Link`, `JsModule` e o pipeline), assim uma citação em uma URL de ativos não pode mais sair do seu atributo independentemente de qual chamada o forneceu.
Os operadores que não podem atualizar imediatamente podem apertar a política em ` user/config/ security.yaml`: ``` yaml twig_ sandbox: negado_methods: - classe: Grav\ Common\ Assets methods: 'addcss, addjs' ```.
Relatou por Ahmed Ibrahim (@ skeletonsec). Registro de aconselhamento: GHSA- 8 hgv- xc 77 -Jmcr. Não há nenhum identificador adicional listado.
Tempo: GitHub Advisory Database publicou este registro em 2026 - 08 - 21 T 19: 14: 59.000 Z e lista a sua última modificação como 2026 - 08 - 21 T 19: 14: 59.000 Z. Gravidade: MODERAR. Dados de pontuação publicados: CVSS_V 4: CVSS: 4.0 /AV:N/AC:L/AT:N/PR:L/UI:P/VC:L/VI:L/VA:N/SC:L/SI:L/África do Sul:N.
Software afetado e informações de versão: pacote getgrav/grav do Packagist — ECOSISTEM: introduzido 0, corrigido 2.0.20. Classificação e evidência: identificadores de fraqueza CWE- 79. O registro contém 4 suporte de referências nestes tipos: WEB, PACKAGE.