11 points par GN⁺ 2026-01-01 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • Après avoir déjà supprimé strncpy(), le projet cURL interdit désormais complètement strcpy() dans sa base de code
  • L’API de strcpy() est simple, mais elle présente un risque de dissociation entre la copie et la vérification de la taille du tampon, ce qui la rend peu sûre sur le long terme en maintenance
  • Pour la remplacer, une nouvelle fonction nommée curlx_strcopy() a été introduite ; elle prend en argument à la fois la taille du tampon de destination et la longueur de la chaîne afin de vérifier si la copie est possible avant de l’exécuter
  • Cette fonction utilise memcpy() en interne et garantit aussi le traitement du caractère de fin nul
  • Ce changement permet de renforcer la sécurité et la cohérence du code, tout en réduisant aussi les faux signalements de vulnérabilités générés par l’IA

Contexte de la suppression de strcpy

  • cURL avait déjà supprimé tous les appels à strncpy() par le passé, en pointant les problèmes de son API peu intuitive, de l’absence de garantie de terminaison nulle et du remplissage inutile par des zéros
    • Quand une copie partielle de chaîne est nécessaire, le projet est passé à memcpy() avec gestion explicite de la terminaison nulle
  • L’API de strcpy() est simple, mais comme elle n’indique pas explicitement la taille du tampon, il existe un risque qu’en maintenance le code de validation soit séparé de l’appel de copie
    • Si le code est modifié pendant des décennies par plusieurs développeurs, la vérification de la taille du tampon peut devenir inopérante

Introduction d’une nouvelle fonction de copie de chaînes

  • Pour éviter ce risque, une fonction de remplacement appelée curlx_strcopy() a été introduite
    • Elle prend comme arguments le tampon de destination, la taille du tampon, le tampon source et la longueur de la chaîne source
    • Elle n’effectue la copie avec memcpy() que si la copie et la terminaison nulle sont toutes deux possibles
    • En cas d’échec, le tampon de destination est initialisé comme chaîne vide
  • Cette fonction demande davantage d’arguments et plus de code que strcpy(), mais elle lie étroitement la vérification du tampon à l’opération de copie afin d’assurer la sécurité
  • L’usage de strcpy() est désormais totalement interdit dans la base de code de cURL, comme cela a déjà été fait pour strncpy()

Détails d’implémentation

  • Voici un exemple de définition de la fonction
    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;
    }
    
  • DEBUGASSERT permet de détecter plus tôt les erreurs pendant le développement, et la fonction est conçue pour toujours réussir en environnement de production
  • Comme strcpy, elle n’a pas de valeur de retour, et le projet privilégie la détection des erreurs lors des tests et du fuzzing

Réactions de la communauté

  • Certains développeurs ont fait remarquer une ressemblance avec strcpy_s() (C11 Annex K), mais cURL continue d’utiliser la norme C89
  • D’autres ont suggéré d’ajouter une valeur de retour ou d’améliorer le traitement en cas d’échec du tampon
  • En réponse, l’équipe de cURL a expliqué que « la fonction a été conçue pour toujours réussir, donc une valeur de retour est inutile »

Effet secondaire lié à l’IA

  • Ce changement permet aussi d’éviter que des chatbots d’IA détectent à tort l’usage de strcpy dans le code de cURL et affirment qu’il est “vulnérable”
  • L’auteur note toutefois que « l’IA peut encore produire d’autres faux signalements », évoquant ainsi les limites de l’analyse de code fondée sur l’IA

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.