domenica 28 novembre 2010

Sfruttare i punti vulnerabili del software

Come molti sapranno i programmi sono un insieme di regole e istruzioni da applicare in un certo ordine, che in sostanza dicono al computer cosa deve fare. Ci sono molti protocolli per comunicare alle macchine tali istruzioni essi prendono il nome di "linguaggi di programmazione", non esistono linguaggi migliori o peggiori ,ma semplicemente linguaggi adatti per affrontare un determinato problema e linguaggi meno adatti.Possiamo comunque cercare di scindere i linguaggi di programmazione in due ampie categorie, i linguaggi orientati alla macchina e quelli orientati al problema, per questi ultimi il programmatore deve concentrarsi esclusivamente sulla risoluzione del problema , e non deve occuparsi del modo in cui il computer gestisce  realmente i dati e di come li elabora, un tipico esempio di questo linguaggio è il BASIC.Nel caso invece di linguaggi orientati alla macchina, oltre al problema il programmatore deve occuparsi anche dei  dettagli , deve conoscere come i dati sono gestiti nei registri del microprocessore, deve occuparsi della gestione della memoria, del controllo dei tipi di dati e quant'altro, un esempio di questo linguaggio è l' Assembler. Esistono poi soluzioni di compromesso, linguaggi come il "C" , che sono abbastanza astratti per evitare di doversi occupare di dettagli e abbastanza "vicini alla macchina" per riuscire a scrivere programmi veloci , funzionali e flessibili.Qualunque sia il linguaggio scelto per programmare i programmatori sono esseri umani,e talvolta il codice che scrivono non corrisponde esattamente a quello che intendevano fare, e poichè un programma può fare soltanto quello che è scritto nelle sue istruzioni, si aprono delle falle nella sicurezza.Per trovare questi bugs occorre una mente creativa, alcuni errori sono comuni e ovvi, altri meno ovvi danno origine a tecniche di exploit complesse ed applicabili in svariate circostanze. Un errore molto comune è il "fuori di uno", se io vi domandassi quanti paletti sono necessari per completare una recinzione di 100 metri con un paletto ogni 10 metri, molti risponderebbero 10, in realtà ne occorrono 11 in quanto bisogna contare gli spazi e non i paletti.Questi errori raramente vengono rilevati in fase di debug perchè generalmente non si manifestano durante la normale esecuzione, ma con particolari valori di input si verifica l' errore dando origine ad un effetto valanga ,ed un programma apparentemente sicuro diventa vulnerabile. Un altro errore possibile per chi programma in un linguaggio ad alto livello come il C , è il "bufferoverflow", questo bug sfrutta il fatto che in C possiamo definire la dimensione massima di un buffer di dati in fase di programmazione, ma se non si implementa anche un algoritmo di controllo dell' input, i dati in eccesso scritti in quel buffer potrebbero sovrascrivere aree critiche della memoria provocando malfunzionamenti o blocchi ,sfruttando questo bug potrebbe essere possibile scrivere un exploit per prendere il controllo del computer stesso.La maggior parte dei programmatori scrive in linguaggio di alto livello ,e quindi spesso non prende in considerazione parametri come visibilità di variabili in memoria,chiamate allo stack,puntatori di esecuzione, registri ecc.Un hacker che conosca i comandi della macchina di basso livello comprende i meccanismi reali di esecuzione del software, e leggendo il codice compilato del programma ad alto livello potrebbe escogitare un sistema per cambiarne il flusso di esecuzione, questo senza infrangere alcuna regola del programma ma semplicemente utilizzandole in una maniera che non era stata prevista.

Nessun commento:

Posta un commento