Door Anoniem: strlcpy en strncpy mogen volgens sommige de juiste zijn, maar naar mijn idee zijn ze dat niet. Het heeft namelijk helemaal geen zin om een string te kopieeren naar een buffer die te klein is. Controleer dus eerst of er genoeg ruimte is in *dest [...]
Als *dest van het type char* is en jij hier niet zelf geheugen voor gealloceerd hebt, kun je nergens aan zien hoe groot die buffer is. Het misschien wel grootste probleem van C strings is dat bij normaal gebruik strings nooit langer worden dan een specifieke lengte, maar dat een aanvaller een mogelijkheid ontdekt om een langere string aan te bieden.
@Anoniem 11:44: eens.
Door Anoniem: door Bitwiper: Doordat browsers die "string" parsten met str* functies, werd het een geldig certificaat voor ing.nl.
Denk je dat dit voorkomen had kunnen worden door in browsers strl*functies te ondersteunen en te gebruiken?
Uit
https://www.freebsd.org/cgi/man.cgi?query=strlcpy&sektion=3&manpath=FreeBSD+11.2-RELEASE+and+Ports:
strlcpy() copies up to dstsize - 1 characters from the string src to dst, NUL-terminating the result if dstsize is not 0.
Dat
lijkt te suggereren dat het om een memcpy gaat die gegarandeerd voor een terminating zero zorgt (tenzij dstsize 0 is). Echter het gaat hier om C strings en die zijn null-terminated. Daardoor kun je "up to" ook zo uitleggen dat deze stopt na het kopiëren van een nul-byte, en -discutabel- is dat het juiste gedrag.
Vandaar ook mij laatste opmerking voor Mathfox: de implementor van
operator = kan als "service" voor code met mixed C en "stringclass strings" functionaliteit hebben toegevoegd die stopt nadat er een nul-byte is gekopieerd.
Het is lastig te zeggen wiens schuld het "verkeerd omgaan" met een 0 halverwege een string is. Daarmee is het geen C-string, want die zijn null-
terminated. Een nul-byte is
ook geen legaal karakter in een domeinnaam, dus browsermakers kun je het niet verwijten als zij str* functies voor het verwerken ervan gebruiken. Het probleem is dat nul-bytes halverwege values in ASN.1 structuren wel zijn toegestaan en dus getransporteerd worden van cybercrimineel naar de browser van de eindgebruiker. Feitelijk is de aanvrager van het certificaat fout omdat hij een illegaal karakter in een domeinnaam gebruikt (maar wat kun je verwachten van cybercriminelen en security-onderzoekers die op exploits wijzen), en de certificaatverstrekker zou je fout kunnen noemen omdat deze niet heeft gecontroleerd of de domeinnaam uitsluitend uit toegestane karakters bestond.
Kortom, niet zozeer de str* functies maar
null-terminated strings kunnen ondingen zijn als je geen rekening houdt met hun beperkingen. Helaas kom je er niet of nauwelijks omheen als je Windows of Linux programma's schrijft, en bovendien heb je bij tijdkritische programma's niet de ellende van full stops veroorzaakt door garbage collectors.