Sto lavorando su una macchina che deve memorizzare nomi utente e password per i vari operatori, tecnici e ingegneri che potrebbero utilizzarla e configurarla. È importante che alcune funzioni siano accessibili solo dagli ingegneri, alcune accessibili da tecnici e ingegneri e alcune siano accessibili a tutti. Ci deve essere anche un modo per aggiungere, rimuovere e cambiare account. Infine, i dati devono essere memorizzati sullo stesso computer fisico dell'applicazione.
È stato suggerito di archiviare semplicemente il nome utente, la password e il livello di privilegio in un file INI sul disco. Questo, ovviamente, è cattivo. Mi piacerebbe utilizzare un sistema più sicuro, con gli obiettivi di un utente con privilegi ridotti:
- Impossibile trovare una copia di testo normale della password di nessuno
- Impossibile eseguire azioni al di fuori del loro ambito di privilegio
Credo di aver raggiunto l'obiettivo numero 1 salendo e cancellando la password, salvando il sale e l'hash sul disco e autenticandomi contro questi valori. Utilizzo il framework .NET e il System.Security.Cryptography.Rfc2898DeriveBytes Schema di hashing PBKDF2 per questo scopo.
Tuttavia, 2 è più difficile, perché memorizzando gli account utente sul disco, è possibile il seguente attacco:
- L'attaccante esegue un backup dello stato corrente dell'applicazione
- L'attaccante reimposta la macchina allo stato pulito / iniziale eliminando i file di backup
- La macchina deve ora fornire un meccanismo per aggiungere account utente, che offre una password di amministratore che viene visualizzata solo alla prima esecuzione
- L'attaccante si offre i privilegi desiderati ed esegue l'azione precedentemente limitata
- L'utente ripristina lo stato precedente della macchina
Non riesco a vedere un modo per aggirare questo attacco. C'è qualcosa che posso fare? In che modo i sistemi di autenticazione completamente offline, come gli account utente di Windows o Linux, sono protetti da questo tipo di attacco?
Mi rendo conto che un utente malintenzionato con questo tipo di accesso potrebbe modificare o ispezionare l'applicazione stessa e potrebbe aggiungere un keylogger fisico o software, ma non è davvero una cosa su cui posso proteggermi, quindi voglio concentrarmi sul meccanismo di autenticazione il più sicuro possibile.