☕️ Dans le noyau Linux 7.2, la suppression du vieux strncpy a réclamé un audit gigantesque
Depuis des décennies, les développeurs Linux utilisent une fonction nommée strncpy pour copier du texte. Développée en C, elle est étiquetée comme dangereuse par la propre documentation du noyau. Problème, elle est omniprésente.
Pour comprendre le problème, on peut utiliser une analogie. Supposons que la mémoire de l’ordinateur est comme une série de casiers. Quand un programme veut enregistrer un texte, il réserve une boite d’une certaine taille et y écrit le texte. En langage C, l’ordinateur n’a pas de moyen « naturel » pour savoir quand le mot s’arrête. Il y a donc une règle simple : quand le programme écrit un texte, il faut qu’un point rouge (caractère de fin de chaîne \0) en signale la fin.

Et c’est là que les ennuis commencent. La fonction strncpy() est responsable de la copie des textes, mais elle a un gros défaut : quand le texte est trop long, elle coupe la séquence de caractères, mais oublie d’ajouter un point. Et quand le texte est trop court ? Elle ajoute autant de points rouges que nécessaire pour remplir le champ réservé. Les conséquences vont du gaspillage d’énergie à la fuite de secrets, car l’absence de point rouge entraine l’application ou le service à lire ce qui se trouve au-delà, donc des informations présentes dans d’autres « casiers ».
Ces problèmes sont connus depuis longtemps, mais leur résolution a demandé un vaste effort d’ingénierie. Des développeurs ont ainsi passé les six dernières années à référencer toutes les occurrences de la fonction strncpy dans l’intégralité du code du noyau, totalisant 362 commits (des participations, en quelque sorte), rapporte Phoronix. La version 7.2 à venir sera donc la première à ne plus posséder strncpy, remplacé par des variantes modernes et beaucoup plus sécurisées.
Dans la plupart des cas, il s’agira de strscpy, qui possède le comportement adapté : l’outil copie du texte, mais si la séquence est trop longue, il la tronçonne en ajoutant systématiquement un point rouge à la fin de chaque morceau. Strncpy est donc supprimé définitivement à partir du prochain noyau, avec impossibilité d’y faire appel.