Come Anders dice: Blender fa un ottimo punto sulle finestre di autenticazione, e korockinout13 ha ragione su gli attributi on. Inoltre, gli Aders aggiungono discussioni sul tag a
e Matija hanno un buon link sullo sfruttamento delle librerie che fanno il rendering.
Eppure, nessuno ha ancora parlato di SVG.
Prima di tutto supponiamo che tutti gli input e gli output siano correttamente sterilizzati, quindi i trucchi con onerror
/ onload
non sono possibili. E che non siamo interessati a CSRF. Siamo dopo XSS.
La prima preoccupazione per <img src=
è che non segue la stessa politica di origine. Ma probabilmente è meno pericoloso di quanto sembri.
Che cosa fa il browser per eseguire il rendering di < img > tag
< img src="http://domain/image.png">
èabbastanzasicuroperchéilbrowsernoninvocheràunparser(adesempiounparserXMLoHTML),sacheciòcheverràèun'immagine(gif,jpeg,png).
IlbrowsereseguiràlarichiestaHTTPeleggeràsemplicementeilMIMEdiciòcheèvenuto(nell'intestazioneConetent-Type
,adesempioimage/png
).SelarispostanonhaunContent-Type
diversibrowserindovinerannoinbaseall'estensione,etuttaviasupporterannosoloimmaginiMIME:image/jpeg
,image/png
oimage/gif
(tiff,bmpeppmsonodubbi,alcunibrowserpotrebberoavereunsupportolimitatoperindovinarle).Alcunibrowserpotrebberopersinotentarediindovinareilformatodell'immaginebasatosunumerimagici,madinuovononcercherannodiindovinareiformatiesoterici.
SeilbrowserpuòcorrisponderealMIME(probabilmenteindovinato)caricalalibreriadirenderingcorretta,lelibreriedirenderingpotrebberoavereunoverflowmaquestaèun'altrastoria.SeilMIMEnoncorrispondeaunalibreriadirenderingdiimmagini,l'immaginevienescartata.Selachiamataallalibreriadirenderingfallisce,anchel'immaginevienescartata.
Ilbrowsernonèmainemmenovicinoauncontestodiesecuzione(script).Lamaggiorpartedeibrowseraccedonoalcontestodiesecuzionesolodalparserjavascriptepossonosoloraggiungereilparserjavascriptdalapplication/javascript
MIMEodaiparserXMLoHTML(poichépotrebberoaverescriptincorporati).
PereseguireXSSabbiamobisognodiuncontestodiesecuzione.EntrainSVG.
Usodi<imgsrc="dominio / blah / blah / tricky.svg" >
Ahi, ahi ahi. SVG è un formato grafico vettoriale basato su XML, pertanto richiama il parser XML nel browser. Inoltre SVG ha il tag <script>
! Sì, puoi incorporare javascript direttamente in SVG.
Questo non è così pericoloso come sembra all'inizio. I browser che supportano SVG all'interno dei tag <img>
non supportano lo scripting all'interno del contesto . Idealmente dovresti usare SVG all'interno di <embed>
o <object>
tag dove lo scripting è supportato dai browser. Eppure, non farlo per i contenuti forniti dagli utenti!
Direi che consentire a SVG all'interno di <img src=
può essere pericoloso:
-
Un parser XML viene utilizzato per analizzare SVG, sia che si trovi all'interno del tag <img>
o <object>
. Il parser è certamente ottimizzato con alcuni parametri per ignorare i tag <script>
nel contesto <img>
. Eppure, è abbastanza brutto, è mettere in blacklist un tag in un certo contesto. E la lista nera è scarsa sicurezza.
-
<script>
non è l'unico modo per ottenere il contesto di esecuzione in SVG, ci sono anche gli eventi onmouseover
(e famiglia) presenti in SVG. Questo è di nuovo difficile da inserire nella blacklist.
-
Il parser XML nei browser ha sofferto di problemi in passato, notevoli con i commenti XML attorno ai blocchi di script. SVG potrebbe presentare problemi simili.
-
SVG ha pieno supporto per gli spazi dei nomi XML. Ahi di nuovo. xlink:href
è un costrutto completamente valido in SVG e il browser all'interno del contesto del parser XML probabilmente lo seguirà.
Quindi sì, SVG apre diversi vettori possibili per raggiungere il contesto di esecuzione. Inoltre, è una tecnologia relativamente nuova e quindi non ben temprata. Non sarei sorpreso di vedere CVE sulla gestione SVG. Ad esempio ImageMagick ha avuto problemi con SVG .