
Demo autocontenido para RCE en GitLab que explota dos vulnerabilidades de corrupción de memoria de Ruby en el parser Oj mediante el renderizado de diff de notebooks.
Este repositorio contiene una demo autónoma de la cadena de RCE en el notebook-diff de GitLab descrita en nuestra investigación. Inicia un contenedor limpio de GitLab 18.11.3, crea un usuario normal a través de la interfaz HTTP pública y ejecuta el PoC contra esa instancia.
Detalles técnicos: Profundizando: Cómo lograr RCE en GitLab mediante dos vulnerabilidades de corrupción de memoria en Ruby
amd64)Primero, crea un entorno GitLab limpio:
./setup_env.sh
Esto elimina el contenedor de la demo anterior y sus volúmenes, inicia GitLab, espera a que esté listo y aprovisiona un usuario normal. Un arranque limpio de GitLab puede tardar varios minutos.
Abre dos terminales. Inicia el listener de callback en la primera:
./run_poc.sh listen 4555
Ejecuta el exploit en la segunda:
./run_poc.sh exploit 4555
Cuando llegue el callback, cambia a la terminal del listener y ejecuta comandos como id o whoami. El tiempo de búsqueda de ASLR varía entre ejecuciones.

GitLab renderiza los diffs de notebooks de Jupyter pasando JSON controlado por el repositorio a Oj, un parser JSON nativo de Ruby. La cadena combina dos bugs del parser: uno corrompe el estado del parser y acaba controlando un puntero de callback, mientras que el otro revela un puntero del heap que se utiliza para acotar la búsqueda de ASLR. El PoC carga una tabla de búsqueda precalculada, encuentra la disposición de la biblioteca coincidente mediante peticiones HTTP normales a GitLab y hace que el worker de Puma se conecte de vuelta al listener como el usuario git.
Usa esta demo únicamente en el entorno de laboratorio local incluido.