Come impedire l'utilizzo di DLL dannose nelle chiamate LoadLibrary o DllImport (.NET)

1

Ho una situazione in cui i file dannosi vengono copiati nella directory di installazione di alcuni software e il software caricherà quei file quando effettuerà una chiamata a LoadLibrary o DllImport (in .NET land).

Se il tuo software funziona con i privilegi di amministratore, un P / Invoke su una DLL dannosa può essenzialmente eseguire qualsiasi codice in modo elevato, utilizzando la tua applicazione come veicolo per farlo per suo conto.

Molte di queste tecniche possono essere trovate in questa domanda: Metodi per iniettare DLL dannose per l'esecuzione del file ed eseguirlo

Quello che sto chiedendo è come, come sviluppatore di software, puoi prevenire questo tipo di attacco? Se voglio importare user32.dll nella mia applicazione ed effettuare una chiamata, come faccio a sapere che sta caricando quello giusto?

Nel Documentazione LoadLibrary suggerisce che questo problema esiste ma non spiega esattamente cosa si dovrebbe fare per evitarlo a tutti i costi.

Do not use the SearchPath function to retrieve a path to a DLL for a subsequent LoadLibrary call. The SearchPath function uses a different search order than LoadLibrary and it does not use safe process search mode unless this is explicitly enabled by calling SetSearchPathMode with BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE. Therefore, SearchPath is likely to first search the user’s current working directory for the specified DLL. If an attacker has copied a malicious version of a DLL into the current working directory, the path retrieved by SearchPath will point to the malicious DLL, which LoadLibrary will then load.

Una soluzione semplice come controllare se il file si trova in un percorso di ricerca che non ti aspetti (come ad esempio il tuo eseguibile) non funziona molto bene perché il nome dell'assembly può essere cambiato e un reindirizzamento sul posto.

UPDATE : questo articolo su Dynamic-Link La sicurezza della libreria spiega bene le cose, tuttavia, tutte queste tecniche possono essere aggirate facilmente con lo stesso processo di copia dei file dannosi. Ho visto Reindirizzamento DLL utilizzato per reindirizzare a malware file pure. Temo che anche gli approcci programmatici possano fallire perché le tue applicazioni possono essere comunque modificate per caricare ancora i file dannosi.

Tutte le applicazioni Windows sono destinate a contenere questo difetto di sicurezza?

    
posta BrutalDev 24.10.2016 - 17:14
fonte

2 risposte

3

.NET ha un DefaultDllImportSearchPathsAttribute puoi usare su una base per invocazione o per assembly per forzare LoadLibrary a ottenere solo la DLL da posizioni "sicure".

[assembly: DefaultDllImportSearchPaths(DllImportSearchPath.System32)] 
    
risposta data 17.03.2017 - 00:41
fonte
2

È possibile firmare DLL e altri binari (vedere qui per come verificare la firma).

Se non lo sono, o se non vuoi andare in quel modo, ma sai quale libreria si suppone caricare, puoi verificare il checksum della libreria prima di caricarla. Acquisire un blocco di lettura nella libreria e rilasciarlo solo dopo con successo nel caricarlo; in questo modo, eviti la piccola possibilità di un attacco di gara (sostituendo la DLL dopo il checksum ma prima del caricamento).

Ma sì, è necessario caricare la libreria utilizzando il percorso completo esplicito, altrimenti un utente malintenzionato può semplicemente inserire una DLL con lo stesso nome in qualsiasi directory che viene controllata prima di quella corretta. Quindi:

  • ottieni il percorso completo
  • blocca il file
  • verifica la sua firma
  • carica il file
  • sblocca il file
  • schiuma, risciacquo, ripetizione per le altre DLL
risposta data 24.10.2016 - 17:49
fonte

Leggi altre domande sui tag