The Linux Kernel Eliminated This Entire C Function
La vidéo explique pourquoi la fonction C strncpy a été définitivement retirée du noyau Linux après six ans d'efforts, en raison de sa sémantique dangereuse et ambiguë qui était une source persistante de bugs et de vulnérabilités potentielles.

SYNTHÈSE STRUCTURÉE
Le problème fondamental de strncpy
La fonction strncpy a été conçue à l’origine pour un cas d’usage très spécifique et obsolète : manipuler les entrées de répertoire d’Unix original, qui utilisaient des tableaux de taille fixe de 14 octets. Sa sémantique est devenue problématique dans un usage général moderne. L’intervenant souligne que “strncpy a été une source persistante de bugs en raison de son usage prévu ambigu et de sa sémantique fréquemment contre-intuitive.” Le principal danger est qu’elle ne garantit pas la null-terminaison de la chaîne de destination, ce qui peut entraîner des lectures hors limites, des corruptions mémoire ou des vulnérabilités exploitables.
L’inefficacité du remplissage systématique
Un autre défaut majeur de strncpy est qu’elle “remplit inconditionnellement de zéros jusqu’à la longueur totale”, même lorsque cela n’est pas nécessaire. Si la source est plus courte que la taille du buffer de destination, la fonction va écrire des caractères nuls (\0) dans tous les octets restants. Cette opération est inefficace et constitue un gaspillage de ressources CPU, ce qui est particulièrement critique dans un contexte noyau où la performance est primordiale.
La confusion avec strcpy et la fausse sécurité
Pendant longtemps, strncpy a été utilisée comme un remplacement “sécurisé” à la fonction strcpy, qui, elle, copie une chaîne entière sans aucune vérification de borne, conduisant facilement à des dépassements de buffer. L’intervenant explique que strncpy offrait “au moins un niveau perçu de vérification des limites” grâce au paramètre n limitant le nombre de caractères copiés. Cependant, cette sécurité est illusoire car il est facile de se tromper dans le calcul de la taille, et le problème de la non-terminaison subsiste.
La solution : des fonctions sûres et dédiées
Pour résoudre ces problèmes, la communauté du noyau Linux a adopté une approche proactive : créer et utiliser des fonctions sûres et spécialisées, centralisées en un seul endroit. Ainsi, au lieu que chaque développeur doive réimplémenter les vérifications de sécurité, il peut appeler une fonction qui les intègre nativement. Les principales fonctions de remplacement introduites sont :
strscpy(): pour les copies vers des destinations nécessitant une null-terminaison.strscpypad(): pour le même cas mais nécessitant un remplissage par des zéros.strtomem_pad(): pour les champs de largeur fixe ne nécessitant pas de null-terminaison.
Un effort communautaire de longue haleine
Le retrait de strncpy n’est pas le fruit du hasard mais le résultat d’un effort collectif et soutenu. Comme le rappelle l’intervenant en citant Kees Cook : “Au cours des six dernières années de travail sur ceci, il y a eu 360 commits par 70 contributeurs.” Cela illustre la rigueur et la méthodologie de la communauté open-source pour assainir le code base, même lorsque cela demande des années de travail méticuleux de refactoring.
Un avertissement plus large sur les fonctions dangereuses
L’intervenant étend la discussion au-delà de strncpy pour mettre en garde contre d’autres fonctions au comportement similaire, comme _snprintf (à ne pas confondre avec snprintf). Il cite un article de blog : “Ces fonctions vous permettent de spécifier la taille du buffer, mais, et ceci est très important, elles ne garantissent pas la null-terminaison.” Il insiste sur le fait qu’“une chaîne non terminée en C et C++ est une bombe à retardement qui attend de détruire votre code.”
La leçon pour les développeurs
La conclusion pratique pour tout développeur système ou en langage C est de ne pas se fier aveuglément aux fonctions standards si elles sont dangereuses. L’intervenant conseille : “Si les fonctions qui nous sont données pour manipuler les chaînes sont difficiles à utiliser correctement, alors nous devrions en écrire de nouvelles.” L’idée est de définir des versions sûres de ces fonctions dans son projet, encapsulant la logique de sécurité en un seul point, plutôt que de tenter d’utiliser la fonction dangereuse correctement à chaque appel.
CONCEPTS CLÉS
- Null-terminaison : Convention en C où une chaîne de caractères se termine par un caractère nul (
\0). Son absence peut faire lire au programme de la mémoire au-delà de la chaîne. - Buffer overflow / Dépassement de buffer : Écriture de données au-delà des limites allouées pour un buffer en mémoire, pouvant corrompre d’autres données ou permettre l’exécution de code arbitraire.
- strcpy vs strncpy :
strcpycopie toute la chaîne source sans vérification.strncpylimite le nombre de caractères copiés mais ne null-termine pas systématiquement. - strscpy / strscpypad : Fonctions de remplacement modernes dans le noyau Linux, conçues pour être sûres et avec une sémantique claire (terminaison garantie, padding optionnel).
- Refactoring : Processus de restructuration du code existant sans en changer le comportement externe, entrepris ici pour éliminer une fonction dangereuse.
CONCLUSION
Le retrait de strncpy du noyau Linux est bien plus qu’un détail technique mineur ; c’est l’illustration d’une démarche de sécurité proactive et collective essentielle dans le développement des systèmes critiques. Cela montre qu’il faut avoir le courage de remettre en question et de remplacer des outils ou fonctions standards, même anciens et répandus, lorsqu’ils s’avèrent fondamentalement défectueux ou source d’erreurs. Pour un administrateur système, cela renforce l’importance de comprendre la sémantique profonde des outils et bibliothèques utilisés, et la valeur d’une centralisation des logiques critiques. Comme le résume l’intervenant, la clé est de “définir une fonction sûre à utiliser au lieu d’appeler la version non sûre et d’essayer d’écrire des garde-fous à chaque fois.” 🛡️