Il seguente codice fa parte di un programma che viene generato ad ogni richiesta dallo script ruby on rails di nginx:
static void time_t_to_dos_time(time_t user_supplied_time_t, int *dos_date, int *dos_time)
{
struct tm *t = localtime(&user_supplied_time_t);
*dos_time = t->tm_sec / 2 + t->tm_min * 32 + t->tm_hour * 2048;
*dos_date = t->tm_mday + (t->tm_mon + 1) * 32 +
(t->tm_year + 1900 - 1980) * 512;
}
localtime
restituisce 0 se il valore è troppo grande per rientrare in struct tm
. Quindi, quando il programma tenta di leggere t->tm_sec
, tenterà di leggere l'indirizzo di memoria 0.
In tal caso, il programma aumenta immediatamente SIGSEGV
e il server restituisce:
HTTP/1.1 502 Bad Gateway
Content-Length: 13
Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'
Strict-Transport-Security: max-age=31536000
Vary: Authorization,Accept-Encoding
X-Content-Type-Options: nosniff
X-Frame-Options: deny
X-XSS-Protection: 1; mode=block
Date: Tue, 28 Jun 2016 12:59:10 GMT
502: Failure
Mi sembra un semplice bug senza problemi di sicurezza poiché il programma è progettato per funzionare solo su quel sito Web.
Questo sarebbe corretto?