Prevenire il sovraccarico del buffer quando le prestazioni non sono un problema

3

Le tecnologie anti-sfruttamento (DEP, ASLR, protezione dello stack, ecc.) non forniscono una protezione completa. Una ragione per questo è la prestazione; queste tecnologie sono progettate per funzionare con un sovraccarico di prestazioni ridotte.

Per un sistema che ha esigenze di elevata sicurezza, ma esigenze di prestazioni ridotte, esistono tecniche in grado di fornire una protezione più affidabile contro i sovraccarichi del buffer (e altri difetti di corruzione della memoria)? Come regola generale, un rallentamento di 10 volte non sarebbe un problema, anche se un rallentamento di 100x sarebbe probabilmente inaccettabile.

Sono interessato sia a tecniche teoriche che a sistemi pratici.

Modifica: Per essere chiari, sto parlando di un sistema che deve eseguire un codice esistente in un linguaggio non protetto dalla memoria. Quindi Java, .Net, ecc. Non saranno di aiuto.

    
posta paj28 17.11.2015 - 15:54
fonte

3 risposte

2

Interpreti di lingue come quelli menzionati qui dovrebbe essere in grado di rilevare accessi di memoria fuori limite con elevata affidabilità. In cambio di questa maggiore affidabilità gli interpreti eseguiranno la tua applicazione più lentamente (non ho statistiche ma ho visto numeri che dicono 5x) e probabilmente introdurranno incompatibilità con il codice compilato. Queste incompatibilità possono essere dovute a bug di interpreti o semplicemente allentamenti nelle specifiche del linguaggio. Dovresti controllare le impostazioni sul compilatore che usi in quanto potrebbero avere opzioni per abilitare controlli di memoria extra a un costo di rendimento.

    
risposta data 17.11.2015 - 21:02
fonte
0

Se il sistema operativo lo supporta, è possibile utilizzare le pagine di protezione tra i segmenti di memoria del programma. Se si verifica un overflow del buffer e si verifica un errore eccessivo, si accederà alla pagina di guardia causando un errore di segmentazione per tale processo.

Il compilatore gcc implementa anche una protezione per lo smantellamento dello stack posizionando "canarini" o variabili protettive con valori noti. Se cambiano, il processo si interrompe.

Entrambe queste soluzioni hanno un impatto sulle prestazioni trascurabile.

Nel mondo accademico sembrano esserci due ideologie in competizione per impedire il reindirizzamento dell'esecuzione:

  1. Riscrittura binaria (modifica del tempo di compilazione del file binario)
  2. Riduzione del buffer di attenuazione in fase di esecuzione (BinArmor: link )

La mitigazione del tempo di esecuzione ha le ripercussioni più significative sulle prestazioni.

    
risposta data 17.11.2015 - 17:50
fonte
0

Clang AddressSanitizer può farlo. Dalla documentazione:

AddressSanitizer is a fast memory error detector. It consists of a compiler instrumentation module and a run-time library. The tool can detect the following types of bugs:

  • Out-of-bounds accesses to heap, stack and globals
  • Use-after-free
  • Use-after-return (to some extent)
  • Double-free, invalid free
  • Memory leaks (experimental)

Typical slowdown introduced by AddressSanitizer is 2x.

    
risposta data 18.11.2015 - 08:32
fonte

Leggi altre domande sui tag