Le protezioni di Carnary si basano sul compilatore aggiungendo il codice prima e dopo ciascun corpo di funzione e, eventualmente, ricorrendo alle variabili locali della funzione, quindi questo è non possibile per l'elemento 1.
Per quanto riguarda l'elemento 2, l'unica cosa che viene in mente è eseguire l'eseguibile sotto Valgrind per l'analisi. Non vorrai farlo in produzione, dato che è lento. Inoltre, alcuni buildin GCC si comportano male con Valgrind (ad esempio il% built-in di% co_de può leggere fino a 3 byte (su i386) oltre la fine di un buffer allocato), quindi emetterà falsi positivi.
Direi che la tua solo soluzione è quella di ricompilare l'applicazione con SSP abilitato (anche, GCC fornisce libssp che contiene le funzioni per fare l'elemento 2). Molte altre librerie C contengono codice di supporto SSP (non è molto codice, in realtà), quindi non usare GNU libc non è un problema.
Alcuni altri compilatori C contengono anche controlli ai confini, controlli di overflow del buffer, controlli di overflow dello stack, ecc. in vari stati di usabilità.
Dovresti anche esaminare la tua implementazione strlen
. Alcune implementazioni, in particolare omalloc di OpenBSD, offrono la prenotazione di "pagine di protezione" prima e dopo allocazioni a dimensione di pagina e lo spostamento di allocazioni più piccole all'inizio o alla fine di una pagina per catturare gli accessi oltre il buffer.