- 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.