Twenty: Klartext-Passwörter für IMAP, SMTP und CalDAV über die `/metadata`-GraphQL-API

Jedes Mitglied eines Workspaces liest mit einer einzigen GraphQL-Abfrage das Klartext-Passwort, den Host, den Port und den Benutzernamen der Mailkonten aller anderen Mitglieder.

Advisory-ID: TP-2026-080
Produkt: Twenty (Open-Source-CRM)
Schwachstellentyp: Unzureichend geschützte Zugangsdaten (CWE-522)
CVE: CVE-2026-105763
CVSS 3.1: 9.6 (Kritisch) · CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N
Betroffene Versionen: >= 1.20.10, < 2.7.0
Hersteller-Advisory: GHSA-mq5c-qp77-2cv3
Behoben in: 2.7.0
Gemeldet: 16. Mai 2026

Zusammenfassung

Twenty ist ein Open-Source-CRM, in dem Nutzer ihre Mailkonten per IMAP, SMTP und CalDAV anbinden, damit Nachrichten und Termine im CRM erscheinen. Die Abfrage connectedAccounts der /metadata-GraphQL-API gab die Verbindungsparameter jedes verbundenen Kontos im Workspace heraus, und für IMAP-, SMTP- und CalDAV-Verbindungen enthielt dieses Objekt das Passwort, das zu dem Zeitpunkt im Klartext gespeichert war. Weil das Feld die Schutzannotation nicht trug, die seine Nachbarfelder tragen, die Abfrage nicht auf das aufrufende Konto eingegrenzt war und die Sichtbarkeit eines Kontos nicht durchgesetzt wurde, las jedes Mitglied Passwort, Host, Port und Benutzernamen der Mailkonten aller anderen Mitglieder desselben Workspaces. Die Standardrolle Member genügte, eine Nutzerinteraktion war nicht nötig. Workspaces, die ausschließlich Google- oder Microsoft-OAuth nutzen, waren nicht betroffen.

Ursache

Die Abfrage connectedAccounts lieferte die Verbindungsparameter aller verbundenen Konten des Workspaces, weil der dahinterliegende Lookup allein über workspaceId filtert (packages/twenty-server/src/engine/metadata-modules/connected-account/connected-account-metadata.service.ts:40-42, Resolver in packages/twenty-server/src/engine/metadata-modules/connected-account/resolvers/connected-account.resolver.ts:51-57). Das Feld connectionParameters war ein regulärer GraphQL-Ausgabewert, während die benachbarten Geheimnisse accessToken, refreshToken und oidcTokenClaims im selben DTO mit @HideField() aus dem Schema genommen sind (packages/twenty-server/src/engine/metadata-modules/connected-account/dtos/connected-account.dto.ts:58-60, Nachbarn auf :32, :35, :67). Der referenzierte Ausgabetyp führt password als gewöhnliches Feld, und ein Kommentar an derselben Stelle hält die Klartextspeicherung als bewusste Entscheidung fest (packages/twenty-server/src/engine/core-modules/imap-smtp-caldav-connection/dtos/imap-smtp-caldav-connection.dto.ts:55-56 und :20-26). Der Guard des Resolvers prüft nur das Berechtigungsflag für verbundene Konten, das die Standardrolle Member besitzt, und das Sichtbarkeitsattribut eines Kontos (connected-account.dto.ts:93-95) wurde nie ausgewertet. Version 2.7.0 setzt @HideField() auf connectionParameters, leitet myConnectedAccounts über buildPublicConnectedAccount, grenzt die Lookups auf die userWorkspaceId des Aufrufers ein und verschlüsselt die Zugangsdaten at rest.

Proof of Concept

POST /metadata
Authorization: Bearer <Token eines Workspace-Mitglieds, Standardrolle Member>

query {
  connectedAccounts {
    handle
    connectionParameters {
      IMAP   { host port username password }
      SMTP   { host port username password }
      CALDAV { host port username password }
    }
  }
}

-> die Antwort traegt fuer jedes Mitglied des Workspaces das Passwort im Klartext

Das Feld password ist Teil des Schemas und damit auswählbar, und der Lookup grenzt nur auf den Workspace ein. Eine einzige Abfrage genügt, ohne Entschlüsselung, ohne verkettete Primitive und ohne Nutzerinteraktion.

Auswirkung

  • Offenlegung von Klartext-Passwort, Host, Port und Benutzername jedes IMAP-, SMTP- und CalDAV-Kontos im selben Workspace.
  • Vollzugriff auf das Postfach des Opfers beim externen Anbieter: Mails lesen, versenden und löschen.
  • Übernahme von Drittkonten über Passwort-Zurücksetzen an die kontrollierte Mailadresse.
  • Zugriff auf die verbundenen Kalender über die CalDAV-Zugangsdaten.

Referenzen

Steckt so etwas in Ihrer Software?

Diese Schwachstelle hat unser Team im Rahmen seiner Arbeit gefunden. Lassen Sie Ihre Anwendungen von denselben Spezialisten prüfen, mit einem Penetrationstest von turingpoint.