
Ojパーサーにおける2つのRubyメモリ破壊バグをノートブックの差分レンダリングを通じて悪用する、GitLab RCEの自己完結型デモ。
このリポジトリには、当社の調査で説明した GitLab notebook-diff RCE チェーンを再現する自己完結型デモが含まれています。フレッシュな GitLab 18.11.3 コンテナを起動し、パブリックな HTTP インターフェースを通じて一般ユーザーを作成し、そのインスタンスに対して PoC を実行します。
技術詳細: Going depthfirst: Achieving GitLab RCE via Two Ruby Memory Corruption Vulnerabilities
amd64) 上の Linuxまず、フレッシュな GitLab 環境を構築します:
./setup_env.sh
これにより、以前のデモコンテナとそのボリュームが削除され、GitLab が起動し、準備完了になるまで待機してから、通常のユーザーをプロビジョニングします。新しい GitLab の起動には数分かかる場合があります。
2 つのターミナルを開きます。最初のターミナルでコールバックリスナーを起動します:
./run_poc.sh listen 4555
2 番目のターミナルでエクスプロイトを実行します:
./run_poc.sh exploit 4555
コールバックが届いたら、リスナーのターミナルに切り替えて id や whoami などのコマンドを実行します。ASLR の探索時間は実行ごとに異なります。

GitLab は、リポジトリが制御する JSON をネイティブな Ruby JSON パーサーである Oj に渡すことで、Jupyter ノートブックの差分をレンダリングします。このチェーンは 2 つのパーサーのバグを組み合わせます。1 つはパーサーの状態を破壊して最終的にコールバックポインターを制御し、もう 1 つは ASLR 探索範囲を絞り込むために使用されるヒープポインターを開示します。PoC は事前計算されたルックアップテーブルを読み込み、通常の GitLab HTTP リクエストを通じて一致するライブラリレイアウトを見つけ、Puma ワーカーを git ユーザーとしてリスナーに接続させます。
このデモは、同梱のローカルラボ環境でのみ使用してください。