Daniel Stenberg, der Autor des Tools curl zur Übertragung von Daten über das Netzwerk, hat die Verwendung der Funktion strcpy() im Code des Projekts eingestellt und deren Nutzung künftig untersagt. Diese Entscheidung folgt auf den im vergangenen Jahr eingeleiteten Verzicht auf die Verwendung von strncpy(), die eine bestimmte Anzahl von Bytes aus einer Eingabezeichenkette kopiert. Die Verwendung von strncpy() führte zu dem Risiko von Fehlern durch das Versäumnis, das Nullzeichen am Ende der Zeichenkette zu berücksichtigen, oder durch übermäßige Auffüllung mit Nullen.
Aufrufe von strncpy() wurden durch die Funktion strcpy() ersetzt, wobei vor dem Aufruf die Speicherzuweisung für den Zielpuffer unter Berücksichtigung der Größe der Eingabezeichenkette vorgenommen oder eine Überprüfung der Übereinstimmung zwischen der Größe der Eingabezeichenkette und des Zielpuffers durchgeführt wurde. Eine Ersetzung durch strlcpy() wurde nicht vorgenommen, da es immer erforderlich war, die gesamte Zeichenkette zu kopieren oder einen Fehler zurückzugeben.
Jetzt wurden alle Aufrufe von strcpy() durch die neue Funktion curlx_strcopy(dest, dsize, src, slen) ersetzt. Die Funktion curlx_strcopy() erfordert die Angabe der Größe des Quell- und Zielpuffers, wobei zu beachten ist, dass der Zielpuffer unbedingt größer als der Quellpuffer sein muss, um das Nullzeichen am Ende der Zeichenkette aufzunehmen, das von der Funktion hinzugefügt wird, um zu verhindern, dass es beim Kopieren übersprungen wird. Wenn die Größe des Zielpuffers größer als null ist, aber nicht ausreicht, um die Zielzeichenkette zu kopieren, wird ein Nullbyte an den Anfang angehängt. 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; }
Der Austausch von strcpy() durch curlx_strcopy() wurde vorgenommen, da die Möglichkeit menschlicher Fehler besteht, die zu einer Trennung zwischen dem Code zur Überprüfung/Allokation von Speicher und dem Aufruf von strcpy() führen können. Dies könnte beispielsweise beim unüberlegten Kopieren nur eines Teils des Codes oder dem Einfügen von Code zwischen der Überprüfung und dem Aufruf von strcpy() geschehen. Zudem wird das Ende der Verwendung von strcpy dazu beitragen, eine Flut von Fehlermeldungen über Sicherheitsanfälligkeiten durch fehlerhafte AI-Tools zu vermeiden, die das Vorhandensein von strcpy() als Schwachstelle werten, ohne die damit verbundenen Überprüfungen im Code zu berücksichtigen.
Quelle: opennet.ru
