{"id":55039,"date":"2019-09-19T15:21:11","date_gmt":"2019-09-19T14:21:11","guid":{"rendered":"http:\/\/www.alground.com\/site\/?p=55039"},"modified":"2020-03-25T11:34:08","modified_gmt":"2020-03-25T10:34:08","slug":"introduzione-buffer-overflow","status":"publish","type":"post","link":"https:\/\/alground.com\/site\/introduzione-buffer-overflow\/55039\/","title":{"rendered":"Introduzione al buffer overflow"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Punti chiave<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-69fb5b721b092\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-69fb5b721b092\"  aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/alground.com\/site\/introduzione-buffer-overflow\/55039\/#Sfruttamento_del_buffer_overflow\" >Sfruttamento del buffer overflow<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/alground.com\/site\/introduzione-buffer-overflow\/55039\/#Lo_stack\" >Lo stack<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/alground.com\/site\/introduzione-buffer-overflow\/55039\/#Programmazione_orientata_al_ritorno_ROP\" >Programmazione orientata al ritorno (ROP)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/alground.com\/site\/introduzione-buffer-overflow\/55039\/#Mitigazioni_del_buffer_overflow\" >Mitigazioni del buffer overflow<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/alground.com\/site\/introduzione-buffer-overflow\/55039\/#Protezioni_dello_stack\" >Protezioni dello stack<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/alground.com\/site\/introduzione-buffer-overflow\/55039\/#Stack_canaries\" >Stack  canaries<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/alground.com\/site\/introduzione-buffer-overflow\/55039\/#Prevenzione_dellesecuzione_dei_dati\" >Prevenzione dell&#8217;esecuzione dei dati<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/alground.com\/site\/introduzione-buffer-overflow\/55039\/#Randomizzazione_del_layout_dello_spazio_degli_indirizzi\" >Randomizzazione del layout dello spazio degli indirizzi<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/alground.com\/site\/introduzione-buffer-overflow\/55039\/#Convalida_dellinput\" >Convalida dell&#8217;input<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/alground.com\/site\/introduzione-buffer-overflow\/55039\/#Controllo_di_overflow_dellintero\" >Controllo di overflow dell&#8217;intero<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/alground.com\/site\/introduzione-buffer-overflow\/55039\/#Librerie_standard\" >Librerie standard<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/alground.com\/site\/introduzione-buffer-overflow\/55039\/#Buffer_overflow_per_lhacking_etico\" >Buffer overflow per l&#8217;hacking etico<\/a><\/li><\/ul><\/nav><\/div>\n\n<p>Quando si accetta un input esterno, un&#8217;applicazione deve allocare memoria per archiviare tale input.\u00a0Molti linguaggi di programmazione di alto livello lo faranno dietro le quinte, ma alcuni linguaggi (come C \/ C ++) consentono al programmatore di allocare memoria direttamente tramite funzioni come\u00a0<strong>malloc<\/strong>.<\/p>\n\n\n\n<p>Si verifica una vulnerabilit\u00e0 di buffer overflow quando l&#8217;applicazione tenta di archiviare pi\u00f9 dati nella memoria allocata di quanto non vi sia spazio disponibile.\u00a0Ci\u00f2 pu\u00f2 verificarsi per vari motivi, tra cui:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Impossibilit\u00e0 a controllare la lunghezza dell&#8217;input durante la lettura<\/li><li>Essersi dimenticati di allocare spazio per il terminatore null<\/li><li>Lunghezze di input che causano un overflow di numeri interi<\/li><\/ul>\n\n\n\n<p>Indipendentemente dal motivo, se un&#8217;applicazione tenta di scrivere nella memoria oltre l&#8217;intervallo del buffer allocato significa che sta scrivendo nella memoria allocata per altri scopi all&#8217;interno dell&#8217;applicazione.\u00a0A causa della struttura di come la memoria viene allocata all&#8217;interno di un computer, questo pu\u00f2 essere estremamente utile per un utente malintenzionato poich\u00e9 consente di controllare l&#8217;esecuzione del programma.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section4\"><span class=\"ez-toc-section\" id=\"Sfruttamento_del_buffer_overflow\"><\/span>Sfruttamento del buffer overflow<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Lo sfruttamento di una vulnerabilit\u00e0 di overflow del buffer \u00e8 abbastanza semplice.\u00a0Se un programma alloca in modo errato la memoria per l&#8217;input dell&#8217;utente o legge in modo non sicuro i dati in quello spazio di memoria, esiste una vulnerabilit\u00e0.\u00a0Questa vulnerabilit\u00e0 pu\u00f2 essere sfruttata da un hacker semplicemente fornendo un input all&#8217;applicazione pi\u00f9 grande di quanto il buffer allocato sia in grado di contenere.<\/p>\n\n\n\n<p>Il travaso di un buffer con input insignificanti o casuali pu\u00f2 causare semplicemente un errore di segmentazione o un errore nel programma.\u00a0Tuttavia, la struttura dello stack porta a che un exploit buffer ben progettato pu\u00f2 fare molto di pi\u00f9, consentendo a un utente malintenzionato di controllare il flusso di esecuzione ed eseguire codice dannoso sul sistema.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Lo_stack\"><\/span>Lo stack<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Un&#8217;applicazione pu\u00f2 allocare memoria nello stack o nell&#8217;heap.\u00a0Lo stack viene comunemente utilizzato per argomenti di funzione e variabili locali e l&#8217;heap memorizza la memoria dinamica (allocata utilizzando il nuovo comando in C ++).\u00a0Sia lo stack che l&#8217;heap possono essere sfruttati da un attacco di buffer overflow, ma la struttura dello stack lo rende estremamente delicato.<\/p>\n\n\n\n<p>Come suggerisce il nome, lo stack \u00e8 organizzato come uno stack di memoria.\u00a0Lo stack cresce da indirizzi di memoria elevati a indirizzi inferiori.\u00a0La posizione corrente nello stack \u00e8 indicata da una variabile (il puntatore dello stack) che punta alla parte superiore dello stack corrente.\u00a0Man mano che i dati vengono aggiunti o rimossi dallo stack, anche il puntatore dello stack viene aggiornato.<\/p>\n\n\n\n<p>Quando una funzione viene chiamata da un&#8217;altra funzione, le informazioni vengono inviate nello stack per fornire a quella funzione i dati che deve eseguire.\u00a0Questi dati vengono inseriti nello stack nel seguente ordine:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Argomenti della funzione chiamata (in ordine inverso)<\/li><li>L&#8217;indirizzo dell&#8217;istruzione successiva dopo la funzione chiamata ritorna<\/li><li>Variabili locali della funzione chiamata<\/li><\/ol>\n\n\n\n<p>In genere, l&#8217;input dell&#8217;utente a una funzione verr\u00e0 archiviato in una variabile locale, il che significa che verr\u00e0 inserito nello spazio di memoria direttamente sopra l&#8217;indirizzo di ritorno nello stack.&nbsp;Ci\u00f2 \u00e8 utile per un utente malintenzionato che esegue un buffer overflow, poich\u00e9 la memoria che verr\u00e0 sovrascritta da un buffer overflow \u00e8 il puntatore all&#8217;istruzione successiva da eseguire.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Programmazione_orientata_al_ritorno_ROP\"><\/span>Programmazione orientata al ritorno (ROP)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Il fatto che un utente malintenzionato possa sovrascrivere l&#8217;indirizzo di ritorno di una funzione nello stack \u00e8 la base per la programmazione orientata al ritorno (ROP).&nbsp;In ROP, un utente malintenzionato tenta di sfruttare un overflow del buffer che causa il ritorno della funzione vulnerabile in un&#8217;area del programma sotto il controllo dell&#8217;attaccante.<\/p>\n\n\n\n<p>Quest&#8217;area pu\u00f2 essere lo stesso buffer riempito durante l&#8217;attacco o un&#8217;altra area controllata dall&#8217;utente.\u00a0Se ha esito positivo, l&#8217;utente malintenzionato potrebbe essere in grado di guidare l&#8217;applicazione a interpretare l&#8217;input fornito come istruzioni del programma, consentendo all&#8217;utente malintenzionato di eseguire codice dannoso.<\/p>\n\n\n\n<p>Una delle principali sfide di ROP \u00e8 lo sviluppo di codice che fa ci\u00f2 che l&#8217;attaccante vuole in uno spazio limitato.\u00a0Per questo motivo, il codice generalmente cerca di chiamare funzioni di libreria che sono gi\u00e0 all&#8217;interno dello spazio di memoria del processo per abbreviare il codice necessario.\u00a0Alcune mitigazioni contro ROP si concentrano sul rendere questa funzionalit\u00e0 pi\u00f9 difficile da localizzare ed eseguire per lo shellcode.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section5\"><span class=\"ez-toc-section\" id=\"Mitigazioni_del_buffer_overflow\"><\/span>Mitigazioni del buffer overflow <span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Lo sfruttamento del buffer overflow pu\u00f2 rappresentare una grave minaccia per la sicurezza poich\u00e9 il codice ROP inserito ed eseguito dall&#8217;attaccante viene eseguito con gli stessi privilegi dell&#8217;applicazione sfruttata.&nbsp;Tuttavia, esistono diversi mezzi per prevenire o mitigare gli attacchi di buffer overflow.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Protezioni_dello_stack\"><\/span>Protezioni dello stack<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>L&#8217;obiettivo primario di un exploit buffer overflow \u00e8 consentire all&#8217;attaccante di eseguire codice arbitrario tramite una programmazione orientata al ritorno.\u00a0Diverse soluzioni sono state implementate per aiutare a proteggere contro il POR.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Stack_canaries\"><\/span>Stack  canaries <span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Affinch\u00e9 ROP sia possibile nello stack, l&#8217;utente malintenzionato deve essere in grado di riscrivere un indirizzo di ritorno della funzione per puntare a una regione di memoria sotto il loro controllo.\u00a0Il concetto \u00e8 stato inventato per aiutare a rilevare e prevenire questo.\u00a0<\/p>\n\n\n\n<p>Uno stack canary \u00e8 un valore noto al programma che viene inserito prima dell&#8217;indirizzo di ritorno nello stack.\u00a0Prima che ritorni una funzione, viene verificato il valore del canary e viene generato un errore se non \u00e8 corretto (indicando che si \u00e8 verificato un attacco di overflow del buffer).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Prevenzione_dellesecuzione_dei_dati\"><\/span>Prevenzione dell&#8217;esecuzione dei dati<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>La programmazione orientata al ritorno si basa sull&#8217;input dell&#8217;utente interpretato dal programma per essere interpretato come dati da interpretare come codice.\u00a0Ci\u00f2 \u00e8 possibile perch\u00e9 i dati e le informazioni di controllo sono spesso intrecciati nello stack senza confini chiari.<\/p>\n\n\n\n<p>Data Execution Prevention (DEP) contrassegna alcune aree della memoria come non eseguibili.\u00a0Questo aiuta a proteggere dal buffer overflow  poich\u00e9, anche se l&#8217;attaccante pu\u00f2 modificare un indirizzo di ritorno per puntare al proprio shellcode, non verr\u00e0 eseguito dal programma.\u00a0Tuttavia, DEP pu\u00f2 essere aggirato da un attacco return-to-libc, rendendo necessaria la randomizzazione del layout dello spazio degli indirizzi (ALSR).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Randomizzazione_del_layout_dello_spazio_degli_indirizzi\"><\/span>Randomizzazione del layout dello spazio degli indirizzi<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>La maggior parte delle applicazioni sono progettate per essere orientate agli oggetti, con applicazioni che fanno un uso pesante di librerie condivise che importano nel loro spazio di memoria.&nbsp;Mentre le funzioni di queste librerie condivise sono utili per legittimare il codice, sono utili anche per ROP.<\/p>\n\n\n\n<p>La randomizzazione del layout dello spazio degli indirizzi (ASLR) \u00e8 progettata per rendere pi\u00f9 difficile per un utente malintenzionato trovare le funzioni di libreria di cui ha bisogno.\u00a0Invece di importare le funzioni di libreria per impostare gli indirizzi in ogni applicazione, ASLR randomizza dove verr\u00e0 importata una particolare libreria.\u00a0Ci\u00f2 rende il POR pi\u00f9 difficile, poich\u00e9 l&#8217;aggressore deve trovare una libreria in memoria prima di poter utilizzare le sue funzioni.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Convalida_dellinput\"><\/span>Convalida dell&#8217;input<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Gli attacchi di buffer overflow  sono causati quando un utente malintenzionato scrive pi\u00f9 dati su un blocco di memoria rispetto allo spazio allocato dall&#8217;applicazione per tali dati.\u00a0Ci\u00f2 \u00e8 possibile per una serie di motivi, ma il pi\u00f9 comune \u00e8 l&#8217;uso di letture illimitate che leggono fino a quando non viene trovato un terminatore nullo sull&#8217;input.\u00a0Utilizzando letture a lunghezza fissa progettate per adattarsi allo spazio buffer allocato, un&#8217;applicazione pu\u00f2 essere resa immune dagli attacchi di buffer overflow.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Controllo_di_overflow_dellintero\"><\/span>Controllo di overflow dell&#8217;intero<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>I buffer overflow possono anche essere abilitati da vulnerabilit\u00e0 di overflow dei numeri interi.\u00a0Ci\u00f2 si verifica quando la lunghezza del valore memorizzato in una variabile \u00e8 maggiore di quella che la variabile pu\u00f2 contenere, causando la caduta dei bit pi\u00f9 significativi che non si adattano.\u00a0Di conseguenza, un input molto grande pu\u00f2 essere interpretato come avente una lunghezza pi\u00f9 breve a causa di un overflow, causando il dimensionamento del buffer allocato.\u00a0<\/p>\n\n\n\n<p>Il controllo degli overflow dei numeri interi nelle lunghezze di input \u00e8 importante per la protezione dagli attacchi del buffer overflow.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Librerie_standard\"><\/span>Librerie standard<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Mentre C ++ consente a uno sviluppatore di allocare manualmente la memoria per l&#8217;input dell&#8217;utente, ci\u00f2 non significa che sia sempre una buona idea farlo.\u00a0La libreria di modelli standard C ++ (STL) ha funzioni (come le stringhe) che gestiscono correttamente la gestione della memoria dietro le quinte.\u00a0Il passaggio \u00e8 un modo semplice per mitigare la minaccia di vulnerabilit\u00e0 di buffer overflow.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"section8\"><span class=\"ez-toc-section\" id=\"Buffer_overflow_per_lhacking_etico\"><\/span>Buffer overflow per l&#8217;hacking etico<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>I buffer overflow sono una semplice vulnerabilit\u00e0 che pu\u00f2 essere facilmente sfruttata ma anche risolta facilmente.\u00a0Tuttavia, anche oggi, il software contiene vulnerabilit\u00e0 sfruttabili di buffer overflow.\u00a0Nell&#8217;ottobre 2018,\u00a0in Whatsapp \u00e8 stata scoperta\u00a0una\u00a0<a href=\"https:\/\/www.alground.com\/origin\/?s=whatsapp\"><strong>vulnerabilit\u00e0 di buffer overflow <\/strong><\/a>che ha consentito l&#8217;uso della vulnerabilit\u00e0 se un utente aveva appena risposto a una chiamata o una videochiamata.\u00a0<\/p>\n\n\n\n<p>Queste vulnerabilit\u00e0 meritano sicuramente una verifica quando si esegue un hack etico e devono essere corrette nel codice il pi\u00f9 rapidamente possibile.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quando si accetta un input esterno, un&#8217;applicazione deve allocare memoria per archiviare tale input.\u00a0Molti linguaggi di programmazione di alto livello lo faranno dietro le quinte, ma alcuni linguaggi (come C \/ C ++) consentono al programmatore di allocare memoria direttamente tramite funzioni come\u00a0malloc. Si verifica una vulnerabilit\u00e0 di buffer overflow quando l&#8217;applicazione tenta di archiviare [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":55047,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"pmpro_default_level":"","footnotes":""},"categories":[387,1916],"tags":[],"class_list":{"0":"post-55039","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-guide-sicurezza","8":"category-how-to","9":"pmpro-has-access"},"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/alground.com\/site\/wp-content\/uploads\/2019\/09\/buffer-overflow-evid.jpg","wps_subtitle":"Il buffer overflow \u00e8 uno dei pi\u00f9 conosciuti bug della programmazione. Ma \u00e8 ancora il pi\u00f9 usato dagli attacker","_links":{"self":[{"href":"https:\/\/alground.com\/site\/wp-json\/wp\/v2\/posts\/55039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alground.com\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alground.com\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alground.com\/site\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/alground.com\/site\/wp-json\/wp\/v2\/comments?post=55039"}],"version-history":[{"count":0,"href":"https:\/\/alground.com\/site\/wp-json\/wp\/v2\/posts\/55039\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alground.com\/site\/wp-json\/wp\/v2\/media\/55047"}],"wp:attachment":[{"href":"https:\/\/alground.com\/site\/wp-json\/wp\/v2\/media?parent=55039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alground.com\/site\/wp-json\/wp\/v2\/categories?post=55039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alground.com\/site\/wp-json\/wp\/v2\/tags?post=55039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}