28
Programmazione Sicura Programmazione Sicura A cura di Orlando Bassotto

Programmazione Sicura A cura di Orlando Bassotto

Embed Size (px)

Citation preview

Page 1: Programmazione Sicura A cura di Orlando Bassotto

Programmazione SicuraProgrammazione Sicura

A cura di

Orlando Bassotto

Page 2: Programmazione Sicura A cura di Orlando Bassotto

RoadmapRoadmap

L'importanza della protezione del codice

Panoramica generale sui rischi

Validazione dell'input

Azioni di prevenzione

Conclusione

Risorse

Page 3: Programmazione Sicura A cura di Orlando Bassotto

L'importante e' proteggersiL'importante e' proteggersi

Page 4: Programmazione Sicura A cura di Orlando Bassotto

Cosa proteggere?Cosa proteggere?

Applicazioni per il trattamento di dati sensibili

Applicazioni amministrative (Utilizzate da root o Administrator)

Servizi di rete (Daemons, servizi, non escludendo CGI)

Applicazioni con elevazione di privilegi (SUID)

Page 5: Programmazione Sicura A cura di Orlando Bassotto

Pitfall comuniPitfall comuni

Incuria nell'analisi del codice da parte dello sviluppatore stesso

Mancanza di auditing del codice (dovuti a costi e tempi di sviluppo)

Trasporto dei dati insicuro Fattori esterni

Noncuranza da parte dell'amministratore di sistema Noncuranza da parte degli utenti

Page 6: Programmazione Sicura A cura di Orlando Bassotto

L'ambiente UNIXL'ambiente UNIX

Page 7: Programmazione Sicura A cura di Orlando Bassotto

L'ambiente UNIXL'ambiente UNIX

Presenta una forma di autenticazione basata su login e password.

Utilizza una tipologia di controllo DAC, basata su permessi di lettura, scrittura, esecuzione distinti tra utente, gruppo e altro.

Ogni utente ha un user id ed un group id numerico, puo' appartenere a piu' gruppi.

Permette l'elevazione dei privilegi utilizzando lo SUID bit sull'eseguibile.

Page 8: Programmazione Sicura A cura di Orlando Bassotto

L'ambiente UNIXL'ambiente UNIX

Caratteristiche dei processi UNIX

Identificati mediante un PID (Process Identifier) Privilegi di esecuzione mediante UID e GID. Limitazione nell'uso delle risorse Parametri di scheduling (priorita', policy di

scheduling, etc) Root del filesystem (ambiente chrooted) Permessi creazione file mediante umask Variabili d'ambiente

Page 9: Programmazione Sicura A cura di Orlando Bassotto

L'ambiente UNIXL'ambiente UNIX

Ogni processo ha una set di credenziali che descrivono i suoi privilegi

RUID, RGID: UID e GID dell'utente che esegue il processo

EUID, EGID: UID e GID effettivi per ogni controllo di privilegio

SUID, SGID: UID e GID salvati, utilizzati per effettuare l'elevazione di privilegi.

FSUID, FSGID: UID e GID utilizzati per i controlli su filesystem. (Solo Linux)

Page 10: Programmazione Sicura A cura di Orlando Bassotto

SUID: Perche'?SUID: Perche'?

Alcune applicazioni necessitano di particolari privilegi per poter compiere azioni che come utenti 'regolari' non possono eseguire.

L'applicazione dovrebbe switchare dal suo RUID al SUID impostato solo per il tempo strettamente necessario per poi perdere definitivamente i privilegi.

L'acquisizione e la perdita di privilegi e' un fattore fondamentale dal punto della sicurezza.

Page 11: Programmazione Sicura A cura di Orlando Bassotto

RischiRischi

Penetrazione nel sistema

Sottrazione, modifica o distruzione di informazioni riservate

Utilizzo illecito del sistema

Distributed Denial of Service

Infezione da parte di virus

Page 12: Programmazione Sicura A cura di Orlando Bassotto

Validazione dell'inputValidazione dell'input

Page 13: Programmazione Sicura A cura di Orlando Bassotto

Cosa validare?Cosa validare?

Parametri da linea di comando

Variabili d'ambiente

File descriptors

Contenuto dei file

Input da applicazioni WEB (specialmente CGI)

Encoding dei caratteri (UTF-8, etc)

Page 14: Programmazione Sicura A cura di Orlando Bassotto

Parametri da linea di comandoParametri da linea di comando

Vettore degli argomenti non totalmente trustable

Buffer overflow Format string o bad parsing Boundary check

Page 15: Programmazione Sicura A cura di Orlando Bassotto

Variabili d'ambienteVariabili d'ambiente

Variabili di inizializzazione (es. LD_PRELOAD)

Variabili global-scope (es. IFS, PATH)

Page 16: Programmazione Sicura A cura di Orlando Bassotto

File descriptorsFile descriptors

Controllo dei file descriptors ereditati dai processi figli.

Dirottamento dell'output di un programma (es. stdout dirottato su /etc/passwd)

Page 17: Programmazione Sicura A cura di Orlando Bassotto

Contenuto dei fileContenuto dei file

Ulteriore minaccia della corretta interpretazione dell'input

Stessi problemi inerenti alla validazione dei parametri da riga di comando

Page 18: Programmazione Sicura A cura di Orlando Bassotto

Input da applicazioni WEBInput da applicazioni WEB

Decoding dell'URI Corretta interpretazione degli headers Corretta interpretazione logica degli

argomenti Encoding dei caratteri

Page 19: Programmazione Sicura A cura di Orlando Bassotto

Encoding dei caratteriEncoding dei caratteri

Sequenze non valide Codifica Unicode/ISO10646 Multibyte strings Piu' codifiche possibili per la stessa sequenza

di caratteri

Page 20: Programmazione Sicura A cura di Orlando Bassotto

Azioni di prevenzioneAzioni di prevenzione

Page 21: Programmazione Sicura A cura di Orlando Bassotto

Azioni di prevenzioneAzioni di prevenzione

Corretta gestione dei dati sensibiliOrdine e tipo delle variabili locali (es. array nello stack)Variabili signed ed unsignedFunzioni di copia boundary checked (es. snprintf al posto di sprintf, strncpy al posto di strcpy, etc)

Page 22: Programmazione Sicura A cura di Orlando Bassotto

Azioni di prevenzioneAzioni di prevenzione

Mantenimento dei privilegi fino a che strettamente necessari

Utilizzo di funzioni o librerie error-proof Sistemi di protezione compile-time

StackGuard come patch di gccPropolice come preparser dei sorgentiLint come sistema di prevenzione da

errori generici

Page 23: Programmazione Sicura A cura di Orlando Bassotto

Auditing del codiceAuditing del codice

Errori concettuali Errori di implementazione Errori 'umani' Ricerca di vulnerabilita' successive alla

stesura del codice

Page 24: Programmazione Sicura A cura di Orlando Bassotto

ConclusioniConclusioni

Page 25: Programmazione Sicura A cura di Orlando Bassotto

ConclusioniConclusioni Non dare niente per scontato, entrare in un'ottica

paranoica.

Analizzare come vulnerabilita' note siano state exploitate.

Pensare ai possibili contesti di utilizzo del programma.

Limitare l'uso di risorse il piu' possibile.

Negare per default e concedere solo cio' che e' ammesso.

Fare attenzioni alle possibili race-conditions.

Meglio un controllo in piu' che uno in meno.

Page 26: Programmazione Sicura A cura di Orlando Bassotto

RisorseRisorse

Sikurezza - http://sikurezza.org

Mailing List - [email protected]

Security Focus - http://www.securityfocus.com

Open Web Application Security Project - http://www.owasp.org

Secure Programming for Linux and Unix HOWTO di David A. Wheeler

Page 27: Programmazione Sicura A cura di Orlando Bassotto

RingraziamentiRingraziamenti

Yvette Agostini ([email protected])

Marco Valleri ([email protected])

Fabio Pietrosanti ([email protected])

Stefano Zanero ([email protected])

Fabio Busatto ([email protected])

Andrea Cocito ([email protected])

Page 28: Programmazione Sicura A cura di Orlando Bassotto

RiferimentiRiferimenti

Orlando Bassotto

[email protected]