La risposta a questa domanda dipenderà in larga misura da diversi fattori, tra cui la toolchain utilizzata e l'architettura di destinazione. Per motivi di semplicità, limiterò questa risposta all'Arduino Uno e al microcontrollore AVR ATMega328.
tl; dr: Sì, è possibile, ma solo se includi WriteFlashByte()
o WriteFlashPage()
nella tua fonte e se l'autore dell'attacco ha accesso alla tua fonte o accesso fisico al tuo dispositivo.
Exploit di buffer overflow
Gli exploit di overflow del buffer sono abbastanza semplici. L'idea generale è di scrivere un payload del shellcode in una posizione nota nello stack e sovrascrivere l'indirizzo di ritorno in modo che punti a tale shellcode. Questo funziona perché l'architettura x86 consente l'esecuzione dalla ram. Questo non è l'unico exploit di questo tipo, ma è molto comune.
Perché l'architettura è importante
L'architettura AVR8 (quella utilizzata da ATMega micro su Arduino) è ciò che è noto come Harvard Architecture . La parte importante da notare qui è che nell'architettura di Harvard la "memoria di istruzioni" o "memoria di programma" è completamente indipendente dalla "memoria di dati". Nell'architettura AVR8 la memoria del programma è implementata in Flash, la memoria dati è implementata in SRAM e le istruzioni possono essere recuperate ed eseguite solo dalla memoria Flash. Ciò significa che l'exploit di overflow del buffer sopra descritto non funzionerà. È possibile ignorare l'indirizzo di ritorno, ma l'indirizzo che si modifica verrà letto da Flash e non da SRAM. Ora, si potrebbe pensare che ciò renderebbe impossibile un exploit di overflow del buffer, ma non lo fa.
exploit di overflow del buffer AVR8
Poiché l'unico modo per eseguire codice su un ATMega328 è quello di eseguire dalla memoria Flash, dovremo inserire il nostro shellcode nella memoria Flash. Qui , troverai un'appnote con le informazioni necessarie sulla lettura / scrittura sulla memoria flash. Quindi, ora sappiamo che in realtà è possibile scrivere un payload per programmare la memoria durante il runtime, ma c'è un problema. L'unico modo per scrivere i dati sul flash è utilizzare WriteFlashByte()
o WriteFlashPage()
e l'unico modo per utilizzare tali funzioni è che siano già nella memoria Flash per quel dispositivo. Tuttavia, non solo il dispositivo deve essere programmato con una di queste funzioni, ma è necessario conoscere anche l'indirizzo in cui tale funzione risiede in memoria. Esistono due modi per scoprire queste informazioni:
- Compilare la fonte utilizzando gli identici flag , quindi utilizzare
avr-objdump
per determinare se queste funzioni sono presenti e in quale indirizzo risiedono.
- Leggi il contenuto della memoria Flash presente sul micro, quindi usa
avr-objdump
per determinare se queste funzioni sono presenti e in quale indirizzo risiedono. Notare che se i bit di blocco sono impostati, potrebbe non essere possibile leggere il contenuto della memoria Flash.
Se non hai accesso alla fonte, o non puoi leggere la memoria flash per scaricarla, un exploit di overflow del buffer di questo tipo sarebbe quasi impossibile.