
Démo autonome d'exploitation d'une RCE GitLab tirant parti de deux bugs de corruption mémoire Ruby dans le parser Oj via le rendu de diffs de notebooks.
Ce dépôt contient une démo autonome de la chaîne RCE notebook-diff de GitLab décrite dans nos recherches. Il démarre un conteneur GitLab 18.11.3 vierge, crée un utilisateur ordinaire via l’interface HTTP publique, puis exécute le PoC contre cette instance.
Détails techniques : En profondeur : obtenir une RCE GitLab via deux vulnérabilités de corruption mémoire de Ruby
amd64)Tout d’abord, construisez un environnement GitLab vierge :
./setup_env.sh
Cette commande supprime le conteneur de démonstration précédent et ses volumes, démarre GitLab, attend qu’il soit prêt, puis crée un utilisateur normal. Un démarrage à froid de GitLab peut prendre plusieurs minutes.
Ouvrez deux terminaux. Lancez le listener de callback dans le premier :
./run_poc.sh listen 4555
Exécutez l’exploit dans le second :
./run_poc.sh exploit 4555
Lorsque le callback arrive, passez au terminal du listener et exécutez des commandes comme id ou whoami. Le temps de recherche ASLR varie d’une exécution à l’autre.

GitLab affiche les diff de notebooks Jupyter en transmettant du JSON contrôlé par le dépôt à Oj, un parseur JSON natif en Ruby. La chaîne combine deux bugs du parseur : l’un corrompt l’état du parseur et finit par contrôler un pointeur de callback, tandis que l’autre divulgue un pointeur de tas (heap) utilisé pour réduire la recherche ASLR. Le PoC charge une table de correspondance précalculée, trouve l’agencement de bibliothèque correspondant via des requêtes HTTP GitLab normales, puis fait en sorte que le worker Puma se reconnecte au listener en tant qu’utilisateur git.
Utilisez cette démo uniquement dans l’environnement de laboratoire local inclus.