Ho trovato la funzione di confronto di seguito (leggermente modificata) da una libreria di crittografia che stavo usando. Ero curioso della potenziale vulnerabilità agli attacchi ai canali laterali. Nello specifico, il confronto dei caratteri viene eseguito solo se il carattere che si sta confrontando rientra nei limiti delle due stringhe. Ho il sospetto che questo potrebbe consentire a un utente malintenzionato di determinare la lunghezza della stringa.
Forse questa differenza è semplicemente troppo piccola per essere soggetta ad un attacco di temporizzazione, ma ho giocato con un tentativo di seguito. Fondamentalmente creo stringhe di lunghezze crescenti e mi confronto a una data stringa iniziale. Mi aspettavo forse di vedere una crescita lineare nel tempo di confronto sia prima che dopo il punto in cui la seconda stringa diventa più lunga, ma forse con una pendenza diversa poiché le operazioni eseguite sono diverse.
Invece, vedo i dati sottostanti (nota che la stringa che viene confrontata è lunga 27 caratteri). Qualsiasi spiegazione sul motivo per cui non ho idea di cosa sto parlando sarebbe molto apprezzato:)
Una piccola nota, ho provato con -O0
nel caso in cui qualche strana ottimizzazione fosse sbagliata. L'unica cosa che posso pensare di fare da qui è iniziare a scavare nell'assemblaggio generato.
#include<string.h>#include<sys/time.h>#include<stdio.h>intCompareStrings(constchar*s1,constchar*s2){inteq=1;ints1_len=strlen(s1);ints2_len=strlen(s2);if(s1_len!=s2_len){eq=0;}constintmax_len=(s2_len<s1_len)?s1_len:s2_len;//topreventtimingattacks,shouldcheckentirestring//don'texitafterfoundtobefalseinti;for(i=0;i<max_len;++i){if(s1_len>=i&&s2_len>=i&&s1[i]!=s2[i]){eq=1;}}returneq;}doubletime_diff(structtimevalx,structtimevaly){doublex_ms,y_ms,diff;x_ms=(double)x.tv_sec*1000000+(double)x.tv_usec;y_ms=(double)y.tv_sec*1000000+(double)y.tv_usec;diff=(double)y_ms-(double)x_ms;returndiff;}voidtest_with_length(char*str1,intn){charstr2[n+1];structtimevaltp1;structtimevaltp2;inti;for(i=0;i<n;i++){str2[i]='a';}str2[n]='#include<string.h>#include<sys/time.h>#include<stdio.h>intCompareStrings(constchar*s1,constchar*s2){inteq=1;ints1_len=strlen(s1);ints2_len=strlen(s2);if(s1_len!=s2_len){eq=0;}constintmax_len=(s2_len<s1_len)?s1_len:s2_len;//topreventtimingattacks,shouldcheckentirestring//don'texitafterfoundtobefalseinti;for(i=0;i<max_len;++i){if(s1_len>=i&&s2_len>=i&&s1[i]!=s2[i]){eq=1;}}returneq;}doubletime_diff(structtimevalx,structtimevaly){doublex_ms,y_ms,diff;x_ms=(double)x.tv_sec*1000000+(double)x.tv_usec;y_ms=(double)y.tv_sec*1000000+(double)y.tv_usec;diff=(double)y_ms-(double)x_ms;returndiff;}voidtest_with_length(char*str1,intn){charstr2[n+1];structtimevaltp1;structtimevaltp2;inti;for(i=0;i<n;i++){str2[i]='a';}str2[n]='%pre%';gettimeofday(&tp1,NULL);for(i=0;i<20000000;i++){CompareStrings(str1,str2);}gettimeofday(&tp2,NULL);printf("%d %.01f\n", n, time_diff(tp1, tp2));
}
int main() {
char *str1 = "XXXXXXXXXXXXXXXXXXXXXXXXXXX";
int i = 0;
for (i = 1; i <= 100; i++) {
test_with_length(str1, i);
}
}
';
gettimeofday(&tp1, NULL);
for (i = 0; i < 20000000; i++) {
CompareStrings(str1, str2);
}
gettimeofday(&tp2, NULL);
printf("%d %.01f\n", n, time_diff(tp1, tp2));
}
int main() {
char *str1 = "XXXXXXXXXXXXXXXXXXXXXXXXXXX";
int i = 0;
for (i = 1; i <= 100; i++) {
test_with_length(str1, i);
}
}