2. Chi sono?
Sviluppatore PHP dal 2000
Fondatore & CTO di Skebby
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
3. Chi sono?
Sviluppatore PHP dal 2000
Fondatore & CTO di Skebby
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
4. Chi sono?
Sviluppatore PHP dal 2000
Fondatore & CTO di Skebby
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
5. Attivit` “underground”
a
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
6. Sommario
1 Introduzione
Race condition
Un esempio in un’applicazione tradizionale
Race condition in applicazioni web
2 Race condition in PHP
Analisi di un’applicazione vulnerabile
Individuazione automatica di race condition
Vulnerabilit` legate alle race
a
3 Exploiting di una race condition
Realizzazione di un attacco
Soluzioni per evitarle
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
7. Introduzione Race condition in PHP Exploiting Race condition Esempio Applicazioni web
Race condition
Cosa sono?
Comportamento anomalo dovuto ad una dipendenza tra
eventi temporali non previsti
Si verificano se il risultato di alcuni passi di computazione
dipende dall’ordine con cui lo scheduler imposta l’esecuzione
dei singoli thread
Nascono da un uso improprio di risorse condivise da parte di
uno o pi` processi che non usano appropriati meccanismi di
u
sincronizzazione
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
8. Introduzione Race condition in PHP Exploiting Race condition Esempio Applicazioni web
Esempio di Race condition
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
9. Introduzione Race condition in PHP Exploiting Race condition Esempio Applicazioni web
Esempio di Race condition
Possibili interleaving
x=1
y = 12
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
10. Introduzione Race condition in PHP Exploiting Race condition Esempio Applicazioni web
Esempio di Race condition
Possibili interleaving
x=1
y = 12
x=1
y=6
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
11. Introduzione Race condition in PHP Exploiting Race condition Esempio Applicazioni web
Concorrenza nelle applicazioni web
Le applicazioni web sono composte tipicamente da differenti
script che eseguono un task sequenziale ben definito
Gli script possono accedere a risorse condivise (es., database)
Istanze multiple degli script sono eseguite concorrentemente
Le race condition sono un problema ben noto ma il loro
impatto sulle applicazioni web non ` stato esplorato a fondo
e
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
12. Introduzione Race condition in PHP Exploiting Race condition Esempio Applicazioni web
Concorrenza nelle applicazioni web
Le applicazioni web sono composte tipicamente da differenti
script che eseguono un task sequenziale ben definito
Gli script possono accedere a risorse condivise (es., database)
Istanze multiple degli script sono eseguite concorrentemente
Le race condition sono un problema ben noto ma il loro
impatto sulle applicazioni web non ` stato esplorato a fondo
e
Problema
I programmatori web non considerano le loro applicazioni come
entit` multi-thread o multi-processo
a
Esecuzioni parallele impreviste possono portare a
comportamenti inattesi
Le primitive di sincronizzazione sono usate raramente
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
13. Introduzione Race condition in PHP Exploiting Race condition Esempio Applicazioni web
Funzionamento delle applicazioni web
Richiesta singola
browser web
richiesta pagina
server web
nuovo processo/thread
interprete
script
DB query
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
14. Introduzione Race condition in PHP Exploiting Race condition Esempio Applicazioni web
Funzionamento delle applicazioni web
Richieste multiple in parallelo
browser web1 browser web2
richiesta pagina richiesta pagina
server web
nuovo processo/thread nuovo processo/thread
interprete interprete
script script
query DB query
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
15. Introduzione Race condition in PHP Exploiting Race condition Esempio Applicazioni web
Funzionamento delle applicazioni web
Richieste multiple in parallelo
browser web1 browser web2
richiesta pagina richiesta pagina
server web
nuovo processo/thread nuovo processo/thread
interprete interprete
script
accesso concorrente al script
DB
query DB query
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
16. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
PHP - risorse condivise
Sessioni => accesso gestito correttamente da PHP
Filesystem => ci deve pensare il programmatore (es, flock)
Database => ci deve pensare il programmatore
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
17. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
PHP - risorse condivise
Sessioni => accesso gestito correttamente da PHP
Filesystem => ci deve pensare il programmatore (es, flock)
Database => ci deve pensare il programmatore
Sessioni in PHP
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
18. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Esempio script vulnerabile
1 $query = mysql_query(’SELECT credito FROM Utente ’
.’WHERE id = ’. $id);
2 $riga = mysql_fetch_assoc($query);
3 if($riga[’credito’] >= 80) {
4 <esecuzione dell’operazione di trasferimento credito>
5 $nuovoCredito = $riga[’credito’] - 80;
6 mysql_query(’UPDATE Utente SET credito = ’ . $nuovoCredito
.’ WHERE id = ’ . $id);
7 }
P1 P2 Database
Linea Dati Linea Dati ID Credito
50 450
12 100
96 750
35 110
... ...
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
19. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Esempio script vulnerabile
1 $query = mysql_query(’SELECT credito FROM Utente ’
.’WHERE id = ’. $id);
2 $riga = mysql_fetch_assoc($query);
3 if($riga[’credito’] >= 80) {
4 <esecuzione dell’operazione di trasferimento credito>
5 $nuovoCredito = $riga[’credito’] - 80;
6 mysql_query(’UPDATE Utente SET credito = ’ . $nuovoCredito
.’ WHERE id = ’ . $id);
7 }
P1 P2 Database
Linea Dati Linea Dati ID Credito
2 (id: 12, credito: 100) ⊥ ⊥ 50 450
12 100
96 750
35 110
... ...
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
20. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Esempio script vulnerabile
1 $query = mysql_query(’SELECT credito FROM Utente ’
.’WHERE id = ’. $id);
2 $riga = mysql_fetch_assoc($query);
3 if($riga[’credito’] >= 80) {
4 <esecuzione dell’operazione di trasferimento credito>
5 $nuovoCredito = $riga[’credito’] - 80;
6 mysql_query(’UPDATE Utente SET credito = ’ . $nuovoCredito
.’ WHERE id = ’ . $id);
7 }
P1 P2 Database
Linea Dati Linea Dati ID Credito
2 (id: 12, credito: 100) ⊥ ⊥ 50 450
4 (id: 12, credito: 100) 1 ⊥ 12 100
96 750
35 110
... ...
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
21. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Esempio script vulnerabile
1 $query = mysql_query(’SELECT credito FROM Utente ’
.’WHERE id = ’. $id);
2 $riga = mysql_fetch_assoc($query);
3 if($riga[’credito’] >= 80) {
4 <esecuzione dell’operazione di trasferimento credito>
5 $nuovoCredito = $riga[’credito’] - 80;
6 mysql_query(’UPDATE Utente SET credito = ’ . $nuovoCredito
.’ WHERE id = ’ . $id);
7 }
P1 P2 Database
Linea Dati Linea Dati ID Credito
2 (id: 12, credito: 100) ⊥ ⊥ 50 450
4 (id: 12, credito: 100) 1 ⊥ 12 100
4 (id: 12, credito: 100) 2 (id: 12, credito: 100) 96 750
35 110
... ...
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
22. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Esempio script vulnerabile
1 $query = mysql_query(’SELECT credito FROM Utente ’
.’WHERE id = ’. $id);
2 $riga = mysql_fetch_assoc($query);
3 if($riga[’credito’] >= 80) {
4 <esecuzione dell’operazione di trasferimento credito>
5 $nuovoCredito = $riga[’credito’] - 80;
6 mysql_query(’UPDATE Utente SET credito = ’ . $nuovoCredito
.’ WHERE id = ’ . $id);
7 }
P1 P2 Database
Linea Dati Linea Dati ID Credito
2 (id: 12, credito: 100) ⊥ ⊥ 50 450
4 (id: 12, credito: 100) 1 ⊥ 12 100
4 (id: 12, credito: 100) 2 (id: 12, credito: 100) 96 750
5 (id: 12, nuovo: 20) 4 (id: 12, credito: 100) 35 110
... ...
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
23. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Esempio script vulnerabile
1 $query = mysql_query(’SELECT credito FROM Utente ’
.’WHERE id = ’. $id);
2 $riga = mysql_fetch_assoc($query);
3 if($riga[’credito’] >= 80) {
4 <esecuzione dell’operazione di trasferimento credito>
5 $nuovoCredito = $riga[’credito’] - 80;
6 mysql_query(’UPDATE Utente SET credito = ’ . $nuovoCredito
.’ WHERE id = ’ . $id);
7 }
P1 P2 Database
Linea Dati Linea Dati ID Credito
2 (id: 12, credito: 100) ⊥ ⊥ 50 450
4 (id: 12, credito: 100) 1 ⊥ 12 20
4 (id: 12, credito: 100) 2 (id: 12, credito: 100) 96 750
5 (id: 12, nuovo: 20) 4 (id: 12, credito: 100) 35 110
6 (id: 12, nuovo: 20) 4 (id: 12, credito: 100) ... ...
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
24. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Esempio script vulnerabile
1 $query = mysql_query(’SELECT credito FROM Utente ’
.’WHERE id = ’. $id);
2 $riga = mysql_fetch_assoc($query);
3 if($riga[’credito’] >= 80) {
4 <esecuzione dell’operazione di trasferimento credito>
5 $nuovoCredito = $riga[’credito’] - 80;
6 mysql_query(’UPDATE Utente SET credito = ’ . $nuovoCredito
.’ WHERE id = ’ . $id);
7 }
P1 P2 Database
Linea Dati Linea Dati ID Credito
2 (id: 12, credito: 100) ⊥ ⊥ 50 450
4 (id: 12, credito: 100) 1 ⊥ 12 20
4 (id: 12, credito: 100) 2 (id: 12, credito: 100) 96 750
5 (id: 12, nuovo: 20) 4 (id: 12, credito: 100) 35 110
6 (id: 12, nuovo: 20) 4 (id: 12, credito: 100) ... ...
⊥ ⊥ 6 (id: 12, nuovo: 20)
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
25. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Architettura per la rilevazione di race condition
Individuazione di race condition relative al database
Applicazione Web
Analizzatore Query interdipendenti
Off-line
Logger di query
Euristiche
DB Race
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
26. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Analizzatore off-line
Idea
registrare le query SQL eseguite dall’applicazione
le query interdipendenti possono portare ad una race condition
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
27. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Analizzatore off-line
Idea
registrare le query SQL eseguite dall’applicazione
le query interdipendenti possono portare ad una race condition
Algoritmo per l’identificazione di query interdipendenti
Query registrate: Q = q1 , q2 , . . . , qn
∀q ∈ Q calcolo degli insiemi use(q) e def(q)
Identificazione query interdipendenti:
(qi , qj ) ∈ Q 2 : use(qi ) ∩ def(qj ) = ∅ ∧ i < j
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
28. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Analizzatore off-line
Idea
registrare le query SQL eseguite dall’applicazione
le query interdipendenti possono portare ad una race condition
Algoritmo per l’identificazione di query interdipendenti
Query registrate: Q = q1 , q2 , . . . , qn
∀q ∈ Q calcolo degli insiemi use(q) e def(q)
Identificazione query interdipendenti:
(qi , qj ) ∈ Q 2 : use(qi ) ∩ def(qj ) = ∅ ∧ i < j
Query1 Query2
SELECT credito UPDATE Utente = usati
FROM Utente SET credito = 20 = definiti
WHERE id = 12; WHERE id = 12;
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
29. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Euristiche
Alcune condizioni presenti nelle clausole WHERE possono portare
a falsi positivi:
Query1 Query2
SELECT id DELETE = usati
FROM Sessione FROM Sessione = definiti
WHERE scadenza <= 123; WHERE scadenza > 123;
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
30. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Euristiche
Alcune condizioni presenti nelle clausole WHERE possono portare
a falsi positivi:
Query1 Query2
SELECT id DELETE = usati
FROM Sessione FROM Sessione = definiti
WHERE scadenza <= 123; WHERE scadenza > 123;
Soluzioni
Interrogazione dinamica del DB intersecando le due condizioni
presenti nelle clausole WHERE (→ efficiente ma non
completo)
Constraint solver (→ risposta completa ma poco efficiente e
non supporta tutti i costrutti SQL)
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
31. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Il tool realizzato
Caratteristiche
Implementato per applicazioni PHP, il modulo di analisi `
e
indipendente dal linguaggio
Sono analizzate le interazioni tra istanze multiple dello stesso
script
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
32. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Il tool realizzato
Caratteristiche
Implementato per applicazioni PHP, il modulo di analisi `
e
indipendente dal linguaggio
Sono analizzate le interazioni tra istanze multiple dello stesso
script
Race condition trovate
Applicazione Categoria Query Race
Drupal 7.0 CMS 13416 63 (3)
phpBB 3.0.8 forum 3136 58 (4)
WordPress 3.1 blog/CMS 3729 82 (3)
Magento 1.5.0.1 carrello virtuale 9453 61 (2)
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
33. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Race condition relative alla sicurezza
Tipo di vulnerabilit`
a
Dipendenti dalle applicazioni, alcuni esempi:
Risorse limitate
Voti multipli su sondaggi
Raggiro delle protezioni contro il brute forcing
Elusione dei controlli anti-flooding
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
34. Introduzione Race condition in PHP Exploiting Esempio Rilevazione automatica Vulnerabilit`
a
Race condition relative alla sicurezza
Tipo di vulnerabilit`
a
Dipendenti dalle applicazioni, alcuni esempi:
Risorse limitate
Voti multipli su sondaggi
Raggiro delle protezioni contro il brute forcing
Elusione dei controlli anti-flooding
Race condition in applicazioni closed-source
Individuazione dei pattern di programmazione e di race
condition dall’interfaccia pubblica
Analisi di due applicazioni reali per l’invio di SMS, entrambe
sono risultate vulnerabili
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
35. Introduzione Race condition in PHP Exploiting Realizzazione di un attacco Contromisure
Come realizzare un attacco
Obiettivo
Per sfruttare una race condition ` necessario che le richieste
e
vengano processate dal web server quasi contemporaneamente
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
36. Introduzione Race condition in PHP Exploiting Realizzazione di un attacco Contromisure
Come realizzare un attacco
Obiettivo
Per sfruttare una race condition ` necessario che le richieste
e
vengano processate dal web server quasi contemporaneamente
Fattori che influenzano la riuscita di un attacco
Interleaving scelto dallo scheduler
Carico attuale del sistema
Latenza introdotta dalla rete
Tempo necessario al server per la creazione della connessione
Tempo impiegato per l’elaborazione dei dati ricevuti dal client
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
37. Introduzione Race condition in PHP Exploiting Realizzazione di un attacco Contromisure
Strategie per realizzare un attacco 1/2
Strategia base - “Parallela”
Viene creato un thread per ogni richiesta da effettuare
Viene inviato tutto il corpo della richiesta HTTP
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
38. Introduzione Race condition in PHP Exploiting Realizzazione di un attacco Contromisure
Strategie per realizzare un attacco 1/2
Strategia base - “Parallela”
Viene creato un thread per ogni richiesta da effettuare
Viene inviato tutto il corpo della richiesta HTTP
Strategia “2-fasi”
Nella prima fase viene creato un thread per ogni richiesta e
viene effettuata la connessione al server web
Nella seconda fase viene inviata tutta la richiesta HTTP
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
39. Introduzione Race condition in PHP Exploiting Realizzazione di un attacco Contromisure
Strategie per realizzare un attacco 1/2
Strategia “2-fasi ottimizzata”
Nella prima fase viene creato un thread per ogni richiesta
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
40. Introduzione Race condition in PHP Exploiting Realizzazione di un attacco Contromisure
Strategie per realizzare un attacco 1/2
Strategia “2-fasi ottimizzata”
Nella prima fase viene creato un thread per ogni richiesta
Viene effettuata la connessione al server web
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
41. Introduzione Race condition in PHP Exploiting Realizzazione di un attacco Contromisure
Strategie per realizzare un attacco 1/2
Strategia “2-fasi ottimizzata”
Nella prima fase viene creato un thread per ogni richiesta
Viene effettuata la connessione al server web
Su ogni connessione viene inviata la richiesta HTTP ad
eccezione dell’ultimo carattere con flush dei dati
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
42. Introduzione Race condition in PHP Exploiting Realizzazione di un attacco Contromisure
Strategie per realizzare un attacco 1/2
Strategia “2-fasi ottimizzata”
Nella prima fase viene creato un thread per ogni richiesta
Viene effettuata la connessione al server web
Su ogni connessione viene inviata la richiesta HTTP ad
eccezione dell’ultimo carattere con flush dei dati
Viene inviato l’ultimo carattere: LF per una GET o l’ultimo
byte del request body per una POST
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
43. Introduzione Race condition in PHP Exploiting Realizzazione di un attacco Contromisure
Strategie per realizzare un attacco 1/2
Strategia “2-fasi ottimizzata”
Nella prima fase viene creato un thread per ogni richiesta
Viene effettuata la connessione al server web
Su ogni connessione viene inviata la richiesta HTTP ad
eccezione dell’ultimo carattere con flush dei dati
Viene inviato l’ultimo carattere: LF per una GET o l’ultimo
byte del request body per una POST
Confronto tra le strategie - 100 richieste HTTP
Strategia Ritardo Min. Ritardo Max. Ritardo Medio
Parallela 8.537 ms 7039.140 ms 2538.249 ms
2-fasi 6.353 ms 3023.917 ms 1217.697 ms
2-fasi ottimizzata 1.468 ms 2932.940 ms 903.534 ms
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
44. Introduzione Race condition in PHP Exploiting Realizzazione di un attacco Contromisure
Come si risolve il problema?
Premessa
Mysql dalla versione 3.23 fino alla versione 5.5.4 ha avuto come
engine di default MyISAM che non supporta le transazioni
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
45. Introduzione Race condition in PHP Exploiting Realizzazione di un attacco Contromisure
Come si risolve il problema?
Premessa
Mysql dalla versione 3.23 fino alla versione 5.5.4 ha avuto come
engine di default MyISAM che non supporta le transazioni
MyISAM
LOCK TABLES => problemi prestazioni, lock intera tabella
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
46. Introduzione Race condition in PHP Exploiting Realizzazione di un attacco Contromisure
Come si risolve il problema?
Premessa
Mysql dalla versione 3.23 fino alla versione 5.5.4 ha avuto come
engine di default MyISAM che non supporta le transazioni
MyISAM
LOCK TABLES => problemi prestazioni, lock intera tabella
GET LOCK() => permette per` un solo lock per connessione
o
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
47. Introduzione Race condition in PHP Exploiting Realizzazione di un attacco Contromisure
Come si risolve il problema?
Premessa
Mysql dalla versione 3.23 fino alla versione 5.5.4 ha avuto come
engine di default MyISAM che non supporta le transazioni
MyISAM
LOCK TABLES => problemi prestazioni, lock intera tabella
GET LOCK() => permette per` un solo lock per connessione
o
InnoDB
START TRANSACTION => transazioni ACID
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP
48. Introduzione Race condition in PHP Exploiting Realizzazione di un attacco Contromisure
Come si risolve il problema?
Premessa
Mysql dalla versione 3.23 fino alla versione 5.5.4 ha avuto come
engine di default MyISAM che non supporta le transazioni
MyISAM
LOCK TABLES => problemi prestazioni, lock intera tabella
GET LOCK() => permette per` un solo lock per connessione
o
InnoDB
START TRANSACTION => transazioni ACID
SELECT ... FOR UPDATE => per bloccare altri lettori prima
delle select
http://phpday.it - #phpday - davide@skebby.com Race condition in applicazioni PHP