Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
ipv6_frag_escape — Linux LPE - Évasion fiable de jail/conteneur | Kitploit
Outils/GitHubGitHub/sgkdev/ipv6_frag_escape
Escalade de PrivilègesExploitationPost-ExploitationTests d'IntrusionRed TeamingÉvasion de ConteneurExploitation de Binaires
GitHubsgkdev/ipv6_frag_escape

ipv6_frag_escape

Linux LPE - Évasion fiable de jail/conteneur

Voir le dépôt
53145il y a 2 moisVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

IPV6_FRAG_ESCAPE

Une preuve de concept fiable d'évasion de conteneur / jail non privilégié pour CentOS / RHEL 10.

Il exploite un bug de fragmentation IPv6 désormais corrigé dans __ip6_append_data() (corrigé en amont par 38becddc, pas de CVE), un débordement linéaire dans la slab vers le skb_shared_info à la queue de l'objet head d'un paquet. Ce README documente uniquement la chaîne d'exploitation. Il ne couvre pas le déclencheur.

Portée

  • Cible : CentOS / RHEL 10 (noyau 6.12.x, par ex. 6.12.0-242.el10).
  • Point de départ : un processus non privilégié à l'intérieur d'un conteneur isolé du réseau, avec accès à des espaces de noms utilisateur non privilégiés.
  • Résultat : un shell root interactif dans les espaces de noms initiaux de l'hôte et son système de fichiers racine.

Remarques

Ceci est une preuve de concept, délibérément pas une arme clé en main. L'infrastructure de fiabilité est intentionnellement omise : pas de toilettage PCP par CPU, pas d'armure SLUB inter-cache, et la tête skb est placée dans un cache partagé, pas très silencieux. Ce qui est livré tire assez souvent pour prouver la chaîne, et pas beaucoup plus. Il est limité à CentOS / RHEL 10 uniquement.

Prérequis

  • CONFIG_INIT_ON_ALLOC_DEFAULT_ON désactivé, le paramètre par défaut de RHEL / CentOS. Cette PoC place un pointeur obsolète dans des octets de slab non initialisés ; avec init_on_alloc=1, cet emplacement est mis à zéro et cette technique particulière ne fait que planter le noyau (un déréférencement NULL). C'est une limite de la technique, pas du bug : un exploit complet qui couvre également ces noyaux, avec une technique différente, suivra une fois que le correctif et le CVE seront publics.
  • Pagination à 5 niveaux (LA57, adresses linéaires 57 bits). La marche de la table de pages est câblée pour cinq niveaux et une vérification au démarrage refuse de s'exécuter sans cela. Un processeur à 4 niveaux nécessiterait une refactorisation de la marche.
  • /sys/kernel/btf/vmlinux présent et lisible par tous (standard sur RHEL / CentOS).

Noyaux testés

DistributionNoyauRésultat
CentOS Stream 106.12.0-242.el10root, évasion de conteneur
RHEL 106.12.0-228.el10évasion du contexte httpd_t

Chaîne d'exploitation

  1. Débordement intra-slab vers un auto-UAF. Le bug donne le contrôle de l'octet unique nr_frags dans skb_shared_info. Le chemin de libération (skb_release_data()) parcourt frags[0 .. nr_frags) et effectue put_page() sur chaque entrée, et frags[] n'est jamais initialisé. Nous pré-plantons un struct page * pour une page de tampon de tube (pipe) dans cet emplacement de slab via une réutilisation contrôlée du cache, puis nous définissons nr_frags sur 1, de sorte que le démontage libère une référence sur une page que nous possédons encore. Le débordement linéaire devient une use-after-free de page. Le débordement ne touche jamais frags[0], donc il n'a pas besoin d'être synchronisé avec le spray, ce qui en fait l'essentiel de sa tolérance.

  2. UAF de page à Dirty-Pagetable. La page de tube libérée est récupérée comme table de pages de dernier niveau en provoquant une erreur sur un nouveau mappage anonyme. Une page physique est maintenant à la fois une table de pages feuille active et la page que le tube lit et écrit encore. Écrire huit octets dans le tube installe une PTE falsifiée ; lire le tube renvoie la table. Il s'agit d'une lecture/écriture physique arbitraire finie, de l'ordre de 460 fenêtres PTE par table.

Télécharger l’outil

Contrer KASLR. Avec la lecture physique, nous scannons la table de pages fixe du trampoline SMP en mémoire basse, que KASLR ne déplace jamais ; son entrée de moitié noyau pointe vers level4_kernel_pgt, la base physique du noyau. De là, init_top_pgt (reconnaissable par son entrée auto-référencée 511) est un traducteur universel du virtuel au physique, récupérant la base virtuelle du noyau et reliant notre espace d'adressage à la mémoire physique.

  • De lecture/écriture finie à infinie. Nous falsifions une PTE dans la table feuille qui pointe vers l'adresse physique de la table elle-même. La fenêtre virtuelle correspondante aliase alors la table de pages elle-même, de sorte que les PTE deviennent de la mémoire ordinaire : lecture/écriture noyau illimitée, en accès aléatoire, sans tube dans la boucle. La cohérence TLB de Ring 3 est gérée en forçant un vidage complet du mm avec un mprotect() surdimensionné.

  • Résoudre les décalages et prendre les credentials. Les décalages des membres des structures sont lus à l'exécution depuis /sys/kernel/btf/vmlinux, non intégrés en dur. Nous localisons notre propre task_struct via la marche vmemmap de struct page et mm_struct.owner, mettons à zéro les identifiants des credentials, et remplissons tous les ensembles de capacités sur cred et real_cred. Les adresses des symboles proviennent d'un résolveur interne qui analyse les propres tables kallsyms du noyau via notre lecture arbitraire ; seulement si cela échoue, nous retombons sur le pointage de cred.user_ns vers init_user_ns (afin que CAP_SYSLOG soit conservé dans l'espace de noms initial) et la lecture des adresses réelles depuis /proc/kallsyms.

  • Désactiver SELinux sans basculer le mode enforcing. Nous écrasons le prologue de avc_denied() avec un stub xor eax, eax ; ret (en sautant par-dessus endbr64 sous IBT). Chaque refus retourne maintenant accordé, à l'échelle du processus, tandis que getenforce rapporte toujours Enforcing. C'est aussi un prérequis pour l'évasion : la ré-exécution inter-domaines du gestionnaire de core-dump serait sinon refusée.

  • Évasion via core_pattern. Nous écrasons le core_pattern global avec un gestionnaire préfixé par | pointant vers notre propre binaire via /proc/<PID>/root (le chroot du conteneur de la tâche qui plante), puis nous plantons un enfant. Le noyau exécute le gestionnaire en tant que usermodehelper, root dans les espaces de noms initiaux, et nous relayons un shell root interactif via une socket Unix liée à l'intérieur du conteneur. Le gestionnaire naît dans les espaces de noms init, donc aucune manipulation d'espaces de noms sur place, et aucun des risques liés à l'espace de noms PID n'est nécessaire.