Azienda Checkpoint meccanismo di protezione Safe-Linking, che complica la creazione di exploit che manipolano la definizione o la modifica dei puntatori sui buffer allocati durante la chiamata di malloc. Safe-Linking non blocca completamente la possibilità di sfruttare le vulnerabilità, ma riduce notevolmente la creazione di alcune categorie di exploit con costi minimi, poiché, oltre a sfruttare il buffer overflow, è necessario trovare un'altra vulnerabilità che induce a una fuga di informazioni sulla posizione dell'heap in memoria.
Le patch con l'implementazione di Safe-Linking sono state preparate per Glibc (ptmalloc), uClibc-NG (dlmalloc), gperftools (tcmalloc) e Google TCMalloc, e sono state proposte per l'aggiornamento della protezione in Chromium (in
Chromium dal 2012 è già integrata una tecnica di protezione MaskPtr mirata alla soluzione dello stesso problema, ma la soluzione di Checkpoint dimostra prestazioni più elevate).
Le patch proposte sono già state approvate per la distribuzione nella versione di agosto e l'applicazione di Safe-Linking sarà inclusa per impostazione predefinita. In uClibc-NG il supporto di Safe-Linking è implementato nella versione 1.0.33 e abilitato per impostazione predefinita. In gperftools (vecchio tcmalloc) le modifiche , ma saranno proposte in una delle future versioni come opzione.
Sviluppatori (nuovo tcmalloc) hanno rifiutato di accettare , citando un forte calo delle prestazioni e la necessità di aggiungere test approfonditi per verificare regolarmente che tutto funzioni correttamente. I test eseguiti dagli ingegneri di Checkpoint hanno mostrato che il metodo Safe-Linking non comporta sovraccarichi di memoria aggiuntivi, e le prestazioni nelle operazioni con l'heap diminuiscono in media solo dello 0,02%, e nel peggior scenario il 1,5% (per confronto, i costi indiretti con il metodo utilizzato in Chromium sono stimati come 'meno del 2%'). L'inclusione
di Safe-Linking porta all'esecuzione di 2-3 istruzioni assembly aggiuntive ad ogni chiamata di free() e 3-4 istruzioni alla chiamata di malloc(). L'avvio delle fasi di inizializzazione e generazione di valori casuali non è richiesto.
Safe-Linking può essere utilizzato non solo per aumentare la sicurezza di varie implementazioni della heap, ma anche per aggiungere mezzi di controllo dell'integrità in qualsiasi struttura dati in cui vengono utilizzate liste collegate di puntatori, collocate vicino ai buffer stessi. Il metodo è molto semplice da implementare e richiede solo l'aggiunta di un macro e il suo utilizzo sui puntatori al blocco successivo nel codice (ad esempio, per Glibc solo alcune righe nel codice). Il metodo si riduce ai seguenti cambiamenti:
+#define PROTECT_PTR(pos, ptr) \
+ ((__typeof (ptr)) ((((size_t) pos) >> 12) ^ ((size_t) ptr)))
+#define REVEAL_PTR(ptr) PROTECT_PTR (&ptr, ptr)
— nextp = p->fd;
+ nextp = REVEAL_PTR (p->fd);
…
Il concetto del metodo consiste nell'applicare dati casuali dal meccanismo di randomizzazione degli indirizzi ASLR (mmap_base) per proteggere le liste collegate, come Fast-Bins e TCache. Prima di applicare al valore del puntatore al prossimo elemento nella lista viene eseguita una trasformazione tramite maschera e un controllo di allineamento secondo il confine della pagina di memoria. Il puntatore viene sostituito con il risultato dell'operazione «(L >> PAGE_SHIFT) XOR (P)», dove P è il valore del puntatore, e L è la posizione in memoria dove è memorizzato questo puntatore.
Quando utilizzato nel sistema (Address Space Layout Randomization) una parte dei bit L con l'indirizzo base della heap contiene valori casuali, utilizzati come chiave per codificare P (estratti con un'operazione di shift di 12 bit per pagine da 4096 byte). Tale manipolazione riduce il rischio di cattura del puntatore in un exploit, poiché il puntatore non è memorizzato nella forma originale e per sostituirlo è necessario conoscere informazioni sulla disposizione della heap. Inoltre, nel codice del patch è presente anche un ulteriore controllo di allineamento del blocco, che impedisce all'attaccante di sostituire il puntatore con un valore non allineato e richiede la conoscenza del numero di bit su cui è stato effettuato l'allineamento, il che consente ulteriormente, nei sistemi a 64 bit, di bloccare 15 delle 16 tentativi di attacco che non considerano l'allineamento.
Il metodo è efficace per proteggere da attacchi che utilizzano la parziale sovrascrittura di puntatori (modificando i byte meno significativi), la completa riscrittura di puntatori (reindirizzamento a codice dell'attaccante) e il cambio della posizione della lista a un indirizzo non allineato. Come esempio, è dimostrato che l'applicazione di Safe-Linking in malloc permetterebbe di bloccare l'exploitation recently dallo stesso ricercatore delle vulnerabilità nella smart light di Philips Hue Bridge, causata da un overflow del buffer e che consente di prendere il controllo del dispositivo.
Fonte: opennet.ru
