Az US-CERT jelentése szerint a GNU Compiler Collection 4.2-es és annál újabb verziói optimalizációs szempontok alapján eltávolíthatnak bizonyos fontos biztonsági ellenőrzéseket a fordított kódból. A problémára már 2006 áprilisában felhívta a figyelmet Felix von Leitner, aki már a 4.1-es verzióknál is tapasztalta a problémát. A GCC fejlesztők ki is adtak egy foltot, azonban ez úgy tűnik nem orvosolta siekresen a problémát. Miről is van szó? A
char* buf;
int len;
adattípusokat tartalmazó műveletek esetén a fordító feltételezi, hogy a buf és a len összege mindig nagyobb buf-nál, így az ehhez hasonló pointer-aritmetikán alapuló ellenőrzéseket:
if (buf+len<len){...}
a függvényblokkal ({...} - ennek is van ennél szebb magyar neve...) együtt egyszerűen kiszűri, holott egy integer túlcsordulás esetén az ellenőrzésnek nagyon is meg kéne lennie! Ez természetesen puffer túlcsordulásos támadásokhoz vezethet azon programok esetén, melyeket ilyen GCC-vel fordítottak. Fontos megjegyezni, hogy a fordító alapvetően nem hibás, hiszen ezt a viselkedést az ISO/IEC 9899:1999 jelű C szabvány megengedi.
A CERT Biztonságos C programozási szabályzat azt javasolja, hogy a hasonló programrészek esetén kasztoljunk uintptr_t típusra (stdint.h), illetve size_t-re, ha az adott platfomron az előző típus nem elérhető:
#include <stdint.h>
[...]
if((uintptr_t)buf+len < (uintptr_t)buf)
[...]
Itthon futólag tesztelgettem a dolgot (gcc 4.2.1), és ez a megoldás nálam nem működött, de kíváncsian várom az esetleges ellentétes tapasztalatokat!
A CERT Biztonságos C programozási szabályzat azt javasolja, hogy a hasonló programrészek esetén kasztoljunk uintptr_t típusra (stdint.h), illetve size_t-re, ha az adott platfomron az előző típus nem elérhető:
#include <stdint.h>
[...]
if((uintptr_t)buf+len < (uintptr_t)buf)
[...]
Itthon futólag tesztelgettem a dolgot (gcc 4.2.1), és ez a megoldás nálam nem működött, de kíváncsian várom az esetleges ellentétes tapasztalatokat!