# Vue.js {{#include ../../banners/hacktricks-training.md}} ## Sinks XSS in Vue.js ### Direttiva v-html La direttiva `v-html` rende HTML **grezzo**, quindi qualsiasi ` ``` ### v-bind con src o href Collegare una stringa utente ad attributi che contengono URL (`href`, `src`, `xlink:href`, `formaction` …) consente l'esecuzione di payload come `javascript:alert(1)` quando il link viene seguito. ```html
Click me
``` ### v-on con gestori controllati dall'utente `v-on` compila il suo valore con `new Function`; se quel valore proviene dall'utente, gli offri l'esecuzione del codice su un piatto. ```html
``` ### Nomi dinamici di attributi / eventi I nomi forniti dall'utente in `v-bind:[attr]` o `v-on:[event]` consentono agli attaccanti di creare qualsiasi attributo o gestore di eventi, eludendo l'analisi statica e molte regole CSP. ```html ``` ### Componente dinamico (``) Consentire stringhe utente in `:is` può montare componenti arbitrari o modelli inline—pericoloso nel browser e catastrofico in SSR. ```html ``` ### Modelli non attendibili in SSR Durante il rendering lato server, il modello viene eseguito **sul tuo server**; l'iniezione di HTML da parte dell'utente può elevare l'XSS a una piena Esecuzione Remota di Codice (RCE). Le CVE in `vue-template-compiler` dimostrano il rischio. ```js // DANGER – never do this const app = createSSRApp({ template: userProvidedHtml }) ``` ### Filtri / funzioni di rendering che valutano I filtri legacy che costruiscono stringhe di rendering o chiamano `eval`/`new Function` sui dati degli utenti sono un altro vettore XSS—sostituiscili con proprietà calcolate. ```js Vue.filter('run', code => eval(code)) // DANGER ``` --- ## Altre vulnerabilità comuni nei progetti Vue ### Inquinamento del prototipo nei plugin I helper di deep-merge in alcuni plugin (ad es., **vue-i18n**) hanno permesso agli attaccanti di scrivere in `Object.prototype`. ```js import merge from 'deepmerge' merge({}, JSON.parse('{ "__proto__": { "polluted": true } }')) ``` ### Open redirects con vue-router Passare URL utente non controllati a `router.push` o `` può reindirizzare a URI `javascript:` o domini di phishing. ```js this.$router.push(this.$route.query.next) // DANGER ``` ### CSRF in Axios / fetch Le SPA hanno ancora bisogno di token CSRF lato server; i cookie SameSite da soli non possono bloccare i POST cross-origin inviati automaticamente. ```js axios.post('/api/transfer', data, { headers: { 'X-CSRF-TOKEN': token } }) ``` ### Click-jacking Le app Vue sono incapsulabili a meno che non invii sia `X-Frame-Options: DENY` che `Content-Security-Policy: frame-ancestors 'none'`. ```http X-Frame-Options: DENY Content-Security-Policy: frame-ancestors 'none'; ``` ### Content-Security-Policy pitfalls La build completa di Vue necessita di `unsafe-eval`; passa alla build runtime o ai template precompilati in modo da poter eliminare quella fonte pericolosa. ```http Content-Security-Policy: default-src 'self'; script-src 'self'; ``` ### Attacchi alla supply-chain (node-ipc – Marzo 2022) Il sabotaggio di **node-ipc**—estratto da Vue CLI—ha mostrato come una dipendenza transitiva possa eseguire codice arbitrario sulle macchine di sviluppo. Blocca le versioni e controlla spesso. ```shell npm ci --ignore-scripts # safer install ``` --- ## Hardening Checklist 1. **Sanitizza** ogni stringa prima che raggiunga `v-html` (DOMPurify). 2. **Whitelist** schemi, attributi, componenti ed eventi consentiti. 3. **Evita `eval`** e template dinamici del tutto. 4. **Aggiorna le dipendenze settimanalmente** e monitora gli avvisi. 5. **Invia intestazioni HTTP forti** (CSP, HSTS, XFO, CSRF). 6. **Blocca la tua catena di fornitura** con audit, lockfile e commit firmati. ## References - [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}}