Dato che parli di OpenSSL, sto solo considerando le librerie che sono compilate in codice macchina. Alcuni di essi potrebbero essere rilevanti per le librerie di livello superiore (chiamate anche moduli), ad es. bytecode python o java, ma non tutti.
How to validate the integrity of a library at run time?
FIPS 140 indica diversi test POST (Power-On Self-Test) che devono essere eseguiti, e questo è un modo abbastanza valido di convalidare una libreria in fase di runtime. Nota che una tale libreria presuppone che tu stia caricando una libreria validata FIPS in primo luogo, quindi sei sicuro che ciò che hai sul disco (prima del caricamento) è la libreria corretta (validata). Analizziamo un paio di vettori di attacco:
- È possibile scaricare una libreria diversa da quella desiderata. Ad esempio, un utente malintenzionato ha manomesso la tua connessione e ti ha fornito la sua libreria invece di quella convalidata FIPS (o invece di una libreria validata / attendibile in un altro modo). Questo può essere evitato firmando la libreria e verificando la firma con una chiave ottenuta da un altro canale. Questa è anche una valida tecnica di mitigazione per ottenere il codice sorgente per una libreria.
- Qualcuno potrebbe manomettere la libreria su disco. Per proteggerti prima hai le autorizzazioni del sistema operativo, e in secondo luogo puoi mantenere un checksum della libreria in una posizione diversa (non sulla stessa macchina poiché un utente malintenzionato potrebbe manomettere il checksum).
- Un utente malintenzionato può manomettere la libreria che è già in memoria del processo. I POST proteggono contro questo in una certa misura. I POST che vengono eseguiti una sola volta proteggono solo contro la manomissione durante il caricamento della memoria, ma è possibile eseguire di tanto in tanto i POST per garantire che non si verifichi alcuna manomissione.
As a result, the library needs to be loaded at a fixed base address to execute the validation.
It can very well be the case that the base address that the library wants to be loaded at is already in use by some other program.
Per niente, i POST fanno normalmente parte del codice della libreria. Sono come test ma fanno parte del codice della libreria stessa. Su un sistema operativo moderno una libreria condivisa utilizzerà PIC (Position Independent Code) che garantirà che tutti i salti siano in posizioni relative.
Inoltre, tutti i sistemi operativi moderni eseguono la mappatura della memoria per ogni processo, quindi la stessa posizione di memoria in due processi raramente corrisponde allo stesso posto nella memoria virtuale (che a sua volta raramente corrisponde alla memoria fisica, sì, c'è un minimo di due mappature in un sistema operativo tipico).
Fare un checksum di una posizione di memoria all'interno di un altro processo è un po 'sciocco. La posizione potrebbe trovarsi in pagine di memoria non continue e sarà necessario trovarne l'ordine e replicarlo. Qualcosa che il kernel sta già facendo per te (il kernel ha la mappa di quella memoria di processo nelle pagine di memoria). Quindi il posto migliore per eseguire il checksum è all'interno del processo che sta caricando la libreria, e dal momento che si potrebbe voler fare quel checksum da diversi processi che caricano quella libreria, il posto migliore per mettere quel codice è all'interno della libreria! Ooops, si rivela essere un test automatico all'accensione (un POST).
Hai menzionato OpenSSL, OpenSSL ha il suo set di POST già integrato, vedi sotto:
OpenSSL FIPS
Il modulo FIPS OpenSSL (l'OpenSSL che è stato convalidato con FIPS) ha diversi POST. Eppure OpenSSL è una libreria verificata FIPS molto particolare, probabilmente è l'unica libreria verificata FIPS che viene in forma di codice sorgente.
Il manuale utente per FIPS OpenSSL (vedere i riferimenti sotto) ha un intero capitolo (capitolo 4) su come ottenere e creare OpenSSL in modo che possa essere considerato FIPS verificato. È interessante notare che copre alcuni dei vettori di attacco annotati all'inizio della risposta. Supponendo che tu abbia un OpenSSL verificato FIPS ora devi chiamare:
FIPS_mode_set()
Una volta caricata la libreria. Questo esegue diversi POST e solo dopo aver eseguito ciò è possibile considerare FIPS OpenSSL come una libreria verificata FIPS. Questi sono diversi POST che verificano l'OpenSSL durante il runtime, i POST sono descritti nella sezione 6.3 del manuale dell'utente. Inoltre, dal momento che OpenSSL è fornito in forma sorgente, puoi anche guardare i POST nel codice.
References: