- Das cURL-Projekt hat nach der früheren Entfernung von
strncpy() nun auch strcpy() vollständig in der Codebasis verboten
- Die API von
strcpy() ist zwar einfach, birgt aber das Risiko, dass die Prüfung der Puffergröße vom Kopiervorgang getrennt wird, was bei langfristiger Wartung unsicher ist
- Als Ersatz wurde die neue Funktion
curlx_strcopy() eingeführt, die sowohl die Größe des Zielpuffers als auch die Länge der Zeichenkette als Argumente erhält und vor dem Kopieren prüft, ob der Vorgang möglich ist
- Intern verwendet die Funktion
memcpy() und garantiert auch die Behandlung des Null-Terminators
- Durch diese Änderung sollen Sicherheit und Konsistenz des Codes verbessert und zugleich Probleme reduziert werden, bei denen KI fälschlich Schwachstellenmeldungen erzeugt
Hintergrund zur Entfernung von strcpy
- cURL hat in der Vergangenheit bereits alle Aufrufe von
strncpy() entfernt und auf die Probleme dieser Funktion hingewiesen: eine unintuitive API, keine garantierte Null-Terminierung und unnötiges Auffüllen mit 0-Werten
- Wenn Teilstrings kopiert werden müssen, wurde auf
memcpy() umgestellt und die Null-Terminierung direkt behandelt
- Die API von
strcpy() ist zwar simpel, nennt aber keine Puffergröße ausdrücklich, wodurch bei der Wartung das Risiko entsteht, dass Prüfcode und Kopieraufruf voneinander getrennt werden
- Wenn Code über Jahrzehnte von verschiedenen Entwicklern geändert wird, besteht die Möglichkeit, dass die Prüfung der Puffergröße ausgehebelt wird
Einführung einer neuen String-Kopierfunktion
- Um dieses Risiko zu vermeiden, wurde die Ersatzfunktion
curlx_strcopy() eingeführt
- Sie nimmt als Argumente Zielpuffer, Puffergröße, Quellpuffer und Länge der Quellzeichenkette entgegen
- Sie führt den Kopiervorgang nur dann mit
memcpy() aus, wenn sowohl das Kopieren als auch die Null-Terminierung möglich sind
- Im Fehlerfall wird der Zielpuffer als leerer String initialisiert
- Diese Funktion benötigt im Vergleich zu
strcpy() mehr Argumente und mehr Code, stellt die Sicherheit jedoch dadurch sicher, dass die Pufferprüfung eng an den Kopiervorgang gekoppelt ist
- Die Verwendung von
strcpy() wurde in der cURL-Codebasis vollständig verboten und damit ebenso entfernt wie strncpy()
Implementierungsdetails
- Ein Beispiel für die Funktionsdefinition sieht wie folgt aus
void curlx_strcopy(char *dest, size_t dsize, const char *src, size_t slen)
{
DEBUGASSERT(slen < dsize);
if(slen < dsize) {
memcpy(dest, src, slen);
dest[slen] = 0;
}
else if(dsize)
dest[0] = 0;
}
- Mit
DEBUGASSERT werden Fehler während der Entwicklung früh erkannt, während die Funktion für echte Deployment-Umgebungen so ausgelegt ist, dass sie immer erfolgreich arbeitet
- Wie
strcpy gibt sie keinen Rückgabewert zurück; stattdessen setzt man darauf, Fehler in Test- und Fuzzing-Phasen zu finden
Reaktionen aus der Community
- Einige Entwickler merkten an, dass dies
strcpy_s() (C11 Annex K) ähnele, cURL verwende jedoch weiterhin den C89-Standard
- Andere Stimmen schlugen vor, einen Rückgabewert hinzuzufügen oder die Behandlung bei Pufferfehlern zu verbessern
- Darauf erklärte cURL, ein Rückgabewert sei unnötig, weil die Funktion „so entworfen wurde, dass sie immer erfolgreich ist“
Zusätzlicher Effekt im Zusammenhang mit KI
- Durch diese Änderung lässt sich verhindern, dass KI-Chatbots die Verwendung von strcpy im cURL-Code fälschlich erkennen und als „verwundbar“ bezeichnen
- Der Autor merkte jedoch an, dass KI weiterhin andere falsche Meldungen erzeugen könnte, und verwies damit auf die Grenzen KI-basierter Codeanalyse
Noch keine Kommentare.