Remarque perev. : Hier soir, Aleksa Sarai, un ingénieur conteneur senior chez SUSE Linux, a déclaré à la liste de diffusion oss-sec une vulnérabilité de sécurité runc / LXC critique qui pourrait permettre à un attaquant ayant accès à un conteneur isolé d'obtenir des privilèges root sur le système hôte. Étant donné que le problème a été identifié dans l'implémentation de référence du runtime de conteneur - runc - il affecte de nombreux systèmes de conteneur, dont Docker / Moby, Podman , cri-o (et Kubernetes lui-même). Les détails sont présentés ci-dessous sous la forme de la traduction d'un message d'un ingénieur en une liste de diffusion.Je suis l'un des mainteneurs de runc (le runtime de conteneur sous-jacent utilisé par Docker, cri-o, containerd, Kubernetes, etc.). Récemment, nous avons découvert une vulnérabilité que nous avons vérifiée et corrigée.
Chercheurs qui ont découvert la vulnérabilité:
- Adam Iwaniuk;
- Borys Popławski.
De plus, Aleksa Sarai (c'est-à-dire I) a découvert que le LXC est également affecté par une version plus sophistiquée de cette vulnérabilité.
Brève revue
La vulnérabilité permet à un conteneur malveillant (avec une interaction utilisateur minimale) d'écraser le binaire de l'hôte runc et ainsi être en mesure d'exécuter du code avec des privilèges root sur l'hôte. Le degré d'interaction de l'utilisateur est tel qu'il vous permet d'exécuter n'importe quelle commande (peu importe si l'attaquant contrôle la commande) avec des privilèges root dans le conteneur dans l'un de ces contextes:
- Création d'un nouveau conteneur à partir d'une image contrôlée par un attaquant;
- Connexion (
docker exec
) à un conteneur existant auquel l'attaquant avait précédemment accès en écriture.
Cette vulnérabilité n'est
bloquée ni par la stratégie AppArmor par défaut ni par la stratégie par défaut SELinux dans Fedora * (car les processus de conteneur semblent avoir commencé avec
container_runtime_t
). Cependant, il est
bloqué par l' utilisation correcte des espaces de noms utilisateur (où la racine de l'hôte ne correspond pas à l'espace de noms utilisateur du conteneur).
Le vecteur CVSSv3 (avec une note de 7,2) est le suivant:
AV:L/AC:H/PR:L/UI:R/S:C/C:N/I:H/A:H
Le
problème est attribué
CVE-2019-5736 .
* Le problème s'applique uniquement au package moby-engine
dans Fedora. Le package docker
, comme podman
, est protégé de son fonctionnement, car il démarre les processus de container_t
tant que container_t
.Patchs
0001-nsenter-clone-proc-self-exe-to-avoid-exposing-host-b.patch
le correctif approprié pour résoudre le problème (
0001-nsenter-clone-proc-self-exe-to-avoid-exposing-host-b.patch
). Il est basé sur la branche
HEAD
, bien que le code dans
libcontainer/nsenter/
change si rarement que le correctif s'applique très probablement à presque toutes les anciennes versions de la base de code runc que vous traitez.
Veuillez noter que le
patch que je pousse vers la branche master runc est une version modifiée de ce patch, bien qu'ils soient fonctionnellement identiques (si vous n'avez pas encore patché vos fichiers avec le patch attaché, nous vous recommandons d'utiliser la version en amont).
Code d'exploitation secondaire
Certains fournisseurs ont demandé un code d'exploitation pour s'assurer que les correctifs résolvaient le problème. Étant donné que le problème est très grave (en particulier pour les fournisseurs de cloud public), nous avons décidé de fournir un tel code. L'exploit que j'ai écrit est plus général que le code original fourni par les chercheurs et fonctionne pour LXC (il ne nécessite pas de modifications importantes pour pouvoir s'appliquer à d'autres environnements exécutables vulnérables). Les détails sur l'utilisation du code d'exploitation sont fournis dans le
README
.
Conformément aux règles d'OpenWall, le code d'exploitation sera rendu
public 7 jours après la CRD (c'est-à-dire le 18 février 2019).
Si vous disposez d'un runtime de conteneur, assurez-vous qu'il n'est pas affecté par cette vulnérabilité.Impact sur d'autres projets
Il convient de noter que lors d'une enquête plus approfondie sur le problème, j'ai constaté que le LXC a une vulnérabilité similaire, et ils ont déjà poussé un
patch similaire
de notre développement conjoint. LXC est un peu plus difficile à utiliser, mais le problème lui-même est le même.
Une discussion avec des représentants de systemd-nspawn a conduit à la conclusion qu'ils ne sont pas vulnérables (car ils ont une méthode différente de connexion au conteneur pour LXC et runc).
Des représentants d'Apache Mesos m'ont également contacté, signalant qu'ils sont également vulnérables (je pense qu'ils ont simplement utilisé le code d'exploitation qui sera publié). Il est très probable que la plupart des durées d'exécution des conteneurs soient vulnérables si elles n'ont pas pris auparavant des mesures très inhabituelles pour atténuer leur impact potentiel.
Autres actualités
Nous avons configuré la distribution d'annonces pour les futures vulnérabilités de sécurité: le processus de la rejoindre est décrit
ici (il est basé sur la liste de diffusion Kubernetes security-announce). Veuillez vous joindre si vous distribuez des temps d'exécution pour les conteneurs qui dépendent de runc (ou d'autres projets OCI).
PS Du traducteur
Problème CVE-2019-5736 dans les trackers des distributions Linux populaires:
... et l'
article de blog Kubernetes (consultez la section «Que dois-je faire?»).