
Champ de tir CVE-2020-13277 : Vulnérabilité logique Gitlab - accès non autorisé de tout utilisateur au référentiel privé
CVE-2020-13277 Environnement de test : Vulnérabilité logique Gitlab - Accès non autorisé à un dépôt privé par un utilisateur quelconque
CVE-2020-13277
├── README.md ............... [Ce fichier README]
├── imgs .................... [Images pour illustrer le README]
├── gitlab .................. [Répertoire monté pour le conteneur Gitlab]
│ ├── Dockerfile .......... [Fichier de construction Docker pour Gitlab]
│ ├── config .............. [Répertoire monté pour la configuration Gitlab]
│ ├── data ................ [Répertoire monté pour les données Gitlab]
│ ├── logs ................ [Répertoire monté pour les logs Gitlab]
│ ├── keys ................ [Répertoire de stockage de la licence craquée Gitlab]
│ └── runner .............. [Répertoire monté pour le conteneur Runner]
├── license ................. [Répertoire de construction du conteneur de licence craquée]
│ ├── Dockerfile .......... [Fichier de construction Docker pour la licence]
│ └── license.rb .......... [Script Ruby pour générer la licence craquée]
├── docker-compose.yml ...... [Configuration de construction Docker]
├── keygen.ps1 .............. [Windows : Génération en un clic de la licence craquée]
├── keygen.sh ............... [Linux : Génération en un clic de la licence craquée]
├── run.ps1 ................. [Windows : Lancement en un clic de l'environnement Gitlab]
├── run.sh .................. [Linux : Lancement en un clic de l'environnement Gitlab]
├── register.ps1 ............ [Windows : Enregistrement en un clic du Runner]
├── register.sh ............. [Linux : Enregistrement en un clic du Runner]
├── stop.ps1 ................ [Windows : Arrêt en un clic de l'environnement Gitlab]
└── stop.sh ................. [Linux : Arrêt en un clic de l'environnement Gitlab]
Cette vulnérabilité exploite principalement la fonctionnalité Mirror Repository - synchronisation et sauvegarde des dépôts via miroir.
La direction de synchronisation du miroir se divise en deux types :
Cette vulnérabilité exploite le miroir de type Pull
Il faut savoir que Gitlab se décline en deux versions : CE (Community Edition gratuite) et EE (Enterprise Edition payante), et que Gitlab affirme officiellement que cette vulnérabilité affecte les versions suivantes des deux éditions :
>=10.6, <12.9.10>=12.10, <12.10.11>=13.0, <13.0.6Cependant, cela ne signifie pas que toutes ces versions de l'image Docker Gitlab peuvent être utilisées pour construire l'environnement de test, car :
En d'autres termes, pour construire l'environnement de test avec Docker, il faut utiliser la version Gitlab-EE et la craquer (les riches peuvent aussi acheter une licence) pour activer la fonctionnalité Pull du miroir de dépôt.
Même après avoir craqué Gitlab-EE, que ce soit en version 10.x, 12.x ou 13.x, lorsque l'URL de Pull du miroir de dépôt contient un chemin local, une erreur Import url is blocked: Requests to localhost are not allowed se produit.
Bien qu'il soit possible de configurer des URL locales en allant dans Admin area => Settings => Network => Outbound requests et en cochant Allow requests to the local network from hooks and services, lors de la synchronisation du miroir, une erreur 2:Fetching remote upstream failed: fatal: unable to access http://127.0.0.1/xxxx/: The requested URL returned error: 301 apparaît. Autrement dit, seul le Pull d'un dépôt distant est fonctionnel.
Heureusement, bien que les versions 12.x et 13.x soient très strictes dans la validation des URL locales, la version 10.x offre une parade : lors de la configuration de l'URL de Pull, il suffit d'utiliser le nom DNS local défini pour contourner la restriction.
En résumé, la seule version possible pour construire cet environnement de test est l'image Docker gitlab-ee:10.6.0-ee.0.
En réalité, comme mentionné précédemment, les conditions d'exploitation de cette vulnérabilité sont assez restrictives, ce qui fait que les utilisateurs peu fortunés sont rarement affectés.
./keygen.sh ou ./keygen.ps1./run.sh ou ./run.ps1Lors de la génération de la paire de clés, la clé publique a déjà été écrite dans le conteneur Gitlab en arrière-plan. Il reste à téléverser la clé privée via l'interface frontale pour terminer le craquage :
./gitlab/keys/. Copiez le contenu du fichier .gitlab-license (clé privée).Enter license key, collez la clé privée, puis cliquez sur Upload license pour finaliser le craquage.La fonctionnalité Pull du miroir de dépôt est désormais activée.

Outbound requests et cochez Allow requests to the local network from hooks and services, puis sauvegardez.Désormais, le Pull du miroir de dépôt peut tirer depuis un dépôt local.
