<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Snoop</title>
        <link>http://blogs.ugidotnet.org/leonardo/category/Snoop.aspx</link>
        <description>Snoop</description>
        <language>it</language>
        <copyright>Leonardo</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Il controllo PasswordBox di WPF? Ecco come ti svelo la password e come la proteggo nel VisualTree</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2008/09/29/il-controllo-passwordbox-di-wpf-ecco-come-ti-svelo-la.aspx</link>
            <description>&lt;p&gt;Windows Presentation Foundation introduce un nuovo controllo per l’immissione delle password ma purtroppo, &lt;a href="http://www.codeproject.com/KB/DLL/pwdspy.aspx"&gt;come per il TextBox Win32&lt;/a&gt;, non è troppo complicato svelare la parola magica nascosta sotto gli asterischi.&lt;/p&gt;
&lt;p&gt;Il metodo più veloce consiste nell’analizzare il VisualTree (l’albero visuale dei controlli) tramite &lt;a href="http://blois.us/Snoop"&gt;Snoop&lt;/a&gt; ed andare a leggere direttamente la proprietà Password del controllo.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/IlcontrolloPasswordBoxdiWPFEccocometisve_1EE6/Unsecure_WPF_LogOn.jpg"&gt;&lt;img title="Unsecure_WPF_LogOn" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="363" alt="Unsecure_WPF_LogOn" width="500" border="0" src="/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/IlcontrolloPasswordBoxdiWPFEccocometisve_1EE6/Unsecure_WPF_LogOn.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;In pochi secondi la password può così essere trovata ma possiamo rendere la vita più difficile ad occhi indiscreti con poche righe di codice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Innanzitutto come possiamo nascondere un valore di una proprietà da Snoop?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Snoop visualizza sia le &lt;a href="http://msdn.microsoft.com/it-it/library/ms752914.aspx"&gt;proprietà di dipendenza&lt;/a&gt; sia le proprietà CLR ma noi creeremo una proprietà di dipendenza ad hoc per ingannare il programma (perlomeno nella versione attuale).&lt;/p&gt;
&lt;p&gt;Proviamo prima di passare “al sodo” a creare una semplice Window in un nuovo progetto WPF chiamata MainWindow e ad inserire una normale DependencyProperty chiamata MyString1 con un valore di default facilmente riconoscibile:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/IlcontrolloPasswordBoxdiWPFEccocometisve_1EE6/MyString14.gif"&gt;&lt;img title="MyString1" style="DISPLAY: inline" height="320" alt="MyString1" width="546" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/IlcontrolloPasswordBoxdiWPFEccocometisve_1EE6/MyString14.gif" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Snoopando MainWindow (gergo che significa: aprendo Snoop, selezionando la nostra applicazione in esecuzione, cliccando “Snoop this application” e cercando nel TreeView l’elemento MainWindow) possiamo vedere e modificare il valore di default MyString1. &lt;/p&gt;
&lt;p&gt;Aggiungendo al costruttore della classe il codice &lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/IlcontrolloPasswordBoxdiWPFEccocometisve_1EE6/MyStringNuovoValore.gif"&gt;&lt;img title="MyStringNuovoValore" style="DISPLAY: inline" height="26" alt="MyStringNuovoValore" width="229" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/IlcontrolloPasswordBoxdiWPFEccocometisve_1EE6/MyStringNuovoValore.gif" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;anche il nuovo valore viene visualizzato da Snoop al caricamento della Window, tutto funziona a dovere.&lt;/p&gt;
&lt;p&gt;Creiamo ora una nuova DependencyProperty chiamata MyString2 inserendo però nel “wrapper” CLR il codice di una normale proprietà CLR:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/IlcontrolloPasswordBoxdiWPFEccocometisve_1EE6/MyString2.gif"&gt;&lt;img title="MyString2" style="DISPLAY: inline" height="239" alt="MyString2" width="516" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/IlcontrolloPasswordBoxdiWPFEccocometisve_1EE6/MyString2.gif" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Come si comporterà adesso Snoop con MyString2? Semplice continuerà a leggere la DependencyProperty gestita dal sistema di proprietà WPF mentre “il codice“ userà il wrapper CLR. In parole povere Snoop leggerà col metodo GetValue MyString2 mentre il codice leggerà MyString2 tramite _myString2.&lt;/p&gt;
&lt;p&gt;Perfetto, abbiamo trovato come farla franca a Snoop!&lt;/p&gt;
&lt;p&gt;Per esemplificare meglio allego il codice sorgente di &lt;a href="http://cid-7996fa031700f3fe.skydrive.live.com/self.aspx/Pubblica/AntiSnoopSample.zip"&gt;AntiSnoopSample&lt;/a&gt;, un piccolo programma che ho scritto per mostrare le potenzialità di una proprietà di dipendenza “scritta male” in cui includo nella Window anche una proprietà solamente CLR MyString3 per dimostrare che Snoop legge correttamente anche le proprietà non di dipendenza.&lt;/p&gt;
&lt;p&gt;Con quello che abbiamo imparato torniamo al nostro problema, analizzando il controllo PasswordBox notiamo subito che è marcato con &lt;a href="http://msdn.microsoft.com/it-it/library/88c54tsw.aspx"&gt;sealed&lt;/a&gt; (non può essere ereditato), questo ci esclude una derivazione diretta di un nostro controllo che memorizzi la password in un campo non leggibile facilmente da Snoop.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/IlcontrolloPasswordBoxdiWPFEccocometisve_1EE6/Object_Browser_PasswordBox.jpg"&gt;&lt;img title="Object_Browser_PasswordBox" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="309" alt="Object_Browser_PasswordBox" width="471" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/IlcontrolloPasswordBoxdiWPFEccocometisve_1EE6/Object_Browser_PasswordBox.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A questo punto possiamo scegliere due strade: derivare dal controllo TextBox un “nostro PasswordBox” o cercare di ovviare tale limitazione tramite la gestione dell’evento &lt;a href="http://msdn.microsoft.com/it-it/library/system.windows.controls.passwordbox.passwordchanged.aspx"&gt;PasswordChanged&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;L’evento PasswordChanged viene scatenato quando il valore della proprietà viene modificato quindi possiamo copiare il carattere inserito in un campo privato interno alla nostra Window e sostituire la password del PasswordBox con degli asterischi (nel codice allegato la password è sostituita con dei cerchi). Ora proviamo a recuperare con Snoop la nostra password: otterremo solamente degli asterischi. Nella nostra applicazione dovremmo utilizzare il campo privato (nel codice this.pwd) per poter utilizzare la password in chiaro.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/IlcontrolloPasswordBoxdiWPFEccocometisve_1EE6/Snoop_secure_WPF_LogOn.jpg"&gt;&lt;img title="Snoop_secure_WPF_LogOn" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="213" alt="Snoop_secure_WPF_LogOn" width="543" border="0" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/IlcontrolloPasswordBoxdiWPFEccocometisve_1EE6/Snoop_secure_WPF_LogOn.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Questa scelta ha però diverse limitazioni, per via del controllo PasswordBox “chiuso” non è possibile rilevare la posizione del cursore di testo. Non è possibile quindi replicare esattamente la password nel campo privato se è stato incollato del testo o se è stato premuto il tasto canc o backspace.&lt;/p&gt;
&lt;p&gt;Dovremo limitarci a cancellare tutta la password all’avvenire di una di queste condizioni ma tutto sommato in alcuni scenari potrebbe andar bene.&lt;/p&gt;
&lt;p&gt;Se invece scegliamo la strada della derivazione avremo maggiore flessibilità ma anche maggiore “responsabilità”, il codice dovrà infatti individuare la posizione delle modifiche nella password e riprodurle in un campo non visibile da Snoop.&lt;/p&gt;
&lt;p&gt;Ho implementato a titolo esemplificativo il controllo SecurePasswordBox derivandolo da un TextBox, tutta la logica è eseguita nell’&lt;a href="http://msdn.microsoft.com/it-it/library/ebca9ah3.aspx"&gt;override&lt;/a&gt; dell’evento &lt;a href="http://msdn.microsoft.com/it-it/library/z0bhdw6s.aspx"&gt;OnTextChanged&lt;/a&gt; e la password in chiaro è recuperabile tramite l’usuale proprietà Text del controllo. Snoop non permette di leggere la proprietà Text propria del SecurePasswordBox perchè, come spiegato, il suo wrapper CLR implementa un normale campo privato invece di chiamare SetValue/GetValue.&lt;/p&gt;
&lt;p&gt;Snoop chiamando GetValue legge effettivamente “base.Text” ovvero il testo contenuto nel controllo eredito impostato però ad una serie di asterischi, la nostra privacy è al sicuro da Snoopate maliziose. Missione compiuta.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cid-7996fa031700f3fe.skydrive.live.com/self.aspx/Pubblica/SecureWpfLogOn.zip"&gt;Scarica il codice sorgente dell’articolo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;NOTA BENE: Queste soluzioni non vogliono essere definitive, una versione modificata di Snoop potrebbe benissimo leggere le password anche in questi casi o comunque l’attaccante potrebbe analizzare la memoria del programma e trovare in ogni caso la password, queste soluzioni vogliono difendere la sicurezza dell’applicazione sviluppata da un problema comune di facile applicazione.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Il consiglio è di non permettere in ambienti delicati l’esecuzione arbitraria in Full Trust di qualsiasi programma per evitare spiacevoli sorprese.&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/94325.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2008/09/29/il-controllo-passwordbox-di-wpf-ecco-come-ti-svelo-la.aspx</guid>
            <pubDate>Mon, 29 Sep 2008 23:23:18 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2008/09/29/il-controllo-passwordbox-di-wpf-ecco-come-ti-svelo-la.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/94325.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/94325.aspx</trackback:ping>
        </item>
        <item>
            <title>Snoop e l&amp;rsquo;applicazione scomparsa</title>
            <link>http://blogs.ugidotnet.org/leonardo/archive/2008/09/27/snoop-e-lrsquoapplicazione-scomparsa.aspx</link>
            <description>&lt;p&gt;Mi sono sempre chiesto come mai &lt;a href="http://blois.us/Snoop/"&gt;Snoop&lt;/a&gt; non riconosca Visual Studio come applicazione WPF, Cider (il designer WPF di Visual Studio 2008) è scritto in buona parte in WPF quindi Snoop dovrebbe riconoscerlo come tutti gli altri programmi WPF.&lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Snoopelapplicazionescomparsa_12C1/perforator_vs_7.jpg"&gt;&lt;img title="perforator e visual studio" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="315" alt="perforator e visual studio" width="550" border="0" src="/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Snoopelapplicazionescomparsa_12C1/perforator_vs7.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A prova della considerazione che Cider è scritto in WPF ho analizzato Visual Studio con &lt;a href="http://windowsclient.net/wpf/perf/wpf-perf-tool.aspx"&gt;Perforator&lt;/a&gt; (un programma che aiuta a misurare le prestazioni di applicazioni WPF). Attivando “Draw Software rendering with purple tint” vengono evidenziate in viola le zone che utilizzano il rendering Software di WPF.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Oggi studiando i sorgenti di Snoop ho trovato la soluzione all’enigma:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Snoopelapplicazionescomparsa_12C1/snoop_source_code_screenshot.gif"&gt;&lt;img title="snoop source code screenshot" style="DISPLAY: inline" height="362" alt="snoop source code screenshot" width="549" border="0" src="/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Snoopelapplicazionescomparsa_12C1/snoop_source_code_screenshot.gif" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;In effetti Visual Studio non viene mostrato perchè per qualche arcano motivo quando “snoopato” crasha irrimediabilmente.&lt;/p&gt;
&lt;p&gt;Commentando le righe inerenti al controllo del processo nel file sorgente AppChooser.xaml.cs (cerchiate nello screenshot di sopra) e ricompilando è possibile visualizzare anche Visual Studio tra i processi WPF ma è realmente utilizzabile solamente la funzione Zoomer.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Snoopelapplicazionescomparsa_12C1/snoop_vs.jpg"&gt;&lt;img title="snoop visual studio" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="409" alt="snoop visual studio" width="550" border="0" src="/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Snoopelapplicazionescomparsa_12C1/snoop_vs.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Eseguendo Zoomer su Visual Studio (attivandolo col pulsante con la lente di Snoop) possiamo visualizzare il Property Grid di Cider&lt;/p&gt;
&lt;p&gt;&lt;img title="snoop zoomer e visual studio" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="400" alt="snoop zoomer e visual studio" width="400" border="0" src="/images/blogs_ugidotnet_org/leonardo/WindowsLiveWriter/Snoopelapplicazionescomparsa_12C1/snoop_zoomer_vs.jpg" /&gt; &lt;/p&gt;
&lt;p&gt;Tutto sommato nascondere dal menù di scelta di Snoop Visual Studio è piuttosto comodo in quanto permette di non sbagliarsi e scegliere la propria applicazione, ora vi starete chiedendo: ma l’applicazione scomparsa allora qual’è?&lt;/p&gt;
&lt;p&gt;Ebbene non Visual Studio ma qualsiasi programma che includa nel suo nome “devenv” come ad esempio mydevenv.exe (che stavo per l’appunto sviluppando ma non riuscivo a Snoopare :)&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;P.S. Snoop vuole dire letteralmente ficcanaso&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/leonardo/aggbug/94324.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Leonardo</dc:creator>
            <guid>http://blogs.ugidotnet.org/leonardo/archive/2008/09/27/snoop-e-lrsquoapplicazione-scomparsa.aspx</guid>
            <pubDate>Sat, 27 Sep 2008 01:51:10 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/leonardo/archive/2008/09/27/snoop-e-lrsquoapplicazione-scomparsa.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/leonardo/comments/commentRss/94324.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/leonardo/services/trackbacks/94324.aspx</trackback:ping>
        </item>
    </channel>
</rss>