News - Logiciels Libres

Chronologie de l'attaque contre le logiciel libre xz

| | Logiciels Libres | 8 Commentaires | 2709
Chronologie de l'attaque contre le logiciel libre xz
Bonjour à tous,

Je vous propose une traduction française d'un excellent article récapitulant la chronologie de l'attaque contre le logiciel libre xz dont vous retrouvez la source dans les sources en bas de l'article.
Je sais que certains d'entre vous ont des difficultés à comprendre l'Anglais, voici donc le tout en Français


Pendant plus de deux ans, un attaquant utilisant le nom de "Jia Tan" a travaillé comme un contributeur diligent et efficace à la bibliothèque de compression xz, se voyant finalement accorder l'accès au commit et à la maintenance. Grâce à cet accès, il a installé une porte dérobée très subtile et soigneusement cachée dans liblzma, une partie de xz qui se trouve également être une dépendance d'OpenSSH sshd sur Debian, Ubuntu, Fedora et d'autres systèmes Linux basés sur systemd. Cette porte dérobée permet à l'attaquant d'envoyer des commandes cachées au début d'une session SSH, ce qui lui donne la possibilité d'exécuter une commande arbitraire sur le système cible sans se connecter : une exécution de code à distance ciblée et non authentifiée.

L'attaque a été rendue publique le 29 mars 2024 et semble être la première attaque sérieuse connue de la chaîne d'approvisionnement contre un logiciel open source largement utilisé. Elle marque un tournant dans la sécurité de la chaîne d'approvisionnement des logiciels libres, pour le meilleur ou pour le pire.

Ce billet est une chronologie détaillée que j'ai construite sur l'aspect ingénierie sociale de l'attaque, qui semble remonter à la fin de l'année 2021. Les événements clés sont indiqués en gras.

Prologue

2005-2008 : Lasse Collin, avec l'aide d'autres personnes, conçoit le format de fichier .xz en utilisant l'algorithme de compression LZMA, qui compresse les fichiers à environ 70 % de ce que fait gzip Au fil du temps, ce format est largement utilisé pour compresser les fichiers tar, les images du noyau Linux et bien d'autres choses encore.
https://github.com/kobolabs/liblzma/blob/87b7682ce4b1c849504e2b3641cebaad62aaef87/doc/history.txt

Jia Tan entre en scène, avec des acteurs de renom

2021-10-29 : Jia Tan envoie un premier patch inoffensif à la liste de diffusion xz-devel, ajoutant le fichier ".editorconfig".
https://www.mail-archive.com/[email protected]/msg00512.html

2021-11-29 : Jia Tan envoie un second patch inoffensif à la liste de diffusion xz-devel, corrigeant un problème de compilation apparemment reproductible. D'autres correctifs qui semblent (même rétrospectivement) être corrects suivent.
https://www.mail-archive.com/[email protected]/msg00519.html

2022-04-19 : Jia Tan envoie encore un autre correctif inoffensif à la liste de diffusion xz-devel.
https://www.mail-archive.com/[email protected]/msg00553.html

2022-04-22 : "Jigar Kumar" envoie le premier d'une série de courriels se plaignant du fait que le correctif de Jia Tan n'a pas atterri. ("Les correctifs passent des années sur cette liste de diffusion. Il n'y a aucune raison de penser que quelque chose va arriver bientôt"). À ce stade, Lasse Collin a déjà intégré quatre des correctifs de Jia Tan, marqués par "Thanks to Jia Tan" dans le message de livraison.
https://www.mail-archive.com/[email protected]/msg00557.html

2022-05-19 : "Dennis Ens" envoie un mail à xz-devel pour demander si XZ pour Java est maintenu.
https://www.mail-archive.com/[email protected]/msg00562.html

2022-05-19 : Lasse Collin répond en s'excusant pour la lenteur et ajoute "Jia Tan m'a aidé en dehors de la liste avec XZ Utils et il pourrait avoir un rôle plus important à l'avenir, au moins avec XZ Utils. Il est clair que mes ressources sont trop limitées (d'où les nombreux courriels en attente de réponses), il faut donc que quelque chose change à long terme."
https://www.mail-archive.com/[email protected]/msg00563.html

2022-05-27 : Jigar Kumar envoie un email de pression au fil de discussion sur les correctifs. "Plus d'un mois et pas plus près d'être fusionné. Ce n'est pas une surprise.
https://www.mail-archive.com/[email protected]/msg00565.html

2022-06-07 : Jigar Kumar envoie un email de pression au fil de discussion Java. "Il n'y aura pas de progrès tant qu'il n'y aura pas de nouveau mainteneur. Dennis, vous feriez mieux d'attendre qu'il y ait un nouveau mainteneur ou de forker vous-même. Soumettre des patchs ici n'a plus de sens de nos jours. Le mainteneur actuel s'est désintéressé ou n'a plus envie de maintenir. C'est triste à voir pour un repo comme celui-ci."
https://www.mail-archive.com/[email protected]/msg00566.html

2022-06-08 : Lasse Collin se défend. "Je n'ai pas perdu l'intérêt, mais ma capacité à m'occuper du projet a été assez limitée, principalement à cause de problèmes de santé mentale à long terme, mais aussi à cause d'autres choses. Récemment, j'ai travaillé hors liste avec Jia Tan sur XZ Utils et peut-être qu'il aura un rôle plus important à l'avenir, nous verrons. Il est également bon de garder à l'esprit qu'il s'agit d'un projet de loisir non rémunéré."
https://www.mail-archive.com/[email protected]/msg00567.html

2022-06-10 : Lasse Collin fusionne le premier commit avec Jia Tan comme auteur dans les métadonnées git ("Tests : Created tests for hardware functions").
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=aa75c5563a760aea3aa23d997d519e702e82726b

2022-06-14 : Jugar Kumar envoie un email de pression. "Avec votre rythme actuel, je doute fort de voir la version 5.4.0 sortir cette année. Le seul progrès depuis avril a été de petits changements dans le code de test. Vous ignorez les nombreux patchs qui pourrissent sur cette liste de diffusion. En ce moment vous étouffez votre repo. Pourquoi attendre la version 5.4.0 pour changer de mainteneur ? Pourquoi retarder ce dont votre repo a besoin ?"
https://www.mail-archive.com/[email protected]/msg00568.html

2022-06-21 : Dennis Ens envoie un courriel de pression. "Je suis désolé pour vos problèmes de santé mentale, mais il est important d'être conscient de ses propres limites. Je comprends que c'est un projet de loisir pour tous les contributeurs, mais la communauté veut plus. Pourquoi ne pas renoncer à la maintenance de XZ for C pour pouvoir accorder plus d'attention à XZ pour Java ? Ou transmettre XZ pour Java à quelqu'un d'autre pour qu'il se concentre sur XZ pour C ? Essayer de maintenir les deux signifie que ni l'un ni l'autre ne sont bien maintenus".
https://www.mail-archive.com/[email protected]/msg00569.html

2022-06-22 : Jigar Kumar envoie un courriel de pression au fil de discussion sur le correctif C. "Est-ce qu'il y a des progrès sur ce sujet ? Jia, je vois que tu as des commits récents. Pourquoi ne peux-tu pas faire ce commit toi-même ?"
https://www.mail-archive.com/[email protected]/msg00570.html

2022-06-29 : Lasse Collin répond : "Comme je l'ai laissé entendre dans des emails précédents, Jia Tan pourrait avoir un rôle plus important dans le projet à l'avenir. Il a beaucoup aidé en dehors de la liste et est déjà pratiquement un co-mainteneur. :-) Je sais qu'il ne s'est pas encore passé grand chose dans le dépôt git, mais les choses se font à petits pas. Dans tous les cas, un changement de mainteneur est déjà en cours, au moins pour XZ Utils".

Jia Tan devient mainteneur

À ce stade, Lasse semble avoir commencé à travailler encore plus étroitement avec Jia Tan. Evan Boehs observe que Jigar Kumar et Dennis Ens avaient tous deux des adresses électroniques nameNNN@mailhost qui n'apparaissaient jamais ailleurs sur Internet, ni dans xz-devel. Il est probable qu'il s'agissait de faux créés pour pousser Lasse à donner plus de contrôle à Jia. Cela a fonctionné. Au cours des mois suivants, Jia a commencé à répondre aux fils de discussion sur xz-devel en faisant autorité sur la version 5.4.0 à venir.

2022-09-27 : Jia Tan donne un résumé de la version 5.4.0. ("La version 5.4.0 qui contiendra le décodeur multi thread est prévue pour décembre. La liste des problèmes ouverts liés à la 5..4.0 [sic] en général que je suis sont...")
https://www.mail-archive.com/[email protected]/msg00593.html

2022-11-30 : Lasse Collin change l'email de rapport de bogue de son adresse personnelle à un alias qui va à lui et Jia Tan, note dans le README que "les mainteneurs du projet Lasse Collin et Jia Tan peuvent être contactés via [email protected]".
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=764955e2d4f2a5e8d6d6fec63af694f799e050e7

2022-12-30 : Jia Tan fusionne son premier commit directement dans le repo xz ("CMake : Update .gitignore for CMake artifacts from in source build"). À ce stade, nous savons qu'ils ont accès au commit.
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=8ace358d65059152d9a1f43f4770170d29d35754

2023-01-11 : Lasse Collin marque et construit sa version finale, v5.4.1.
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=18b845e69752c975dfeda418ec00eda22605c2ee

2023-03-18 : Jia Tan marque et construit sa première version, v5.4.2.
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=6ca8046ecbc7a1c81ee08f544bfd1414819fb2e8

2023-03-20 : Jia Tan met à jour la configuration de Google oss-fuzz pour leur envoyer des bogues.
https://github.com/google/oss-fuzz/commit/6403e93344476972e908ce17e8244f5c2b957dfd

2023-06-22 : Hans Jansen envoie une paire de correctifs, fusionnés par Lasse Collin, qui utilisent la fonction "GNU indirect function" pour sélectionner une fonction CRC rapide au démarrage. Le dernier commit est retravaillé par Lasse Collin et fusionné par Jia Tan. Ce changement est important car il fournit une possibilité par laquelle le code obfusqué peut modifier les tables de fonctions globales avant qu'elles ne soient remappées en lecture seule. Alors que ce changement pourrait être une innocente optimisation de performance en soi, Hans Jansen revient en 2024 pour promouvoir le code backdoor xz et sinon il n'existe pas sur internet.
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=23b5c36fb71904bfbe16bb20f976da38dadf6c3b
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=b72d21202402a603db6d512fb9271cfa83249639
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=ee44863ae88e377a5df10db007ba9bfadde3d314

2023-07-07 : Jia Tan désactive le support de ifunc pendant les constructions de oss-fuzz, prétendant que ifunc est incompatible avec l'assainisseur d'adresses. Cela peut être inoffensif en soi, mais c'est aussi un travail de fond pour utiliser ifunc plus tard.
https://github.com/google/oss-fuzz/commit/d2e42b2e489eac6fe6268e381b7db151f4c892c5

2024-01-19 : Jia Tan déplace le site web vers les pages GitHub, leur donnant le contrôle de la page web XZ Utils. Lasse Collin a probablement créé les enregistrements DNS pour le sous-domaine xz.tukaani.org qui pointe vers les pages GitHub. Après la découverte de l'attaque, Lasse Collin a supprimé cet enregistrement DNS pour revenir à tukaani.org, qu'il contrôle.
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=c26812c5b2c8a2a47f43214afe6b0b840c73e4f5

Début de l'attaque

2024-02-23 : Jia Tan fusionne le code binaire d'une porte dérobée bien caché dans certains fichiers d'entrée de tests binaires. Le README disait déjà (bien avant que Jia Tan n'apparaisse) "Ce répertoire contient un tas de fichiers pour tester la gestion des fichiers .xz, .lzma (LZMA_Alone), et .lz (lzip) dans les implémentations de décodeurs. La plupart des fichiers ont été créés à la main avec un éditeur hexadécimal, il n'y a donc pas de meilleur "code source" que les fichiers eux-mêmes". Disposer de ce type de fichiers de test est très courant pour ce genre de bibliothèque. Jia Tan en a profité pour ajouter quelques fichiers qui ne seraient pas examinés attentivement.
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=cf44e4b7f5dfdbf8c78aef377c10f71e274f63c0

2024-02-24 : Jia Tan marque et construit la v5.6.0 et publie une distribution xz-5.6.0.tar.gz avec un build-to-host.m4 supplémentaire et malveillant qui ajoute la porte dérobée lors de la construction d'un paquet deb/rpm. Ce fichier m4 n'est pas présent dans le dépôt des sources, mais de nombreux autres fichiers légitimes sont également ajoutés lors de la construction du paquet, il n'est donc pas suspect en soi. Mais le script a été modifié par rapport à la copie habituelle pour ajouter la porte dérobée.
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=2d7d862e3ffa8cec4fd3fdffcd84e984a17aa429

2024-02-24 : Gentoo commence à voir des crashs dans la version 5.6.0. Cela semble être un bug d'ifunc, plutôt qu'un bug dans la porte dérobée cachée, puisque c'est le premier xz avec les changements d'ifunc de Hans Jansen.
https://bugs.gentoo.org/925415

2024-02-26 : Debian ajoute xz-utils 5.6.0-0.1 à unstable.
https://tracker.debian.org/news/1506761/accepted-xz-utils-560-01-source-into-unstable/

2024-02-28 : Debian ajoute xz-utils 5.6.0-0.2 à unstable.
https://tracker.debian.org/news/1507917/accepted-xz-utils-560-02-source-into-unstable/

2024-02-29 : Sur GitHub, @teknoraver envoie une pull request pour arrêter de lier liblzma à libsystemd. Il semble que cela aurait fait échouer l'attaque. Kevin Beaumont spécule que le fait de savoir que cela était sur le point de se produire a pu accélérer le calendrier de l'attaquant. Il n'est pas clair s'il existe des discussions antérieures qui les auraient mis la puce à l'oreille.
https://github.com/systemd/systemd/pull/31550
https://doublepulsar.com/inside-the-failed-attempt-to-backdoor-ssh-globally-that-got-caught-by-chance-bbfe628fafdd

2024-02-28 : Jia Tan casse la détection de landlock dans le script configure en ajoutant une typo subtile dans le programme C utilisé pour vérifier le support des landlocks. Le script configure essaye de construire et d'exécuter le programme C pour vérifier le support des blocs, mais comme le programme C a une erreur de syntaxe, il ne sera jamais construit et exécuté, et le script décidera toujours qu'il n'y a pas de support des blocs. Lasse Collin est listé comme le committer ; il peut avoir manqué la subtile coquille, ou l'auteur peut être falsifié. Probablement le premier, puisque Jia Tan n'a pas pris la peine de forger un committer sur ses nombreux autres changements. Ce patch semble préparer quelque chose d'autre que la modification de sshd, puisque le support de landlock fait partie de la commande xz et non de liblzma. Ce qui n'est pas clair exactement.
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=a100f9111c8cc7f5b5f0e4a5e8af3de7161c7975
https://docs.kernel.org/userspace-api/landlock.html

2024-03-04 : Les distributions RedHat commencent à voir des erreurs Valgrind dans _get_cpuid de liblzma (l'entrée de la porte dérobée). La course est lancée pour corriger cela avant que les distributions Linux ne creusent trop profondément.
https://bugzilla.redhat.com/show_bug.cgi?id=2267598

2024-03-05 : Le pull request libsystemd est fusionné pour supprimer liblzma. Une autre course est lancée, pour obtenir la porte dérobée de liblzma avant que les distributions ne cassent complètement l'approche.
https://github.com/systemd/systemd/commit/3fc72d54132151c131301fc7954e0b44cdd3c860

2024-03-05 : Debian ajoute xz-utils 5.6.0-0.2 à testing.
https://tracker.debian.org/news/1509743/xz-utils-560-02-migrated-to-testing/

2024-03-05 : Jia Tan apporte deux corrections de bogues pour ifunc. Ceux-ci semblent être de vrais correctifs pour le bogue ifunc actuel. Un commit fait un lien vers le bogue de Gentoo et corrige également un bogue de GCC en amont.
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=4e1c97052b5f14f4d6dda99d12cbbd01e66e3712
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114115

2024-03-08 : Jia Tan livre un prétendu correctif Valgrind. C'est une fausse piste, mais elle est efficace.
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=82ecc538193b380a21622aea02b0ba078e7ade92

2024-03-09 : Jia Tan met à jour les fichiers de la porte dérobée. Il s'agit de la correction Valgrind actuelle, qui modifie les deux fichiers de test contenant le code d'attaque. "Les fichiers originaux ont été générés de manière aléatoire sur ma machine. Pour mieux reproduire ces fichiers à l'avenir, une graine constante a été utilisée pour recréer ces fichiers."
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=74b138d2a6529f2c07729d7c77b1725a8e8b16f1

2024-03-09 : Jia Tan marque et construit la version 5.6.1 et publie la distribution xz 5.6.1, qui contient une nouvelle porte dérobée.
https://git.tukaani.org/?p=xz.git;a=commitdiff;h=fd1b975b7851e081ed6e5cf63df946cd5cbdbb94

2024-03-20 : Lasse Collin envoie à LKML un ensemble de correctifs remplaçant son email personnel avec lui-même et Jia Tan comme mainteneurs du code de compression xz dans le noyau. Il n'y a aucune indication que Lasse Collin ait agi de manière malveillante ici, il a juste nettoyé les références à lui-même en tant que seul mainteneur. Bien sûr, Jia Tan a pu en être l'instigateur, et la possibilité d'envoyer des correctifs xz au noyau Linux aurait été un bon point d'appui pour les travaux futurs de Jia Tan. Nous n'avons pas encore atteint le niveau de confiance, mais ce serait un pas de plus.
https://lkml.org/lkml/2024/3/20/1009
https://lkml.org/lkml/2024/3/20/1008

2024-03-25 : Hans Jansen est de retour (!), déposant un bogue Debian pour obtenir la mise à jour de xz-utils vers la version 5.6.1. Comme dans la campagne de pression 2022, plus d'adresses name###@mailhost qui n'existent pas sur internet se manifestent pour plaider en faveur de cette mise à jour.
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1067708

2024-03-28 : Jia Tan dépose un bogue Ubuntu pour obtenir la mise à jour de xz-utils vers la version 5.6.1 de Debian.
https://bugs.launchpad.net/ubuntu/+source/xz-utils/+bug/2059417

Attaque détectée

2024-03-28 : Andres Freund découvre le bogue, notifie en privé Debian et distros@openwall. RedHat assigne le CVE-2024-3094.

2024-03-28 : Debian revient sur la version 5.4.5, introduisant la version 5.6.1+really5.4.5-1.
https://tracker.debian.org/news/1515519/accepted-xz-utils-561really545-1-source-into-unstable/

2024-03-29 : Andres Freund poste un avertissement de porte dérobée sur la liste publique oss-security@openwall, disant qu'il l'a trouvé "au cours des dernières semaines".
https://www.openwall.com/lists/oss-security/2024/03/29/4

2024-03-29 : RedHat annonce que la porte dérobée xz a été livrée dans Fedora Rawhide et Fedora Linux 40 beta.
https://www.redhat.com/en/blog/urgent-security-alert-fedora-41-and-rawhide-users

2024-03-30 : Debian arrête les constructions pour reconstruire leurs machines de construction en utilisant Debian stable (au cas où le malware xz aurait échappé à leur bac à sable ?).
https://fulda.social/@Ganneff/112184975950858403


Ce qui suit est un ajout de ma part :
Et depuis les distributions Linux concernées ont communiqué et ont corrigé les paquets :

Fedora / Red Hat :
=> Suivi chez RH https://bugzilla.redhat.com/show_bug.cgi?id=2272210
=> Fedora Rawhide (Dev concernée), depuis le paquet a été retiré : Downgrade à faire : https://bodhi.fedoraproject.org/updates/FEDORA-2024-d02c7bb266
=> Fedora 38 + 39 non concernées (stables) et beta de 40 succintement (dans updates-testing quelques heures) https://packages.fedoraproject.org/pkgs/xz/xz/

OpenSuse :
=> Non concerné sur Leap et SLES : https://www.suse.com/c/suse-addresses-supply-chain-attack-against-xz-compression-library/
=> Seule TW est concernée https://build.opensuse.org/request/show/1163302 Downgrade a faire

Debian :
=> Stable non concerné https://packages.debian.org/bookworm/xz-utils
=> Testing + Sid concernées et downgrade fait https://lists.debian.org/debian-security-announce/2024/msg00057.html
=> Kali Linux (distrib orientée sécu basée sur ... Testing concernée) : https://www.kali.org/blog/about-the-xz-backdoor/

Ubuntu :
=> 22.04 LTS non concerné https://packages.ubuntu.com/jammy/xz-utils
=> 23.10 Non concerné https://packages.ubuntu.com/mantic/xz-utils
=> Future 24.04 non concernée => pas de comm d'ubuntu https://packages.ubuntu.com/noble/xz-utils

Gentoo :
=> Affectée aussi https://bugs.gentoo.org/show_bug.cgi?id=928134 (probablement pas OpenRC)
=> Paquets masqués : https://packages.gentoo.org/packages/app-arch/xz-utils (auparavant Testing pas stable)

Arch :
=> Concernée : https://archlinux.org/news/the-xz-package-has-been-backdoored/
=> Pas de retour a 5.4 mais suppression des fichiers .m4 https://security.archlinux.org/AVG-2851

En espérant que ce résumé vous a plu !