Op dinsdag 11 juni 2002 21:47 schreef Dominique het volgende:
De lengte van de strings wordt wel degelijk gecontroleerd, er wordt echt geen overbodige informatie over het netwerk/internet verzonden. Daar hoef je niet over in te zitten.
Ik zat meer in over beveiliging/stabiliteit. Als je buiten je buffers schrijft, zou willekeurige data in je codesegment terecht kunnen komen. In het gunstigste geval crasht je computer dan, in een ongunstig geval kan een buitenstaander locaal code uitvoeren.
Het probleem was dan ik \n er niet aan kon catten.
Waarom niet?
BTW Ik snap niet helemaal hoe een derde ooit invloed kan uitoefenen op de buffer, een derde kan toch niet zomaar ff andere instructies uitvoeren om mijn eigen geschreven code?
Het hangt er vanaf in hoeverre je gegevens van derden bij het vullen van lokale buffers gebruikt. Dat kan ik zo niet beoordelen, maar ik kan het principe wel illustreren.
Stel je voor dat je een chatserver bouwt, waarin de gebruiker zijn nickname kan instellen. Bij het wijzigen van de nickname moet je deze nickname naar de andere chatters sturen, omdat ze anders niet kunnen weten dat 'ie gewijzigd is. Dit bericht wordt eerst in een lokale buffer geconstrueerd en in deze buffer komt onder andere de door mij opgegeven nickname voor. Als ik nu een nickname kies, die bestaat uit een heleboel NOP instructies gevolgd door wat 'evil' code, kan het zomaar gebeuren dat ik een deel van jou code overschrijf, waardoor op een gegeven moment mijn 'evil' code op jou syteem wordt uitgevoerd.
Bovenstaande exploit werkt natuurlijk alleen als de programmeur nalatig is, maar het is geen slecht gebruik om 'defensief' te programmeren. Ervoor zorgen dat je nooit buiten door jou gereserveerd geheugen schrijft is daar een basisonderdeel van. De overhead van een operatie als strncpy ten opzichte van strcpy is in de gemiddelde applicatie verwaarloosbaar en als het er dus voor kan zorgen dat je kunt aantonen dat je programma daarop niet zal crashen, dan is die overhead de moeite waard.