Non si può conoscere il futuro
È fondamentalmente non si può prevedere cosa ottimizzatori futuro potrebbe o non potrebbe fare in qualsiasi lingua.
Per guardare al futuro, le migliori probabilità sono per il sistema operativo stesso di fornire test costanti di temporizzazione, in modo che possano essere correttamente testati e utilizzati in tutti gli ambienti.
Questo è già in corso da un po 'di tempo. Per esempio. La funzione timingsafe_bcmp() in libc è apparsa per la prima volta in OpenBSD 4.9. (Rilasciato a maggio 2011).
Ovviamente gli ambienti di programmazione devono prelevarli e/o fornire le proprie funzioni che garantiscono che non saranno ottimizzati.
ispezionare il codice assembly
V'è una certa discussione di ottimizzatori here. È C (e C++), ma è davvero indipendente dalla lingua che puoi solo guardare a ciò che gli attuali ottimizzatori possono fare, non a ciò che potrebbero fare i futuri ottimizzatori. Ad ogni modo raccomandano giustamente di controllare il codice assembly per sapere cosa fa il tuo ottimizzatore.
Per java che non è necessariamente così "facile" come per C o C++ data la sua natura, ma non dovrebbe essere impossibile per specifiche funzioni di sicurezza fare effettivamente questo sforzo per gli ambienti attuali.
evitare potrebbe essere possibile
Si potrebbe provare a evitare l'attacco di temporizzazione.
Es .:
Anche se intuitivamente l'aggiunta di tempo casuale potrebbe sembrare il ting da fare, non funziona: gli attaccanti sta già utilizzando l'analisi statistica in tempi gli attacchi, si deve semplicemente aggiungere un po 'più rumore.
https://security.stackexchange.com/questions/96489/can-i-prevent-timing-attacks-with-random-delays
Ancora: non significa che non si può fare un tempo costante implementazione se l'applicazione può essere abbastanza lento. Ad esempio: aspetta abbastanza a lungo. Per esempio. potresti aspettare che un timer si spenga e solo allora continuare ad elaborare il risultato del confronto evitando comunque l'attacco a tempo.
Detection
Dovrebbe essere possibile scrivere rivelazione di temporizzazione vulnerabilità attacco in applicazioni utilizzando un'implementazione di temporizzazione confronto costante.
Ether:
- alcuni test che viene eseguito durante l'inizializzazione
- lo stesso test regolarmente come parte della normale operatività.
Ancora una volta l'ottimizzatore sarà difficile da gestire come può (ea volte lo farà) persino cambiare l'ordine di esecuzione delle cose. Ma ad es. utilizzando input che il programma non ha nel suo codice (ad esempio un file esterno) e eseguendolo due volte: una volta con un confronto normale e stringhe identiche, una volta con stringhe completamente diverse (xored ad es.) e poi di nuovo con quegli input ma con un tempo costante confrontare. Ora hai 4 tempi: il confronto normale non dovrebbe essere lo stesso, il confronto costante dovrebbe essere più lento e uguale. Se fallisce: avvertire l'utente/manutentore dell'applicazione, è probabile che il tempo costante venga interrotto durante l'utilizzo della produzione.
- Un'opzione teorica è quella di raccogliere autonomamente i tempi effettivi (registrare errori/successi) e analizzarli statisticamente. Ma sarebbe difficile da eseguire in pratica poiché le tue misurazioni avrebbero bisogno di essere estremamente accurate dato che non puoi looparlo un paio di volte, hai a che fare con la misurazione di un solo confronto e non avrai la risoluzione per misurarlo con precisione. ..
In che modo una dichiarazione di registro all'esterno impedisce il cortocircuito? –
@SleimanJneidi Poiché il risultato 'res' viene registrato, deve essere calcolato fino alla fine, quindi il loop non può essere cortocircuitato. –
... a meno che non si ottenga 'res == -1' ad un certo punto e quindi si può uscire dal ciclo. Ma questo sarebbe un test diverso e non riesco a immaginare un compilatore che lo faccia. – maaartinus