Cos’è l’iniezione di codice e come puoi evitarlo
Vulnerabilità di iniezione di codice è un termine generale che descrive le vulnerabilità che possono essere sfruttate da un utente malintenzionato per iniettare ed eseguire codice dannoso.
Questa vulnerabilità si verifica di solito a causa della mancanza di convalida dei dati non attendibili. Le applicazioni che valutano direttamente il codice senza prima convalidarlo sarebbero vulnerabili a questo tipo di attacco.
L’iniezione di codice viene talvolta confusa con altre vulnerabilità come l’iniezione di comandi. Va notato che l’iniezione di codice è un diverso tipo di vulnerabilità, per cui un utente malintenzionato sta iniettando codice invece di comandi del sistema operativo. Ciò significa che per quanto riguarda le vulnerabilità di iniezione del codice, l’attaccante è limitato dalla funzionalità del linguaggio dell’applicazione.
Limitazioni degli attaccanti
Quando si sfruttano tali vulnerabilità, gli aggressori sono limitati dalla funzionalità del linguaggio dell’applicazione (come PHP / Python). Tuttavia, nella maggior parte dei casi, l’utente malintenzionato potrebbe essere in grado di sfruttare la funzionalità dell’interprete per passare dall’iniezione di codice all’iniezione di comando.
Ad esempio, se un utente malintenzionato inietta codice PHP in un’applicazione Web, l’utente malintenzionato sarebbe limitato dalle funzionalità disponibili dall’interprete PHP. Quando si verifica l’attacco injection, l’interprete PHP eseguirà il codice iniettato e dipenderà dalla funzionalità dell’interprete, un utente malintenzionato potrebbe sfruttare le funzioni di esecuzione del programma disponibili in PHP come system() o shell_exec per eseguire i comandi di sistema.
L’impatto di un’iniezione di codice
L’impatto che un attacco riuscito avrebbe può variare a seconda di diversi fattori come il linguaggio utilizzato dall’applicazione, le funzionalità disponibili dall’applicazione, ecc.
Tuttavia, nella maggior parte dei casi, un attacco riuscito potrebbe compromettere completamente la riservatezza, l’integrità e la disponibilità dell’applicazione e dei suoi dati.
Esempio
Immagina un’applicazione web che passa dati non attendibili, come l’input dell’utente a una funzione PHP eval (). La funzione eval () valuta semplicemente una stringa come codice PHP purché abbia una sintassi PHP valida e termina con un punto e virgola.
<?php
backup backup = “”;
$input = _ _GET;
eval (“\backup backup = \ input input;”);
?>
Poiché l’applicazione passa l’input dell’utente nella pericolosa funzione PHP eval() e non viene eseguita alcuna convalida, l’applicazione sarebbe vulnerabile agli attacchi di iniezione di codice.
Un utente malintenzionato potrebbe sfruttare questa debolezza fornendo l’input 1; phpinfo (); come mostrato di seguito:
https://example.com/index.php?arg=1;https://example.com/index.php?arg=1; phpinfo();
Esegui comandi di sistema OS
Dopo aver verificato la vulnerabilità, un utente malintenzionato potrebbe procedere con l’esecuzione di comandi di sistema sfruttando le funzioni dell’interprete che consentono l’esecuzione dei comandi. In questo caso, viene utilizzata la funzione system ().
https://example.com/index.php?arg=1;https://example.com/index.php?arg=1; system (‘whoami’);
Il comando whoami stampa il nome utente dell’utente corrente quando viene richiamato. Ciò significa che quando l’applicazione
passa l’input dell’utente alla funzione eval (), l’interprete PHP eseguirà il comando whoami sul sistema operativo sottostante
.
Una volta che l’attaccante può eseguire comandi di sistema, potrebbe procedere con l’acquisizione di una shell interattiva sul sistema vulnerabile
ed eseguire altri attacchi contro altri sistemi all’interno della rete interna del sistema compromesso.
Prevenzione
Indipendentemente dalla lingua utilizzata, le vulnerabilità di iniezione del codice possono essere evitate seguendo le best practice
descritte di seguito:
- Evitare di valutare dati non attendibili
◦ A meno che non sia strettamente necessario, non valutare direttamente i dati non attendibili utilizzando funzioni non sicure come eval (). * Trattare tutti i dati come non attendibili
◦ Si noti che i dati non attendibili non si riferiscono solo agli input forniti tramite moduli HTML. Le informazioni controllate dagli utenti, come i cookie, le intestazioni delle richieste HTTP e i file caricati, devono essere considerate non attendibili.
- Convalida dati non attendibili
◦ Convalidare sempre l’input dell’utente sul lato server.
◦ Se l’utente deve inviare input in un formato specifico come data, codice postale, numeri, e-mail
indirizzo, ecc., assicurarsi che l’input dell’utente corrisponda al formato previsto.
◦ Se l’applicazione prevede un valore all’interno di un insieme limitato di opzioni, seguire un approccio whitelist e assicurarsi che
l’input inviato sia una delle opzioni consentite.
- Indurire l’interprete
◦ Ad esempio, la funzionalità dell’interprete PHP dovrebbe essere limitata alla funzionalità minima necessaria per il funzionamento dell’applicazione. Ciò potrebbe rendere molto più difficile per gli aggressori eseguire comandi di sistema. Ad esempio, le funzioni di esecuzione del programma PHP potrebbero essere disabilitate modificando il php.file ini.
- Analisi statica
◦ Eseguire attività di analisi statica per identificare le vulnerabilità relative alla valutazione non sicura.
- VAPT
◦ Eseguire regolarmente attività di valutazione delle vulnerabilità e test di penetrazione per identificare e mitigare tali debolezze.