Problemi Della Stringa Di Disposizione


  Share  
|


I problemi della stringa di disposizione sono uno dei pochi vero nuovi attacchi da emergere negli ultimi anni. Una delle prime menzioni degli insetti della stringa di disposizione aveva luogo il 23 giugno 2000, in un alberino da Lamagra Argamal (www.securityfocus.com/archive/1/66842); Il Pascal Bouchareine lo ha spiegati più chiaro quasi un mese più successivamente (www.securityfocus.com/archive/1/70552). Un alberino più in anticipo da Mark Slemko (www.securityfocus.com/archive/1/10383) ha notato i principi fondamentali del problema, ma ha mancato la capacità degli insetti della stringa di disposizione di scrivere la memoria.

Come con molti problemi di sicurezza, la causa della radice degli insetti della stringa di disposizione sta fidandosi dell'input user-supplied senza convalida. In C/C++, gli insetti della stringa di disposizione possono essere usati per scrivere alle posizioni di memoria arbitrarie e la funzione più pericolosa è che questa può accadere senza alterare i blocchetti contigui di memoria. Questa possibilità a grana fine permette che un attacker escluda le protezioni della pila e perfino che modifica le parti molto piccole della memoria. Il problema può anche accadere quando le stringhe di disposizione sono lette dall'untrusted la posizione che il attacker controlla. Questa funzione posteriore del problema tende ad essere più prevalente sui sistemi di Linux e di UNIX. Sui sistemi di Windows, le tabelle di stringa di applicazione sono mantenute generalmente all'interno del programma eseguibile, o delle biblioteche di collegamento dinamiche delle risorse (DLLs). Se un attacker può riscrivere l'eseguibile principale o la risorsa DLLs, il attacker può realizzare molti altri attacchi diretti che gli insetti della stringa di disposizione.

Anche se’con riferimento ad non occuparsi di C/C++, attacchi della stringa di disposizione potete ancora condurre ai problemi considerevoli. Il più evidente è che gli utenti possono essere fuorviati, ma in alcune circostanze, un attacker potrebbe anche lanciare gli attacchi scripting del traversa-luogo o dell'iniezione di SQL. Questi possono essere usati per corrompere o trasformare i dati pure.

Lingue Affected

La lingua il più fortemente affected è C/C++. Un attacco riuscito può condurre immediatamente all'esecuzione del codice arbitrario ed alla rilevazione delle informazioni. L'altra t vinta’lingue permette tipicamente l'esecuzione del codice arbitrario, ma altri tipi di attacchi sono possibili come precedentemente notiamo. Il isn t’del Perl direttamente vulnerabile agli specifiers che sono dati dall'input dell'utente, ma esso potrebbe essere vulnerabili se le stringhe di disposizione sono lette dentro dai dati alterati.

Il Sin Ha spiegato

I dati di formattazione per esposizione o immagazzinaggio possono essere un'operazione in qualche modo difficile. Quindi, molti linguaggi di programmazione includono le procedure per riformattare facilmente i dati. Nella maggior parte delle lingue, le informazioni di formattazione sono descritte usando una certa specie di una stringa, denominata la stringa di disposizione. La stringa di disposizione realmente è definita usando la lingua dell'elaborazione dei dati limitata che’la s ha progettato renderla facile descrivere le disposizioni dell'uscita. Ma molti sviluppatori fanno un errore che facile—usano i dati da untrusted gli utenti come la stringa di disposizione. Di conseguenza, i attackers possono scrivere le stringhe nella lingua dell'elaborazione dei dati per causare molti problemi.

Il disegno di C/C++ fa questo particolarmente pericoloso: Il disegno’di C/C++ s lo rende più duro rilevare i problemi della stringa di disposizione e le stringhe di disposizione includono alcuni ordini particolarmente pericolosi (specialmente %n) che non esistono in alcune altre lingue’ della stringa di disposizione di lingue.

In C/C++, una funzione può essere dichiarata per prendere un numero variabile di discussioni specificando un ellipsis (…) come l'ultima (o soltanto) discussione. Il problema è che la funzione che è denominata non ha senso conoscere appena quante discussioni stanno passande dentro. L'insieme delle funzioni più comune per prendere le discussioni di lunghezza variabile è la famiglia del printf: printf, sprintf, snprintf, fprintf, vprintf e così via. Le funzioni larghe del carattere che effettuano la stessa funzione hanno lo stesso problema. Lasci’l'introito di s uno sguardo ad un'illustrazione:

# includa < stdio.h >

argc del main(int, carbone interni * argv[ ])
{
if(argc > 1)
printf(argv[1 ]);

ritorno 0;
}

Roba ragionevolmente semplice. Ora lasci’la s guardare che cosa può andare male. Il programmatore sta invitare l'utente ad entrare in qualche cosa di benigno, quale ciao il mondo. Se gli date una prova,’ll ottenete indietro ciao il mondo. Ora lasci’il cambiamento di s l'input un piccolo—prova %x %x. Su un sistema di Windows.xp usando la linea di ordine di difetto (cmd.exe),’ll ora ottenete quanto segue:

E:\projects\19_sins\format_bug>format_bug.exe "%x %x"
12ffc0 4011e5

Si noti che se’con riferimento ad operare un sistema operativo differente, o state usando una linea di ordine differente interpretatore, potete avere bisogno di di fare alcuni cambiamenti per ottenere questa stringa esatta inserita nel vostro programma ed i risultati probabilmente saranno differenti. Per facilità di uso, potreste mettere le discussioni in uno scritto di coperture o in un file sequenziale.

Che cosa è accaduto? La funzione del printf ha preso una stringa dell'input che la ha indotta a invitare due discussioni per essere spinto sulla pila prima della chiamata della funzione. Gli specifiers di %x vi hanno permesso di leggere la pila, quattro byte alla volta, fino voi’d come. Esso isn’t duro per immaginare che se aveste una funzione più complessa che ha immagazzinato un segreto in una variabile della pila, il attacker allora potrebbe leggere il segreto. L'uscita qui è l'indirizzo della posizione della pila (0x12ffc0), seguito dalla posizione di codice in che la funzione del main() rinvierà. Come potete immaginare, entrambi sono informazione estremamente importanti che stanno fuoriuscendi ad un attacker.

Potete ora domandarsi appena come il attacker usa un insetto della stringa di disposizione per scrivere la memoria. Uno dei meno specifiers usati di disposizione è %n, che scrive il numero di caratteri che dovrebbero essere scritti finora nell'indirizzo della variabile che avete dato come la discussione corrispondente. Qui’s come dovrebbe essere usata:

byte interni unsigned;
printf("%s%n\n", argv[1 ], &bytes);
l'input del printf("Your era long\n, byte dei caratteri di %d");

L'uscita sarebbe:

E:\projects\19_sins\format_bug>format_bug2.exe "un certo input casuale"

Un certo input casuale

Il vostro input era 17 caratteri lunghi

Su una piattaforma con i numeri interi a quattro byte, lo specifier di %n scriverà quattro byte immediatamente e %hn scriverà due byte. Ora i attackers devono calcolare soltanto verso l'esterno come ottenerli all'indirizzo’d come nella posizione adatta nella pila e tweak gli specifiers di larghezza del campo fino a che il numero di byte scritti non sia che cosa’d gradiscono.

Per ora, lasci’appena la s supporre che se permettete che i attackers controllino la stringa di disposizione in un programma di C/C++, è un aspetto di tempo prima che calcolino verso l'esterno come incitarli a fare funzionare il loro codice. Una funzione particolarmente nasty di questo tipo di attacco è quella prima del lancio dell'attacco, possono sondare la pila e correggere in moto l'attacco. Infatti, la prima volta l'autore ha dimostrato questo attacco in pubblico, la ha usata una linea di ordine differente interpretatore che lui’d usata per generare la dimostrazione e lavoro’del didn t. dovuto la flessibilità unica di questo attacco, era possibile correggere il problema e sfruttare l'applicazione di campione con guardare dei pubblici.

La maggior parte delle altre lingue indossano’il supporto di t l'equivalente di uno specifier di disposizione di %n ed aren’la t direttamente vulnerabile all'esecuzione facile del codice attacker-fornito, ma potete funzionamento tranquillo nei problemi. Ci è altro, varianti più complesse su questo attacco che altre lingue sono vulnerabili a. Se i attackers possono specificare una stringa di disposizione per uscita ad una lima o ad una base di dati di ceppo, possono causare i ceppi errati o ingannevoli. Ulteriormente, l'applicazione che legge i ceppi può considerare loro input di fiducia ed una volta che questo presupposto è violato, le debolezze in quanto l'analizzatore’di applicazione s può condurre all'esecuzione del codice arbitrario. Un problema relativo sta includendo i caratteri di controllo nelle lime che di ceppo—i ritorni possono essere usati per cancellare le cose; allinei i terminali può confondere o persino eliminare le tracce’del attacker s.

Ciò dovrebbe andare da sè, ma se un attacker può specificare la stringa di disposizione alimentata a scanf o alle funzioni simili, il disastro è sul senso.

Sinful C/C++

Diverso di molti altri difetti’ll esaminiamo, questo siamo ragionevolmente facili da macchiare come difetto di codice. Esso’s molto semplice:

printf(user_input);
è errato e

printf("%s", user_input);
è corretto.

Una variante sul problema che negligenza di molti programmatori è che non è sufficiente fare correttamente questo soltanto una volta. Ci sono un certo numero di costruzioni comuni di codice in cui potreste usare lo sprintf per disporre una stringa formattata in un amplificatore ed allora slittano in su e fanno questo:

fprintf(STDOUT, err_msg);
Il attacker allora deve mettere soltanto l'input in forma in moda da fuoriuscire gli specifiers di disposizione e nella maggior parte dei casi, questa è una versione molto più facilmente sfruttata perché l'amplificatore del err_msg sarà assegnato frequentemente sulla pila. Una volta che i attackers riescono a camminare sostegno la pila,’ll possono controllare la posizione che è scritta usando l'input dell'utente.

Sins Relativi

Anche se l'attacco più evidente è collegato con un difetto di codice, è una pratica corrente mettere le stringhe di applicazione in lime esterne per gli scopi di internazionalizzazione. Se la vostra applicazione ha sinned non riuscendo a proteggere correttamente la lima, quindi un attacker può fornire le stringhe di disposizione a causa di una mancanza di accesso adeguato della lima.

Un altro sin relativo non sta riuscendo a convalidare correttamente l'input dell'utente. Su alcuni sistemi, una variabile di ambiente specifica le informazioni del locale ed il locale, a sua volta, determina l'indice in cui le lime di language-specifico saranno trovate. Su alcuni sistemi, il attacker ha potuto persino indurre l'applicazione a osservare negli indici arbitrari.

Macchia del modello di sin

Tutta l'applicazione che prende l'utente immette e passaggi ad una funzione di formattazione è potenzialmente al rischio. Un caso molto comune di questo sin accade insieme con le applicazioni che annotano l'input dell'utente. Ulteriormente, alcune funzioni possono effettuare la formattazione internamente.

Macchia del sin durante la rassegna di codice

In C/C++, cerchi le funzioni dalla famiglia del printf. I problemi da cercare sono

printf(user_input);  
fprintf(STDOUT, user_input);

Se vedete una funzione che assomiglia a questa:

fprintf(STDOUT, msg_format, arg1, arg2);

allora necessità di verificare dove la stringa riferita da msg_format è immagazzinata e come esso siete protetti.

Ci sono molte altre chiamate del sistema ed APIs che è inoltre syslog—vulnerabile è un esempio. Qualunque momento vedete una definizione di funzione che include … nella lista di discussione, voi’con riferimento a guardare qualcosa che sia probabile essere un problema.

Molti dispositivi d'esplorazione di codice sorgente, persino quei del lessico gradiscono i RATTI ed il flawfinder, può rilevare questo. Là’s PScan uniforme (www.striker.ottawa.on.ca/~aland/pscan/), che è stata progettata specificamente per questa.

Inoltre sta ricambiando gli attrezzi che possono essere costruiti nel processo della compilazione. Per esempio, là’s Crispin Cowan’s FormatGuard: http://lists.nas.nasa.gov/archives/ext/linux-security-audit/2001/05/msg00030.html

Tecniche di collaudo per trovare il sin

Passi gli specifiers di formattazione nell'applicazione e veda se i valori esadecimali sono restituiti. Per esempio, se avete un'applicazione che prevede un nome di archivio e restituisce un messaggio di errore che contiene l'input quando la lima non può essere trovata, quindi la prova gli che dà la lima chiama come NotLikely%x%x.txt. Se ottenete un messaggio di errore seguendo le linee di "NotLikely12fd234104587.txt non può essere trovato," allora voi appena ha trovato una vulnerabilità della stringa di disposizione.

Ciò è ovviamente in qualche modo dipendente dal linguaggio; dovreste passare negli specifiers di formattazione che sono usati dalla lingua di esecuzione voi’con riferimento a usando almeno. Tuttavia, poiché molti tempi di esecuzione di lingua sono effettuati in C/C++,’d siete saggi anche da introdurre gli ordini della stringa di formattazione di C/C++ rilevare i casi dove la vostra biblioteca di fondo ha una vulnerabilità pericolosa.

Si noti che se l'applicazione è fotoricettore basato ed echeggia il vostro utente immesso di nuovo voi, un'altra preoccupazione sarebbe attacchi scripting del traversa-luogo

Sins Di Esempio

Le seguenti entrate nelle vulnerabilità e nelle esposizioni comuni (CVE) a http:// cve.mitre.org sono esempi dell'iniezione di SQL. Dalle 188 entrate di CVE che le stringhe di disposizione di riferimento, questa è giuste un campione.

CVE-2000-0573

Dalla descrizione di CVE: “Lreply la funzione nei wu-ftpd 2.6.0 e più in anticipo non pulisce correttamente untrusted la stringa di disposizione, che permette che i attackers a distanza eseguano gli ordini arbitrari via l'ordine del LUOGO EXEC.”

Ciò è la prima impresa pubblicamente conosciuta per un insetto della stringa di disposizione. Il titolo dell'alberino di BUGTRAQ sottolinea la severità del problema: “Fornire * ripresa esterna * sradichi almeno da 1994.”

CVE-2000-0844

Dalla descrizione di CVE: “Alcune funzioni che effettuano il sottosistema del locale su UNIX non puliscono correttamente le stringhe utente-iniettate di disposizione, che permette che i attackers locali eseguano gli ordini arbitrari via le funzioni quale gettext e che catopen.”

L'a testo integrale del consultivo originale può essere trovato a www.securityfocus.com/archive/1/80154 e questo problema è particolarmente interessante perché interessa il sistema APIs di nucleo per la maggior parte delle varianti di UNIX (Linux compreso), tranne le varianti del BSD date che la variabile di NLSPATH è ignorata per l'applicazione privilegiata del suid nel BSD. Questo consultivo, come molti advisories di NUCLEO SDI, è scritta particolarmente ed informativa buoni e dà una spiegazione molto completa del problema generale

Punti Di Estinzione

Il primo punto non è mai utente del passaggio immesso direttamente ad una funzione di formattazione ed inoltre è sicuro fare questo ad ogni livello di maneggiamento dell'uscita formattata. Come nota supplementare, le funzioni di formattazione hanno spese generali significative. Guardi la fonte per _ prodotto se’con riferimento ad interessato—esso poteste essere convenienti da scrivere:

fprintf(STDOUT, buf);

La linea preceding del isn t’di codice appena pericoloso, ma esso inoltre consuma i cicli supplementari molto del CPU.

Il secondo punto da prendere è accertarsi che le stringhe di disposizione i vostri usi di applicazione siano lette soltanto dai posti di fiducia e che i percorsi alle stringhe non possono essere controllati dal attacker. Se’con riferimento al codice di scrittura per UNIX e Linux, dopo l'esempio delle varianti e di ignorare del BSD la variabile di NLSPATH, che può essere usata per specificare la lima usaste per i messaggi localizzati, potete fornire una certa difesa approfondita.

Estinzione di C/C++

Là isn’t molto più ad esso che questo:

printf("%s", user_input);

Misure Difensive Supplementari

Controlli e limiti il locale ai valori validi. (per le più informazioni, veda il wheeler s’di David “scriverlo sicuro: Formatti le stringhe e la filtrazione del locale” elencata “nell'altra sezione” delle risorse qui sotto). Indossi’l'uso di t la printf-famiglia delle funzioni se potete evitarli. Per esempio, se voi’con riferimento a usando C++, operatori del flusso di uso preferibilmente:

# includa < lo iostream >  
/
std::cout < < user_input
/

Altre Risorse

ciò è un articolo aggiunto da Hendra Fang


Share  

© 2005-2010 E-articles.info All Rights Reserved - Terms and conditions