Sovraccarichi Dell'Amplificatore
I sovraccarichi dell'amplificatore lungamente sono stati riconosciuti come problema nei linguaggi di livello inferiore. Il problema di nucleo è che le informazioni di controllo di flusso di dati e di programma dell'utente sono mescolareate per le prestazioni ed i linguaggi di livello inferiore permettono l'accesso diretto alla memoria di applicazione. La C e C++ sono le due lingue più popolari afflitte con i sovraccarichi dell'amplificatore. In senso stretto, un sovraccarico dell'amplificatore accade quando un programma permette che l'input scriva oltre l'estremità dell'amplificatore assegnato, ma ci sono parecchi problemi collegati che hanno spesso lo stesso effetto. Uno degli la più interessanti è insetti della stringa di disposizione. Un altro incarnation del problema accade quando ad un attacker è permesso scrivere ad una posizione di memoria arbitraria fuori di un allineamento nell'applicazione e mentre, in senso stretto, questo isn’t un sovraccarico classico dell'amplificatore, noi’copertura del ll che qui anche. L'effetto di un sovraccarico dell'amplificatore è qualche cosa da un arresto al attacker che guadagna il controllo completo dell'applicazione e se l'applicazione sta funzionando come utente ad alto livello (radice, coordinatore, o sistema locale), quindi il controllo di intero sistema operativo e di tutti gli altri utenti che attualmente sono aperti la sessione, o entrerà, è nelle mani del attacker. Se l'applicazione in questione è un servizio di rete, il risultato del difetto potrebbe essere una vite senza fine. La prima vite senza fine ben nota del Internet ha sfruttato un amplificatore sorpassato nell'assistente della barretta ed è stata conosciuta come la vite senza fine della barretta del Robert T. Morris (o Morris giusto). Anche se sembrerebbe come se’d impariamo come evitare i sovraccarichi dell'amplificatore poiché uno quasi portato giù il Internet in 1988, noi continua a vedere i frequenti rapporti dei sovraccarichi dell'amplificatore in molti tipi di software. Anche se si potrebbe pensare che la soltanto preda sloppy e trascurata di caduta dei programmatori all'amplificatore sorpassi, il problema è complesso, molte delle soluzioni non sono semplici e chiunque che avesse scritto abbastanza codice di C/C++ quasi certamente ha fatto questo errore. I programmatori anche molto buoni e molto attenti fanno gli errori ed i programmatori migliori sanno facile deve slittare in su e mettere le pratiche difficili solide sul posto interferire gli errori. Lingue AffectedLa C è il linguaggio più comune usato per generare i sovraccarichi dell'amplificatore, seguiti molto attentamente da C++. Esso’s facile generare i sovraccarichi dell'amplificatore quando scrivere in assemblatore dato esso non ha misure di sicurezza affatto. Anche se C++ è inerentemente pericoloso quanto la C, perché è un superset della C, usando la biblioteca standard della mascherina (STL) con cura può notevolmente ridurre il potenziale maltrattare le stringhe. La severità aumentata del compilatore di C++ aiuterà un programmatore a evitare alcuni errori. Il nostro consiglio è che anche se state scrivendo il codice puro di C, usando il compilatore di C++ provocherà il codice più pulito. Le lingue di più alto livello più recentemente inventate sottraggono l'accesso di memoria diretta via dal programmatore, generalmente ad un costo notevole di prestazioni. Le lingue come Java, la C # e di base visivo hanno tipi natali della stringa, allineamenti limit-controllati e generalmente proibiscono l'accesso di memoria diretta. Anche se alcuni direbbero che questo rende i sovraccarichi dell'amplificatore impossibili, esso’s più esatta per dire che i sovraccarichi dell'amplificatore sono molto meno probabili. In realtà, la maggior parte di queste lingue sono effettuate in C/C++ ed i difetti di esecuzione possono provocare i sovraccarichi dell'amplificatore. Un'altra fonte potenziale dei sovraccarichi dell'amplificatore nel codice di più alto livello esiste perché il codice deve infine collegare mediante interfaccia ad un sistema operativo e quel sistema operativo quasi certamente è scritto in C/C++. La C # vi permette di effettuare senza una rete dichiarando le sezioni pericolose; tuttavia, mentre fornisce il interoperability più facile il sistema operativo e le biblioteche di fondo scritti in C/C++, potete fare gli stessi errori che potete in C/C++. Se soprattutto vi programmate nelle lingue di più alto livello, la attività principale per voi deve continuare a convalidare i dati passati alle biblioteche esterne, o potete fungere da condotto ai loro difetti. Anche se’con riferimento ad non andare fornire una lista esauriente delle lingue affected, la maggior parte di più vecchie lingue siamo vulnerabili attenuare i sovraccarichi Il Sin SpiegatoIl incarnation classico di un sovraccarico dell'amplificatore è conosciuto come “fracassare la pila.” In un programma compilato, la pila è usata alle informazioni di controllo della stretta, quali le discussioni, dove l'applicazione deve rinviare una volta esso è fatta con la funzione ed a causa di the.small.number.of registri disponibili sui processor x86, i registri ottengono abbastanza spesso immagazzinati temporaneamente sulla pila. Purtroppo, le variabili che localmente sono assegnate inoltre sono immagazzinate sulla pila. Queste variabili della pila si riferiscono a a volte inesatto come staticamente essendo assegnando, in contrasto con essere memoria dinamicamente assegnata del mucchio. Se sentite qualcuno parlare di un sovraccarico dell'amplificatore statico, che cosa realmente significano è un sovraccarico dell'amplificatore della pila. La radice del problema è che se l'applicazione scrive oltre i limiti di un allineamento assegnato sulla pila, il attacker ottiene specificare le informazioni di controllo. E questo è critico a successo; il attacker desidera modificare i dati di controllo ai valori della sua offerta. Si potrebbe chiedere perchè continuiamo ad usare un sistema ovviamente pericoloso. Abbiamo avuti un'occasione fuoriuscire il problema, almeno in parte, con un'espansione al circuito integrato’64-bit dell'Intel s Itanium, in cui gli indirizzi di ritorno sono immagazzinati in un registro. Il problema è che’d dobbiamo tollerare indietro una perdita significativa di compatibilità ed a partire da questa scrittura, sembra che il circuito integrato x64 probabilmente si concluda sul circuito integrato più popolare. Potete anche chiedere perchè indossiamo appena’la t che tutti migrano al codice che realizza l'allineamento rigoroso che controlla e che respingono l'accesso di memoria diretta. Il problema è quello per molti tipi di applicazioni, le caratteristiche di prestazioni delle lingue di più alto livello non è sufficiente. Una terra centrale deve usare le lingue di più alto livello per le interfacce di alto livello che si interagiscono con le cose pericolose (come gli utenti!), e lingue a livello più basso per il codice di nucleo. Un'altra soluzione deve completamente usare le possibilità di C++ ed usa le biblioteche della stringa ed i codici categoria dell'accumulazione. Per esempio, il web server 6.0 dell'assistente di informazioni del Internet (IIS) ha commutato interamente ad un codice categoria della stringa di C++ per il maneggiamento dell'input ed uno sviluppatore brave lo ha esatto che’la d amputate la sua barretta piccola se dei sovraccarichi dell'amplificatore fossero trovati nel suo codice. A partire da questa scrittura, lo sviluppatore ancora ha sua barretta e nessun bollettino di sicurezza si è pubblicato contro il web server durante i quasi due anni dal relativo rilascio. I compilatori moderni si occupano bene di templatized i codici categoria ed è possibile scrivere il codice molto ad alto rendimento di C++. Abbastanza teoria—ha lasciato’la s considerare un esempio: # includa < stdio.h > svuoti DontDoThis(char * input) strcpy(buf, input); printf("%s\n", buf); argc del main(int, carbone interni * argv[ ]) Fe 12 di 0x0012FEC0 c8 00 Èþ. < - indirizzo
della discussione del buf Ora lasci’la s guardare che cosa accade quando il buf è scritto sopra. Le prime informazioni di controllo sulla pila sono il contenuto del registro basso esteso dell'indicatore (EBP). EBP contiene l'indicatore della struttura e se fuori--un da trabocco accade, EBP sarà troncato. Se il attacker può controllare la memoria a 0x0012fe00 (fuori--un dagli zeri verso l'esterno l'ultimo byte), il programma salta a quella posizione ed esegue il codice attacker-fornito. Se il isn t’di sovraccarico costretto ad un byte, l'articolo seguente per andare è l'indirizzo di ritorno. Se il attacker può controllare questo valore e può disporre abbastanza complessivo in un amplificatore che conoscono la posizione di, voi’con riferimento a guardare un sovraccarico utilizzabile classico dell'amplificatore. Si noti che il doesn t di codice del complessivo (conosciuto spesso come il codice delle coperture perché l'impresa più comune deve invocare lle coperture di ordine’) deve essere disposto nell'amplificatore quella’s che è scritta sopra.’S il caso classico, ma in generale, il codice arbitrario che il attacker ha disposto nel vostro programma potrebbe essere individuato altrove. Indossi’l'introito di t tutta la comodità dal pensare che il sovraccarico sia limitato ad una piccola zona. Una volta che l'indirizzo di ritorno è stato scritto sopra, il attacker ottiene giocare con le discussioni della funzione utilizzabile. Se il programma scrive a c'è ne di queste discussioni prima del rinvio, rappresenta un'occasione per mayhem supplementare. Questo punto diventa importante quando tenendo conto dell'efficacia delle contromisure d'alterazione della pila quale Crispin Cowan’la s Stackguard, l'IBM’la s ProPolice e bandierina’del compilatore del Microsoft la s /GS. Come potete vedere, noi’ve appena dato al attacker almeno tre sensi prendere il controllo della nostra applicazione e questo siamo soltanto in una funzione molto semplice. Se un codice categoria di C++ con le funzioni virtuali è dichiarato sulla pila, quindi la tabella virtuale dell'indicatore di funzione sarà disponibile e questa può condurre facilmente alle imprese. Se una delle discussioni alla funzione sembra essere un indicatore di funzione, che è abbastanza comune in tutto il sistema di windowing (per esempio, sistema o Microsoft Windows della finestra di X), quindi scrivere sopra l'indicatore di funzione prima di uso è un senso evidente deviare il controllo dell'applicazione. Molti, molti altri sensi intelligenti grippare il controllo di un'applicazione esistono che i nostri cervelli deboli possono pensare a. Ci è uno squilibrio fra le nostre abilità come sviluppatori e le abilità e le risorse del attacker. Voi’con riferimento al non conceduto un tempo infinito scrivere la vostra applicazione, ma i attackers non potete avere niente altro da fare con il loro tempo di ricambio copioso che la figura verso l'esterno come fare il vostro codice fa che cosa desiderano. Il vostro codice può proteggere un bene quel’valuable di s abbastanza per giustificare i mesi di sforzo subvert la vostra applicazione. I attackers spendono il moltissimo tempo che imparano circa gli ultimi sviluppi nel causare il mayhem e dispongono dei mezzi come www.metasploit.com dove possono indicare e scattare il loro senso sgranare il codice che fa quasi qualche cosa desiderano mentre funzionando all'interno di una serie di caratteri costretta. Se provate a determinare se qualcosa sia utilizzabile, è altamente probabile che lo otterrete errato. Nella maggior parte dei casi, è soltanto possibile dimostrare che qualcosa è o utilizzabile o che non siete abbastanza astuti (o possibilmente non spendere abbastanza tempo) determinare come scrivere un'impresa. È estremamente raro da potere da dimostrare con tutta la riservatezza affatto che un sovraccarico non è utilizzabile. Il punto di questo diatribe è che la cosa astuta da fare è di riparare appena gli insetti! Ci sono stati periodi multipli che “codificano i miglioramenti di qualità” sono risultato essere difficoltà di sicurezza nella riesaminazione. Questo autore ha speso appena più di tre ore che discutono con una squadra di sviluppo circa se devono riparare un insetto. Il filetto di E-mail ha avuto un totale di otto genti su esso ed abbiamo speso facilmente 20 ore (metà un di persona-settimana) che dibattono se riparare il problema o non perché la squadra di sviluppo ha desiderato la prova che il codice era utilizzabile. Una volta che gli esperti di sicurezza risultassero l'insetto era realmente un problema, la difficoltà è stata valutata ad un'ora di tempo dello sviluppatore e di alcune ore di tempo della prova. Quella’s uno spreco di tempo incredibile. Una volta quando desiderate essere analitici è immediatamente prima della spedizione dell'applicazione. Se un'applicazione è nelle fasi finali,’d gradite potere fare una buona congettura se il problema è utilizzabile giustificare il rischio di regressioni e di destabilizzazione del prodotto. ’S un'idea sbagliata comune che sorpassa negli amplificatori del mucchio è meno utilizzabile dei sovraccarichi, ma questo risulta non essere il caso. La maggior parte delle esecuzioni del mucchio soffrono dallo stesso difetto di base come la pila—i dati dell'utente ed i dati di controllo è mescolareata. Secondo l'esecuzione del allocator di memoria, è spesso possibile convincere il responsabile del mucchio a disporre quattro byte della scelta’del attacker s nella posizione specificata dal attacker. I particolari di come attacare un mucchio sono in qualche modo arcane. Una presentazione recente e chiaramente scritta sul soggetto, “lle imprese certe del mucchio di Windows” dallo shok “Conover” del Matthew & un Oded Horovitz, possono essere trovati a http://cansecwest.com/ csw04/csw04-Oded+Connover.ppt. Anche se il responsabile del mucchio non può subverted per fare un attacker’s che fa un'offerta, i dati nelle ripartizioni contigue possono contenere gli indicatori di funzione, o gli indicatori che saranno usati per redigere le informazioni. Contemporaneamente, sfruttando i trabocchi del mucchio è stato considerato esotico ed i trabocchi—duri del mucchio ora sono alcuni di tipi più frequenti di errori sfruttati. Sinful C/C++ carbone buf[20 ]; gets(buf); carbone buf[20 ]; strcpy(buf, prefisso); buf[MAX_PATH del carbone ]; sprintf(buf, "%s - %d\n", percorso, errno); Esso’s quasi impossibile, tranne in alcuni casi d'angolo, usare sicuro sprintf. Un bollettino critico di sicurezza per Microsoft Windows è stato liberato perché lo sprintf è stato usato in una funzione annotante di mett a punto. Riferiscasi al bollettino MS04-011 per le più informazioni (veda il collegamento “nell'altra sezione” delle risorse). Qui’s un altro favorito: carbone buf[32 ]; Un altro senso causare i problemi è sbagliandosi il conteggio di carattere il conteggio di byte. Se’con riferimento ad occuparsi dei caratteri di ASCII, questi siete lo stesso, ma se’con riferimento ad occuparsi di Unicode, là siete di due byte - un carattere. Qui’s un esempio: _ snwprintf(wbuf, sizeof(wbuf), "%s\n", input); bool conteggio lungo pInFile e unsigned di
CopyStructs(InputFile *) m_pStructs = nuovo Structs[count ]; for(i = 0; i < conteggio; i++) stampante = malloc(sizeof(type) * conteggio); Qui’s un altro senso che un sovraccarico dell'amplificatore può ottenere generato: # definisca MAX_BUF 256 len = strlen(input); corso di //of possiamo usare sicuro strcpy size_t del const MAX_BUF = 256; len = strlen(input); corso di //of possiamo usare sicuro strcpy Sins Relativi Un sin strettamente collegato è trabocchi di numero intero. Se scegliete attenuare i sovraccarichi dell'amplificatore usando la stringa contata che maneggia le chiamate, o state provando a determinare quanta stanza assegnare sul mucchio, l'aritmetica diventa critica alla sicurezza dell'applicazione. Gli insetti della stringa di disposizione possono essere usati per compire lo stesso effetto come sovraccarico dell'amplificatore, ma aren’i sovraccarichi di t allineare. Un insetto della stringa di disposizione è compiuto normalmente senza sorpassare alcuni amplificatori affatto. Una variante su un sovraccarico dell'amplificatore è un illimitato scrive ad un allineamento. Se il attacker può fornirlo l'indice del vostro allineamento ed indossi’la t correttamente convalidano se’s all'interno dei limiti corretti dell'allineamento, designato scrive ad una posizione di memoria del attacker’scelta di s che sarà effettuata. Può tutta la stessa diversione di flusso di programma accadere non soltanto, ma anche il attacker non può dovere interrompere la memoria adiacente, che impedisce tutte le contromisure che potreste avere sul posto contro i sovraccarichi dell'amplificatore. Macchia del modello di sinQui sono i componenti da cercare:
Macchia del sin durante la rassegna di codiceLa macchia del questo sin durante la revisione di codice varia da essere molto facile ad estremamente difficile. Le cose facili da cercare sono uso di stringa pericolosa che maneggia le funzioni. Un'edizione da essere informata di è che potete trovare molti casi di uso sicuro, ma esso’s stata la nostra esperienza che ci sono problemi che si nascondono fra le chiamate corrette. Il codice convertentesi alle chiamate sicuri di uso soltanto ha un tasso molto basso di regressione (dovunque dal 1/10th al 1/100th del normale insetto-ripari il tasso di regressione) e rimuoverà le imprese dal vostro codice. Un buon senso fare questo è ha lasciato il compilatore trovarvi le richieste di funzione pericolose. Se strcpy non definito, strcat, sprintf e funzioni simili, il compilatore vi troverete tutti per. Un problema da essere informato di è che alcuni apps re-hanno effettuato tutta la o una parte biblioteca run-time di C internamente. Un'operazione più difficile sta cercando i sovraccarichi del mucchio. Basicamente, desiderate ad in primo luogo cercate le ripartizioni ed allora esaminate l'aritmetica usata per calcolare la dimensione della memoria di transito. Il metodo migliore generale deve seguire l'utente immesso dai punti di entrata della vostra applicazione con tutte le chiamate di funzione. Essendo informato di che cosa il attacker controlla le marche una differenza grande Tecniche di collaudo per trovare il sinLa lanugine che esamina, che sottopone la vostra applicazione agli input semi-random, è una delle tecniche di collaudo migliori da usare. Provi ad aumentare la lunghezza delle stringhe dell'input mentre osservano il comportamento del app. Qualcosa osservare fuori per è che a volte i disadattamento fra il controllo dell'input provocheranno finestre relativamente piccole del codice vulnerabile. Per esempio, qualcuno potrebbe mettere un controllo in un posto che l'input deve essere meno di 260 caratteri ed allora assegna un amplificatore da 256 byte. Se verificate un input molto lungo, sarà rifiutato semplicemente, ma se colpite esattamente il trabocco, potete trovare un'impresa. Le lunghezze che sono i multipli di due ed i multipli di due più o meno uno troveranno spesso i problemi. Altri trucchi da provare stanno cercando tutto il posto nell'input in cui la lunghezza di qualcosa è utente specificato. Cambi la lunghezza in modo che non abbini la lunghezza della stringa e particolarmente cerchi i termini di possibilità di trabocco—di numero intero dove la lunghezza + 1 = 0 è spesso pericolosa. Qualcosa che dovrte fare quando la prova della lanugine deve generare una configurazione specializzata della prova. Metta a punto le configurazioni spesso hanno asserice quel flusso di programma del cambiamento e li manterrà dal colpire le circostanze utilizzabili. D'altra parte, metta a punto le configurazioni sui compilatori moderni tipicamente contengono la rilevazione più avanzata di corruzione della pila. Secondo il vostri mucchio e sistema operativo, potete anche permettere il controllo più rigoroso di corruzione del mucchio. Un cambiamento che potete desiderare per fare nel vostro codice è che se un'asserzione sta controllando l'input dell'utente, cambi quanto segue da assert(len < MAX_PATH); if(len > = MAX_PATH) Sins Di EsempioLe seguenti entrate, che vengono direttamente dalle vulnerabilità comuni e le esposizioni elencano, o CVE (http://cve.mitre.org), sono esempi dei sovraccarichi dell'amplificatore. Una punta interessante del trivia è quella a partire da questa scrittura, 1.734 entrata di CVE che il sovraccarico “dell'amplificatore del fiammifero” esiste. Una ricerca dei advisories del CERT, che documentano soltanto le vulnerabilità più diffuse e più serie, rende 107 colpi “su sovraccarico dell'amplificatore.” CVE-1999-0042Dalla descrizione di CVE: “Attenui il trabocco in università di esecuzione’de Washington s del IMAP e SCHIOCCHI gli assistenti.“ Questa entrata di CVE è documentata completamente in CERT CA-1997-09 consultivo ed ha coinvolto un sovraccarico dell'amplificatore nella sequenza di autenticazione dell'università di assistenti’di protocollo di accesso di messaggio di Post Office Protocol (SCHIOCCO) e di Internet de Washington s (IMAP). Una vulnerabilità relativa era che l'assistente di E-mail non è riuscito ad effettuare meno privilegio e l'impresa ha assegnato l'accesso della radice ai attackers. Il trabocco ha condotto a sfruttamento diffuso dei sistemi vulnerabili. I controlli di vulnerabilità della rete hanno progettato trovare le versioni vulnerabili di questo assistente hanno trovato i difetti simili nei laboratori SLMail 2.5 de Seattle come segnalato a www.winnetmag.com/Article/ArticleID/9223/9223.html. CVE-2000-0389–CVE-2000-0392Da CVE-2000-0389: “Il trabocco dell'amplificatore nella funzione del krb_rd_req in Kerberos 4 e 5 permette che i attackers a distanza guadagnino i privilegi della radice.” Da CVE-2000-0390: “Il trabocco dell'amplificatore nella funzione di krb425_conv_principal in Kerberos 5 permette che i attackers a distanza guadagnino i privilegi della radice.“ Da CVE-2000-0391: “Il trabocco dell'amplificatore nel krshd in Kerberos 5 permette che i attackers a distanza guadagnino i privilegi della radice.“ Da CVE-2000-0392: “Il trabocco dell'amplificatore in ksu in Kerberos 5 permette che gli utenti locali guadagnino i privilegi della radice.“ Questa serie di problemi nell'esecuzione del MIT del Kerberos è documentata come CERT CA-2000-06 consultivo, ha trovato a www.cert.org/advisories/CA-2000-06.html. Anche se il codice sorgente aveva stato a disposizione di il pubblico per parecchi anni ed il problema ha provenuto dall'uso di stringa pericolosa che maneggia le funzioni (strcat), è stato segnalato soltanto in 2000. CVE-2002-0842, CVE-2003-0095, CAN-2003-0096
Queste vulnerabilità sono documentate in CERT CA-2003-05 consultivo, situato a www.cert.org/advisories/CA-2003-05.html. I problemi sono un insieme di vari trovati da David Litchfield e la sua squadra software srl di sicurezza della generazione seguente. Come divagazione, questo dimostra quello che fa pubblicità ad un'’applicazione di s poichè “unbreakable” non può essere la cosa migliore da fare mentre il sig. Litchfield sta studiando le vostre applicazioni. CAN-2003-0352
Questo trabocco è interessante perché ha condotto a sfruttamento diffuso da due viti senza fine molto distruttive quegli che entrambi hanno causato la rottura significativa sul Internet. Il trabocco era nel mucchio ed è stato provato dal fatto che era possibile costruire una vite senza fine che era molto stabile. Un fattore contribuente era un guasto del principio di meno privilegio: l'interfaccia non dovrebbe essere a disposizione di gli utenti anonimi. Un'altra nota interessante è che le contromisure di trabocco in Windows 2003 hanno degradato l'attacco da escalation del privilegio alla smentita di servizio. Le più informazioni su questo problema possono essere trovate a www.cert.org/advisories/ CA-2003-23.html ed a www.microsoft.com/technet/security/bulletin/MS03-039.asp Punti Di EstinzioneLa strada per attenuare l'estinzione di sovraccarico è lunga e riempita di potholes. Discutiamo un'ampia varietà di tecniche che li aiutano a evitare i sovraccarichi dell'amplificatore ed un certo numero di altre tecniche che riducono i sovraccarichi dell'amplificatore di danni possono causare. Lasci’la s guardare come potete migliorare il vostro codice. Sostituisca La Stringa Pericolosa Che Maneggia Le FunzioniDovreste, al minimo, sostituire le funzioni pericolose come strcpy, lo strcat e lo sprintf con le versioni contate di ciascuna di queste funzioni. Avete un certo numero di scelte di che cosa per sostituirlo con. Tenga presente che le più vecchie funzioni contate hanno problemi dell'interfaccia e vi chiedono di fare l'aritmetica in molti casi per determinare i parametri. I calcolatori aren’la t buona a per la matematica come potreste sperare. Le più nuove biblioteche gradiscono lo strsafe, l'a tubo catodico sicuro (biblioteca run-time di C) che sarà spedito nell'studio visivo del Microsoft (ed è su una pista veloce da diventare la parte del campione dell'ANSI C/C++) e strlcat/strlcpy per * nix. Inoltre dovete prendere la cura con come ciascuna di queste funzioni maneggia il termine ed il troncamento delle stringhe. Alcune funzioni garantiscono il termine nullo, ma più di più vecchie funzioni contate non. L'esperienza del gruppo s’dell'ufficio del Microsoft con la sostituzione della stringa pericolosa che maneggia le funzioni per il rilascio dell'ufficio 2003 era che il tasso di regressione (nuovi insetti causati per la difficoltà) era estremamente basso, in modo da indossa’la t ha lasciato il timore dell'arresto di regressioni voi. Ripartizioni Di VerificaUn'altra fonte dei sovraccarichi dell'amplificatore viene dagli errori aritmetici. Controlli i cicli ed allini gli accessiUn terzo senso che l'amplificatore sorpassa è causato correttamente non sta controllando il termine nei cicli e non correttamente controllando i limiti di allineamento prima di scriva l'accesso. Ciò è una delle zone più difficili e troverete che, in alcuni casi, il problema e terra-frantumarsi -kaboom sono in moduli completamente differenti. Sostituisca gli amplificatori della stringa di C con le stringhe di C++Ciò è più efficace appena del sostituendo le chiamate usuali di C, ma può causare gli importi tremendi di cambiamento nel codice attuale, specialmente se il isn t’di codice già compilato come C++. Dovreste anche essere informati di e capire le caratteristiche di prestazioni dei codici categoria del contenitore di STL. È molto possibile scrivere il codice ad alto rendimento di STL, ma come molte altre funzioni di programmazione, un'omissione di leggere il manuale fine (RTFM) provocherà spesso i risultati meno ottimali. Il rimontaggio più comune deve usare i codici categoria della mascherina di STL std::string o di std:wstring. Sostituisca gli allineamenti statici con i contenitori di STLTutti i problemi celebri sopra si applicano ai contenitori di STL come il vettore, ma un problema supplementare è che non tutte le esecuzioni della costruzione di vector::iterator controllano per vedere se c'è da accesso dei limiti. Questa misura può aiutare e l'autore scopre che quella usando lo STL permette affinchè lui scriva più rapidamente il codice corretto, ma è informato che questo isn’t una pallottola d'argento. Utilizzi Gli Attrezzi Di AnalisiCi sono alcuni buoni attrezzi che vengono sul mercato che analizzano il codice di C/C++ per i difetti di sicurezza; gli esempi includono Coverity, PREfast e Klocwork. Il NET visivo 2005 dell'studio includerà PREfast e un altro attrezzo denominati lingua di annotazione di codice sorgente (SALE) per contribuire a rintracciare giù i difetti di sicurezza quali i sovraccarichi dell'amplificatore. Il senso migliore descrivere il SALE è via il codice. Nell'esempio (silly) che segue, conoscete il rapporto fra i dati e le discussioni di conteggio: i dati sono byte di conteggio di lunghezza. Ma il doesn t’del compilatore sa; vede appena un carbone * e un size_t. vuoto * DoStuff(char * dati, conteggio del size_t) { Questo codice sembra GIUSTO (ignorando il fatto amplificatori statici di rinvio restii, ma humor noi). Tuttavia, se il conteggio è più grande che 32, quindi avete un sovraccarico dell'amplificatore. Una versione annotata SALE di questa interferirebbe l'insetto: vuoto * carbone di DoStuff(__in_ecount(count) * dati,
conteggio del size_t) { Misure Difensive SupplementariConsideri le misure supplementari di defensive lo stesso senso che pensate alle cinture di sicurezza in vostro automobile. Le cinture di sicurezza ridurranno spesso la severità di un arresto, ma ancora non desiderate entrare in un incidente.’S importante notare che per ogni codice categoria principale dell'amplificatore sorpassi il mitigation, circostanze precedentemente utilizzabili che non sono più utilizzabili affatto esiste; e per tutta la data tecnica di mitigation, un attacco sufficiente complesso può sormontare la tecnica completamente. Lasci’la s guardare alcune di loro. Impili La ProtezioneLa protezione della pila è stata aperta la strada a da Crispin Cowan nel suo prodotto di Stackguard ed indipendentemente è stata effettuata da Microsoft come l'interruttore del compilatore di /GS. Al relativo più fondamentale, impili i posti di protezione un valore conosciuto come un canarino sulla pila fra le variabili locali e l'indirizzo di ritorno. Le più nuove esecuzioni possono anche riordinare le variabili per efficacia aumentata. Il vantaggio di questo metodo è che è poco costoso, ha spese generali minime di prestazioni ed ha il beneficio supplementare di rendere gli insetti di corruzione della pila mettere a punto più facili. Un altro esempio è ProPolice, un'estensione dell'accumulazione del compilatore dello gnu (GCC) generata dall'IBM. Tutto il prodotto corrente dovrebbe utilizzare la protezione della pila. Dovreste essere informati che la protezione della pila può essere sormontata da una varietà di tecniche. Se una tabella virtuale dell'indicatore di funzione è scritta sopra e la funzione è denominata prima di ritorno dalla funzione che—i distruttori virtuali sono buoni candidati—allora l'impresa accadrà prima che la protezione della pila possa entrare nel gioco. Pila e mucchio non-executableQuesto le contromisure offre la protezione considerevole contro un attacker, ma può avere un effetto significativo di compatibilità di applicazione. Alcune applicazioni legittimamente compilano ed eseguono il codice in moto, quali molte applicazioni scritte in Java e C #. esso’s anche importante notare che se il attacker può indurre la vostra applicazione a cadere preda ad un ritorno nell'attacco del libc, dove una chiamata di funzione legittima è fatta per compire le estremità nefarious, quindi la protezione di esecuzione alla pagina di memoria può essere rimossa. Purtroppo, la maggior parte dei fissaggi attualmente disponibili non può sostenere questa opzione ed il supporto varia con CPU-type, il sistema operativo e la versione del sistema operativo pure. Di conseguenza, non potete contare su questa protezione che è presente nel campo, ma dovete esaminare con esso avete permesso di accertarsi che la vostra applicazione sia compatibile con una pila e un mucchio non-executable, operando la vostra applicazione su fissaggi che sostengono la protezione dei fissaggi ed il sistema operativo dell'obiettivo regolato per usare la protezione. Per esempio, se state designando Windows.xp come bersaglio, allora assicurisi che fate funzionare tutte le vostre prove su un calcolatore di Windows.xp SP2 usando un processor di AMD Athlon 64 FX. Su Windows, questa tecnologia è denominata protezione dei Data Execution (reparto); è stato conosciuto una volta come nessun esegue (NX). L'assistente 2003 SP1 di Windows inoltre sostiene questa possibilità. I PaX per Linux ed OpenBSD inoltre sostengono la memoria non-executable Altre Risorse
un articolo ha presentato da Hendra Fang
Diniego: Il nostro Web site non è responsabile delle informazioni contenute da questo articolo. Questo articolo in nessun modo riflette le viste, le opinioni, i pensieri o la credenza del personale dell'indice degli articoli. Avviso di traduzione: L'articolo "sovraccarichi dell'amplificatore" è stato tradotto usando un servizio di traduzione automatizzato. Chiediamo scusa francamente per tutti gli errori di traduzione che possono accadere. Grazie per la vostra comprensione. |
|||||
|
|
|