Certificato di firma codice interno su Windows

3

Sto cercando di migliorare la difesa in profondità su un sistema, principalmente chiudendo alcuni buchi nelle DLL iniettate. Alcune applicazioni installate sul sistema fanno sì che le DLL di supporto (ad esempio estensioni della shell, BHO, ecc.) Vengano caricate nei processi. Sfortunatamente, molti di questi non sono stati compilati con flag di attivazione ASLR / DEP. Dato che i processi interessati sono i principali obiettivi di sfruttamento, ho eseguito manualmente il patching del supporto in modo che le cosiddette catene ROP "universali" non possano essere sfruttate.

Un effetto collaterale delle mie modifiche è che molti componenti ora hanno firme di codice non valide. Questo non sembra aver rotto nulla, ma mi piacerebbe ri-firmare con un certificato installato localmente, utilizzando una sorta di certificato di origine personale come genitore. Come bonus, posso approfittare del flag force integrity.

Quali passi dovrei fare per fare quanto segue?

  1. Crea e installa un certificato di origine, con un certificato secondario (intermedio?) per la firma del codice.
  2. Elimina i certificati esistenti dai binari.
  3. Firma nuovamente i binari con il nuovo certificato.

Non ho mai veramente incasinato l'archivio di certificati su Windows, oltre a poche incursioni nel controllo di quelle esistenti o l'installazione di Burp CA, quindi sono un po 'perso qui. OpenSSL è una buona opzione per generare i certificati oppure esiste una soluzione specifica per Windows? Quali strumenti sono ideali per la firma di nuovi binari?

    
posta Polynomial 16.02.2014 - 19:21
fonte

1 risposta

4

Probabilmente vorrai utilizzare lo strumento di firma del codice come parte di Visual Studio e probabilmente makecert.exe sarà più facile da usare per la generazione di certificati. Dovrai assicurarti di ottenere il modello di certificato appropriato, altrimenti la firma del codice fallirà. Una buona fonte di informazioni può essere trovata qui: link

Se si memorizza la chiave di firma del codice localmente, la sicurezza netta acquisita è piuttosto bassa. Vorrai almeno spostarlo su una macchina sicura, o eventualmente memorizzarlo su una VM, su un disco rimovibile, crittografato e mai connesso. Il problema con questo è che ogni volta che un'applicazione carica la DLL, Windows tenterà di convalidare la firma e prova a verificare che il certificato non sia stato inserito in un elenco di revoche, il che significa che una chiamata in uscita verso una posizione sconosciuta, causando timeout di blocco, che portano a prestazioni terribili e impossibilità di avvio di cose casuali.

Probabilmente vorrai mettere in piedi una CA completa (gag) per far funzionare tutto correttamente . Le opzioni alternative sono ottenere un certificato di firma del codice effettivo da una CA attendibile e firmare le DLL che lo utilizzano. Anche se quelle DLL sono mai uscite allo stato selvatico con le tue probabilità di firma sono buone, il tuo certificato sarà revocato ... alla fine.

Inoltre, se stai facendo questo per i componenti di base di Windows, allora probabilmente interromperesti l'installazione poiché le protezioni interne faranno impazzire la firma sconosciuta.

Infine, se lo stai facendo con determinati driver non Microsoft o componenti in modalità kernel, potresti avere un brutto momento perché i codici hardware di Windows sono CA che possono firmare certificati per determinati componenti che hanno determinati utilizzi chiave. Vedi: link .

    
risposta data 17.02.2014 - 02:53
fonte