
CVE-2020-13277 Полигон: логическая уязвимость Gitlab — несанкционированный доступ любого пользователя к приватным репозиториям
CVE-2020-13277 Лаборатория: логическая уязвимость Gitlab — несанкционированный доступ любого пользователя к приватным репозиториям
CVE-2020-13277
├── README.md ............... [данный файл README]
├── imgs .................... [изображения, дополняющие описание в README]
├── gitlab .................. [каталог монтирования контейнера Gitlab]
│ ├── Dockerfile .......... [Docker-файл сборки Gitlab]
│ ├── config .............. [каталог монтирования конфигурации Gitlab]
│ ├── data ................ [каталог монтирования данных Gitlab]
│ ├── logs ................ [каталог монтирования журналов Gitlab]
│ ├── keys ................ [каталог хранения взломанной лицензии Gitlab]
│ └── runner .............. [каталог монтирования контейнера Runner]
├── license ................. [каталог сборки контейнера для взлома лицензии]
│ ├── Dockerfile .......... [Docker-файл сборки лицензии]
│ └── license.rb .......... [Ruby-скрипт генерации взломанной лицензии]
├── docker-compose.yml ...... [конфигурация сборки Docker]
├── keygen.ps1 .............. [Windows: создание взломанной лицензии одной командой]
├── keygen.sh ............... [Linux: создание взломанной лицензии одной командой]
├── run.ps1 ................. [Windows: запуск лаборатории Gitlab одной командой]
├── run.sh .................. [Linux: запуск лаборатории Gitlab одной командой]
├── register.ps1 ............ [Windows: регистрация Runner одной командой]
├── register.sh ............. [Linux: регистрация Runner одной командой]
├── stop.ps1 ................ [Windows: остановка лаборатории Gitlab одной командой]
└── stop.sh ................. [Linux: остановка лаборатории Gitlab одной командой]
Ядро данной уязвимости — использование функции зеркальной синхронизации и резервного копирования репозиториев Mirror Repository.
Направление синхронизации Mirror бывает двух видов:
Данная уязвимость использует Mirror Repository в направлении Pull
Следует знать, что Gitlab делится на два варианта: CE (бесплатная версия для сообщества) и EE (платная версия для предприятия), а Gitlab официально заявляет, что эта уязвимость затрагивает следующие версии как CE, так и EE:
>=10.6, <12.9.10>=12.10, <12.10.11>=13.0, <13.0.6Но это не означает, что Gitlab Docker Image этих версий можно использовать для создания лаборатории, поскольку:
Иными словами, для развёртывания лаборатории с помощью Docker остаётся только Gitlab-EE, который необходимо взломать (состоятельные также могут купить License), чтобы активировать функцию Mirror Repository - Pull.
Но даже после взлома Gitlab-EE, будь то 10.x, 12.x или 13.x, когда URL для Mirror Repository - Pull содержит локальный путь, появляется ошибка Import url is blocked: Requests to localhost are not allowed.
Хотя после установки параметра Allow requests to the local network from hooks and services в разделе Admin area => Settings => Network => Outbound requests локальный URL настроить можно, при синхронизации зеркала возникает ошибка 2:Fetching remote upstream failed: fatal: unable to access http://127.0.0.1/xxxx/: The requested URL returned error: 301. Иными словами, работать будет только Pull Remote Repository.
К счастью, хотя в 12.x и 13.x проверка локального URL очень строгая, в версии 10.x есть способ обойти её: при настройке Pull URL достаточно указать имя локально настроенного DNS-сервиса.
Таким образом, для построения данной лаборатории в итоге подходит только Docker Image версии gitlab-ee:10.6.0-ee.0.
Собственно, из описанного выше видно, что условия эксплуатации этой уязвимости довольно жёсткие, и в основном небогатым пользователям она вряд ли угрожает
./keygen.sh или ./keygen.ps1./run.sh или ./run.ps1При генерации ключевой пары для взлома открытый ключ уже был записан внутрь контейнера Gitlab; осталось загрузить закрытый ключ через веб-интерфейс, чтобы завершить взлом:
./gitlab/keys/; скопируйте содержимое файла .gitlab-license (закрытый ключ)Enter license key, вставьте закрытый ключ и нажмите кнопку Upload license — взлом завершёнНа этом функция Mirror Repository - Pull активирована

Outbound requests, отметьте флажком Allow requests to the local network from hooks and services и сохраните измененияНа этом Mirror Repository - Pull поддерживает втягивание локальных Repository

./register.sh $TOKEN или ./register.ps1 $TOKENНа этом все Repository смогут использовать этот Runner для выполнения CI-скриптов (Pipeline Jobs)
