Le Insidie delle Linee di Comando
Le linee di comando possono sembrare strane, specialmente su Windows, ma la verità è che la maggior parte dei sistemi operativi ha implementato questo metodo in modi che possono generare problemi di sicurezza. Questo articolo esplorerà, sezione per sezione, le problematiche legate a questa convenzione ampiamente adottata, in cui il primo argomento di una linea di comando di un processo è riservato per rappresentare il nome del processo.
Un Retaggio del Passato
Quando un programma viene avviato, riceve argomenti da linea di comando che sono accessibili dall'interno del programma stesso. Questo è uno dei primi pezzi di informazione disponibili all'avvio di un programma e rappresenta un meccanismo chiave per modificare il flusso di esecuzione del software.
Consideriamo la famiglia di chiamate di sistema definite in POSIX, adottate sia dai sistemi Unix-based che da DOS/Win32. Ad esempio, la funzione definita richiede il percorso completo dell'applicazione da eseguire e un vettore con gli argomenti da passare al programma. Questa specifica stabilisce che se un programma viene eseguito con successo, verrà invocato tramite una certa chiamata.
Condizioni da Rispettare
Secondo gli standard C, quando un programma viene chiamato, devono essere rispettate tre condizioni: il valore di ritorno deve essere non negativo, il puntatore deve essere nullo e, se il numero di argomenti è maggiore di zero, la stringa puntata deve rappresentare il nome del programma chiamato. Questa ultima condizione può sorprendere, poiché il nuovo processo conosce già il proprio nome. Tuttavia, è una decisione progettuale che consente al processo creato di comportarsi in modo diverso a seconda di come viene chiamato.
Un Design Controverso
Da una prospettiva moderna, questa pratica sembra indesiderabile, poiché rende il software meno prevedibile. Negli anni '70 e '80, quando le risorse informatiche erano limitate, minimizzare la duplicazione era più ragionevole. Oggi, tuttavia, lo spazio su disco non è più un problema, come dimostra macOS Sonoma, dove due comandi simili sono eseguiti da file separati. Inoltre, se due programmi sono così simili da giustificare la loro fusione in un unico file, è davvero necessario avere due nomi distinti?
Problemi di Implementazione
Anche se si accetta il principio, l'implementazione stessa è discutibile. Perché fornire informazioni sul nome del programma invocato come parte degli argomenti del processo, che dovrebbero essere impostati dal processo chiamante? Se il codice del nuovo processo fa affidamento su questa informazione, è a rischio se non viene popolata correttamente. Ciò potrebbe portare a problemi di sicurezza.
Windows e la Sua Implementazione
Sorprendentemente, Windows è il sistema operativo che si avvicina di più a una soluzione migliore. Le sue chiamate API per creare nuovi processi non consentono di impostare il nome del programma; lo impostano automaticamente in base al percorso fornito. Tuttavia, ci sono ancora modi per impostare manualmente il nome del programma.
Ignorare il Nome del Programma
Indipendentemente dalla posizione sull'argomento, il nome del programma è una realtà con cui dobbiamo convivere. Quando si effettuano chiamate, le prime due condizioni sono gestite dal sistema operativo, ma l'ultima riguardante il nome del programma non lo è. Poiché il chiamante ha il controllo completo, è possibile ignorare questa richiesta, portando a potenziali problemi di sicurezza.
Esempi di Manipolazione
Manipolare il nome del programma è semplice e non influisce sulla maggior parte delle esecuzioni. Tuttavia, ha implicazioni di sicurezza. Ad esempio, un attaccante può sfruttare questa vulnerabilità per ingannare il software di sicurezza, utilizzando comandi comuni per scaricare payload esterni. La logica di rilevamento di software come Microsoft Defender Antivirus può essere ingannata se il nome del programma viene manipolato.
Inganno degli Analisti
In contesti aziendali, gli analisti di sicurezza esaminano gli avvisi generati dagli strumenti di sicurezza. Il comando associato all'attività è una chiave per determinare se un avviso debba essere indagato. Se un attaccante riesce a far sembrare che un comando dannoso sia innocuo, può sfuggire all'attenzione degli analisti.