
Автономное демо RCE для GitLab, эксплуатирующее две ошибки повреждения памяти в парсере Oj для Ruby через рендеринг диффов блокнотов.
Этот репозиторий содержит автономную демонстрацию цепочки RCE через notebook-diff в GitLab, описанной в нашем исследовании. Он запускает свежий контейнер GitLab 18.11.3, создаёт обычного пользователя через публичный HTTP-интерфейс и выполняет PoC против этого экземпляра.
Технические подробности: Going depthfirst: Achieving GitLab RCE via Two Ruby Memory Corruption Vulnerabilities
amd64)Сначала создайте свежее окружение GitLab:
./setup_env.sh
Этот скрипт удаляет предыдущий контейнер демо и его тома, запускает GitLab, ожидает его готовности и создаёт обычного пользователя. Первичная загрузка GitLab может занять несколько минут.
Откройте два терминала. Запустите прослушиватель обратных вызовов в первом:
./run_poc.sh listen 4555
Запустите эксплойт во втором:
./run_poc.sh exploit 4555
Когда придёт обратный вызов, переключитесь на терминал прослушивателя и выполняйте команды, например id или whoami. Время поиска ASLR варьируется от запуска к запуску.

GitLab отображает диффы Jupyter notebook, передавая управляемый репозиторием JSON в Oj — нативный парсер JSON для Ruby. Цепочка сочетает две ошибки парсера: одна повреждает состояние парсера и в итоге управляет указателем обратного вызова, а другая раскрывает указатель на кучу, который используется для сужения поиска ASLR. PoC загружает предварительно вычисленную таблицу поиска, находит соответствующую компоновку библиотеки через обычные HTTP-запросы к GitLab и заставляет Puma worker подключиться обратно к прослушивателю от имени пользователя git.
Используйте эту демонстрацию только во включённой локальной лабораторной среде.