# Vue.js {{#include ../../banners/hacktricks-training.md}} ## XSS Sinks in Vue.js ### v-html Directive A diretiva `v-html` renderiza **HTML** bruto, então qualquer ` ``` ### v-bind com src ou href Vincular uma string de usuário a atributos que contêm URL (`href`, `src`, `xlink:href`, `formaction` …) permite que cargas úteis como `javascript:alert(1)` sejam executadas quando o link é seguido. ```html
Click me
``` ### v-on com manipuladores controlados pelo usuário `v-on` compila seu valor com `new Function`; se esse valor vem do usuário, você entrega a execução de código em uma bandeja. ```html
``` ### Nomes de atributos / eventos dinâmicos Nomes fornecidos pelo usuário em `v-bind:[attr]` ou `v-on:[event]` permitem que atacantes criem qualquer atributo ou manipulador de eventos, contornando a análise estática e muitas regras de CSP. ```html ``` ### Componente dinâmico (``) Permitir strings de usuário em `:is` pode montar componentes arbitrários ou templates inline—perigoso no navegador e catastrófico em SSR. ```html ``` ### Modelos não confiáveis em SSR Durante a renderização do lado do servidor, o modelo é executado **no seu servidor**; injetar HTML do usuário pode escalar XSS para execução remota de código completo (RCE). CVEs em `vue-template-compiler` provam o risco. ```js // DANGER – never do this const app = createSSRApp({ template: userProvidedHtml }) ``` ### Filtros / funções de renderização que avaliam Filtros legados que constroem strings de renderização ou chamam `eval`/`new Function` em dados do usuário são outro vetor de XSS—substitua-os por propriedades computadas. ```js Vue.filter('run', code => eval(code)) // DANGER ``` --- ## Outras Vulnerabilidades Comuns em Projetos Vue ### Poluição de protótipo em plugins Helpers de deep-merge em alguns plugins (por exemplo, **vue-i18n**) permitiram que atacantes escrevessem em `Object.prototype`. ```js import merge from 'deepmerge' merge({}, JSON.parse('{ "__proto__": { "polluted": true } }')) ``` ### Redirecionamentos abertos com vue-router Passar URLs de usuários não verificadas para `router.push` ou `` pode redirecionar para URIs `javascript:` ou domínios de phishing. ```js this.$router.push(this.$route.query.next) // DANGER ``` ### CSRF em Axios / fetch SPAs ainda precisam de tokens CSRF do lado do servidor; cookies SameSite sozinhos não podem bloquear POSTs cross-origin enviados automaticamente. ```js axios.post('/api/transfer', data, { headers: { 'X-CSRF-TOKEN': token } }) ``` ### Click-jacking Aplicativos Vue são passíveis de serem emoldurados, a menos que você envie tanto `X-Frame-Options: DENY` quanto `Content-Security-Policy: frame-ancestors 'none'`. ```http X-Frame-Options: DENY Content-Security-Policy: frame-ancestors 'none'; ``` ### Content-Security-Policy armadilhas A construção completa do Vue precisa de `unsafe-eval`; mude para a construção em tempo de execução ou templates pré-compilados para que você possa eliminar essa fonte perigosa. ```http Content-Security-Policy: default-src 'self'; script-src 'self'; ``` ### Ataques à cadeia de suprimentos (node-ipc – Março de 2022) O sabotagem do **node-ipc**—retirado pelo Vue CLI—mostrou como uma dependência transitiva pode executar código arbitrário em máquinas de desenvolvimento. Fixe versões e audite com frequência. ```shell npm ci --ignore-scripts # safer install ``` --- ## Lista de Verificação de Fortalecimento 1. **Sanitizar** cada string antes de chegar a `v-html` (DOMPurify). 2. **Lista branca** de esquemas, atributos, componentes e eventos permitidos. 3. **Evitar `eval`** e templates dinâmicos completamente. 4. **Corrigir dependências semanalmente** e monitorar avisos. 5. **Enviar cabeçalhos HTTP fortes** (CSP, HSTS, XFO, CSRF). 6. **Trancar sua cadeia de suprimentos** com auditorias, arquivos de bloqueio e commits assinados. ## Referências - [https://www.stackhawk.com/blog/vue-xss-guide-examples-and-prevention/](https://www.stackhawk.com/blog/vue-xss-guide-examples-and-prevention/) - [https://medium.com/@isaacwangethi30/vue-js-security-6e246a7613da](https://medium.com/@isaacwangethi30/vue-js-security-6e246a7613da) - [https://vuejs.org/guide/best-practices/security](https://vuejs.org/guide/best-practices/security) {{#include ../../banners/hacktricks-training.md}}