11 Punkte von GN⁺ 2026-01-01 | Noch keine Kommentare. | Auf WhatsApp teilen
  • 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.

Noch keine Kommentare.