Door eMilt: gebruik maar een andere programmeertaal dan C/C++ als je daar niet mee overweg kunt
Wat stel jij dan voor ? Ik denk dat C/C++ toch nog steeds de enige serieuze oplossing is als je cross-platform wilt ontwikkelen. Natuurlijk, Java is cross-platform maar dat zou voor mij echt een afknapper zijn en een reden om Firefox links te laten liggen. Ik vind Java hartstikke mooi maar niet voor de desktop.
Een stukje uit nsHtml5Parser.cpp (FF v3.60, waarvan ik geen idee heb ik of deze ooit wordt uitgevoerd of zelfs meegecompileerd wordt), kijk eerst naar het
onderste deel van de code:
if (mSniffingLength + aCount >= NS_HTML5_PARSER_SNIFFING_BUFFER_SIZE) {
[...]
return FinalizeSniffing(aFromSegment, aCount, aWriteCount, countToSniffingLimit);
}
[...] 11 regels verder
if (!mSniffingBuffer) {
mSniffingBuffer = new PRUint8[NS_HTML5_PARSER_SNIFFING_BUFFER_SIZE];
}
memcpy(mSniffingBuffer + mSniffingLength, aFromSegment, aCount);
Als in de onderste regel geldt dat
mSniffingLength + aCount groter is dan
NS_HTML5_PARSER_SNIFFING_BUFFER_SIZE dan heb je natuurlijk te maken met een ordinaire bufferoverflow. Bovendien zou
mSniffingBuffer naar een kleinere buffer dan
NS_HTML5_PARSER_SNIFFING_BUFFER_SIZE kunnen wijzen (zou op een kleinere buffer kunnen zijn geïnitialiseerd of zou daarna kunnen zijn opgehoogd), maar dit lijkt de enige plaats in de source waar geheugen voor de buffer wordt gealloceerd.
Indien
mSniffingLength + aCount >= NS_HTML5_PARSER_SNIFFING_BUFFER_SIZE dan wordt in het bovenste stuk gelukkig een bufferoverflow voorkomen doordat de routine verlaten wordt voordat je bij de onderste sectie met memcpy aankomt.
Maar dit is wel afschuwlijke code, de kans dat een andere programmeur (of dezelfde na enige tijd) ergens boven die memcpy iets wijzigt waardoor dit
wel tot een bufferoverflow leidt is niet denkbeeldig. Het gaat hier om strings, waarom worden er geen stringclasses gebruikt die bijna al dit soort leed kunnen voorkomen? (en waarbij je bovendien slimmer memory management kunt doen, er even vanuitgaande dat ze new() voor dit doel niet ergens hebben geoverload).
Op een andere plaats in de source vond ik iets dat best wel eens
wel tot een bufferoverflow zou kunnen leiden, als ik tijd heb zal ik dat eens verder onderzoeken (nee, ik ga hier niet vertellen wat en waar). Alleen al het feit dat een redelijk ervaren programmeur er enorm veel tijd in moet stoppen om te snappen wat een stuk source doet en of er wellicht fouten in zitten betekent een -m.i. veel te groot- risico.
Ansi C is gewoon te link voor allerlei ordinaire stringoperaties (tenzij zorgvuldig in een optimized library toegepast). Zaken als strcpy(), strcat(), memcpy() en complexe pointeroperaties hoor je m.i. niet in "worker" C++ routines tegen te komen; de kans op fouten daarin is gewoon te groot. Dat heeft de praktijk ondertussen wel bewezen, toch?