Un sistema completamente sicuro appare, fin dall’inizio, virtualmente impossibile da realizzare: del resto abbiamo visto come falle tipo ShellShock si sono propagate addirittura per 20 anni senza nessun tipo di segnalazione.
L’accorgimento di sicurezza più importante resta sempre quello legato al bilanciamento tra rischi ed usabilità del sistema: la regola base nella programmazione “keep it simple”, del resto, va a soddisfare un altro importante requisito.
Tale requisito consente la manutenibilità del codice, a fronte di imporre l’introduzione di dati sempre corretti, completi e verificati. Per esempio, di fronte ad un form di registrazione troppo complesso alcuni utenti tendono a trovare scappatoie per aggirarlo o per inserire arbitrariamente comandi non ammessi.
Questi accorgimenti sono del tutto generici e si applicano indistintamente a Joomla!, WordPress e qualsiasi altro CMS/servizio web basato su PHP, sia che venga ospitato su hosting condiviso, VPS, server dedicato o cloud.
Code injection in PHP: la funzione eval()
La sicurezza di un sistema basato su PHP è legata sempre all’anello più debole della catena che lo fa funzionare, ed è per questo che resta fondamentale mantenere il codice semplice e manutenibile, in modo da limitare gli inevitabili bug, soprattutto in prospettiva.
L’uso della funziona eval è uno dei rischi più concreti per la sicurezza di qualsiasi webapp o sito PHP-based e questo perchè permette l’esecuzione di codice arbitrario mediante un qualsiasi entry-point non filtrato che l’attaccante riesce a reperire.
I due principali sono, di fatto, le caselle di testo dei form e a volte anche gli URL dell’applicativo PHP, che possono essere veicolo di code-injection arbitraria, virtualmente molto pericolosa. Tra gli attacchi più importanti e pericolosi da riconoscere ci sono quelli legati al filesystem, ovvero alla possibilità di manipolare file e directory riservate ed a volte addirittura di iniettare malware all’interno del sistema aggirando i controlli.
Una situazione che in genere provoca problemi è dovuto al mancato controllo delle variabili in ingresso: poichè PHP è stato progettato per consentire l’accesso a livello utente al filesystem, il linguaggio è abiltato a leggere, scrivere e modificare qualsiasi file, modificare connessioni, inviare cron-job massivi e così via. Supponiamo di avere due variabili che prelevano il proprio valore da una POST:
- $username=$_POST[username];
- $userfile=$_POST[‘filename’];
- $homedir=”/home/$username”;
- unlink(“$homedir/$userfile”);
ecco un esempio di cattiva programmazione. Se un utente malintenzionato intuisce la struttura del codice sottostante, potrebbe cancellare file di sistema molto importanti, ad esempio quello delle password.
Come spiegato nella guida ufficiale, il modo più corretto e più sicuro per permettere operazioni del genere è quello di filtrare le variabili in ingresso con opportuni controlli (ad esempio con condizioni if ed espressioni regolari), in modo da assicurarsi che il path da cancellare sia lecito, oltre a loggare le operazioni perché ne possa restare traccia in seguito.
Non ci sono dubbi che il codice si complicherà leggermente, ma è l’unica reale condizione perché si possa parlare di codice PHP più sicuro.
SQL injection, un altro attacco molto diffuso
Uno dei modi più comuni per rubare password dei siti, inoltre, è quello di sfruttare meccanismi di SQL injection ed uno dei canali preferiti in questi casi sono i form di ricerca delle pagine.
Basta anche qui che le variabili in ingresso non siano filtrate adeguatamente dal software perché si possa manipolare arbitrariamente il database o peggio eseguire un dump di password ed username (password che, in molti casi, non vengono neanche criptate e vengono erroneamente memorizzate in chiaro).
Anche in questo caso è necessario verificare che le variabili assumano la forma più adatta all’uso che se ne fa (ad esempio: limitare il numero di caratteri ricercabili, eliminare i tag ed i caratteri non alfabetici), restringendo così le opportunità per un attaccante di violare il sistema.
Lascia un commento