Tweets by @buherablog
profile for buherator at IT Security Stack Exchange, Q&A for IT security professionals

A BitBetyár Blog

Túljártál a nagyokosok eszén? Küldd be a mutatványodat! (e-mail a buherator gmailkomra jöhet)

Full-Disclosure / Névjegy / Coming out


Promó

H.A.C.K.

Címkék

0day (110) adobe (87) adobe reader (21) anonymous (26) apple (60) az olvasó ír (49) blackhat (20) botnet (22) bug (200) buherablog (44) buhera sörözés (39) bukta (49) deface (38) dns (22) dos (29) esemény (82) facebook (26) firefox (64) flash (33) gondolat (31) google (59) google chrome (36) hacktivity (37) hírek (117) incidens (224) internet explorer (88) iphone (35) java (50) jog (22) kína (21) kriptográfia (68) kultúra (21) linux (24) malware (43) microsoft (142) móka (48) mozilla (23) office (26) oracle (40) os x (43) patch (197) php (20) politika (31) privacy (58) programozás (22) safari (34) sql injection (62) windows (85) xss (77) Címkefelhő

Licensz

Creative Commons Licenc

A GCC optimalizáció biztonsági ellenőrzéseket távolíthat el

2008.04.12. 10:36 | buherator | Szólj hozzá!

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!


Címkék: programozás gcc buffer overflow

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.