fbeta ePA3-Service-OpenSource
VAU-Server-Authentifizierungs-Bypass durch zirkuläres Zertifikatsvertrauen
fbetas ePA3-Service bezieht das Zertifikat, mit dem die signierten VAU-Public-Keys des Servers geprüft werden, vom selben Server (bei deaktivierter TLS-Prüfung) und verwirft anschließend den Rückgabewert von vau_cert_validation(). Nur eine der sechs A_24624-01-Prüfungen ist umgesetzt, sodass ein netzwerkpositionierter MITM ein selbstsigniertes Zertifikat über /CertData ausliefern, die VAU-Keys mit dem passenden privaten Schlüssel signieren und die resultierenden Session-Keys kontrollieren kann.
Beschreibung
Mangel 1: zirkuläres Vertrauen. Das Zertifikat, mit dem die signierten öffentlichen Schlüssel des Servers geprüft werden, wird vom selben Server bezogen, der gerade authentifiziert werden soll (bei deaktivierter TLS-Prüfung, verify=False). Ein netzwerkpositionierter MITM kann ein selbstsigniertes Zertifikat am /CertData-Endpunkt ausliefern und die VAU-Public-Keys mit dem passenden privaten Schlüssel signieren. Die ES256-Signaturprüfung passt dann konstruktionsbedingt.
VAUProtokoll.py:267-273
cert_endpoint = urljoin(self.AS_URL, f"/CertData.{cert_hash_hex}-{cdv}")cert_data_response = self.https_session.get( cert_endpoint, verify=False, headers={"x-useragent": USER_AGENT},)Mangel 2: verworfener Rückgabewert. vau_cert_validation() liefert auf drei Fehlerpfaden False zurück (nicht-200-Antwort auf CertData, fehlende Felder, kein EC-Schlüssel), ohne eine Exception zu werfen. Der Aufrufer verwirft den Rückgabewert und arbeitet mit den ungeprüften Schlüsseln weiter.
VAUProtokoll.py:154-156
self.vau_cert_validation(signed_vau_server_pub_keys)
pub_keys = cbor2.loads(signed_vau_server_pub_keys["signed_pub_keys"])Mangel 3: nur 1 von 6 A_24624-01-Prüfungen umgesetzt. gemSpec_Krypt A_24624-01 verlangt sechs Prüfungen auf den signierten öffentlichen Schlüsseln des Servers: ES256-Signaturprüfung, Zertifikatsketten-Prüfung gegen den TI-PKI-Root, zeitliche Gültigkeit, OCSP/CRL-Sperrprüfung, cert_hash-Integrität sowie Schlüsselverwendung / Rollen-OID. Nur die ES256-Signaturprüfung ist implementiert, und das gegen ein vom Angreifer geliefertes Zertifikat (Mangel 1). Die Felder ca und rca_chain müssen in der CertData-Antwort enthalten sein, werden aber nirgendwo für die Kettenprüfung verwendet.
VAUProtokoll.py:284-287
required_fields = ["cert", "ca", "rca_chain"]if not all(field in cert_data for field in required_fields): logger.error("Missing required fields in CertData") return FalseDie kryptografische Schicht von fbetas ePA3-Service stammt aus Andreas Hallofs Upstream vau-protokoll und erbt die Lücke in der Server-Schlüssel-Prüfung, die im gematik: VAU-Handshake führt nur 2 von 6 vorgeschriebenen Server-Schlüssel-Prüfungen aus dokumentiert ist. fbeta ergänzte einen teilweisen Validator darüber, doch dessen Rückgabewert wird verworfen und 5 der 6 vorgeschriebenen Prüfungen fehlen.
Auswirkung
- Ein netzwerkpositionierter Angreifer zwischen DiGA-Backend und ePA-Aktensystem fängt den VAU-Handshake ab, liefert eigene VAU-Public-Keys und ein selbstsigniertes Zertifikat aus und kontrolliert die resultierenden Session-Keys. Der gesamte innere HTTP-Verkehr (Medikationsdaten, Diagnoseberichte, Verordnungshistorie, Dokumenten-Reads und -Writes, Autorisierungstransaktionen) wird damit für den Angreifer lesbar und veränderbar.
- Weder Transport- noch Anwendungsschicht authentifizieren den Server. Die TLS-Prüfung ist in der Bibliothek deaktiviert (siehe fbeta: TLS-Zertifikatsprüfung universell deaktiviert) und die VAU-Zertifikatsprüfung ist zirkulär; weder Transport- noch Anwendungsschicht authentifiziert den Server auf dem Patientendaten-Kanal.
- Ein MITM, der die Session-Keys hält, kann den gesamten inneren HTTP-Verkehr auf dem VAU-Kanal lesen und modifizieren. Während eines Testlaufs las ein einzelner Relay die Einwilligungsentscheidungen dreier Versicherter, modifizierte die Antworten und schleuste einen dritten Patientendatensatz ein, alles mit einem selbstsignierten Zertifikat ohne CA-Kette.
Abhilfe
Aktualisieren Sie fbeta ePA3-Service-OpenSource auf 1.3.0 oder höher. Der Fix setzt die Zertifikatsketten-Prüfung gegen den TI-PKI-Root um, liest den Rückgabewert von vau_cert_validation() aus und bricht bei Fehlschlag ab, und ergänzt die übrigen A_24624-01-Prüfungen (cert_hash-Integrität gegen SHA-256(cert_der), zeitliche Gültigkeit, OCSP sowie die Rollen-OID oid_epa_vau). TI-PKI-Root-Zertifikate liegen nicht im Standard-Truststore des Systems; sie müssen aus der veröffentlichten TI-PKI von gematik (gemSpec_PKI, Anhang TI-Root-CA) bezogen und explizit gepinnt werden.
Checkliste für Betreiber
Auf fbeta ePA3-Service-OpenSource 1.3.0 oder höher aktualisieren.
Alle Versionen vor 1.3.0 sind betroffen; zwischen 1.0.1 und dem Fix gibt es keine Zwischenreleases. Der Fix liegt in Pull Request #12.
Prüfen, dass die Trust-Anchors tatsächlich ausgeliefert werden.
Der Fix benötigt die TI-PKI-Root-Zertifikate zur Laufzeit. Stellen Sie sicher, dass Ihr Deployment sie aus dem TI-Root-CA-Bundle des gemSpec_PKI lädt und nicht aus dem Standard-Truststore des Systems, der sie nicht enthält.
Eigene Aufrufer von vau_cert_validation() prüfen.
Wenn Sie einen Fork oder einen abgeleiteten Wrapper dieser Bibliothek pflegen, prüfen Sie jede Aufrufstelle: Der boolesche Rückgabewert muss gelesen werden, und ein Fehlschlag muss den Handshake abbrechen. Ein verworfener Rückgabewert entspricht keiner Prüfung.
Mit selbstsigniertem Gegenpart testen.
Bauen Sie einen lokalen VAU-Gegenpart, der auf Message 2 mit angreiferkontrollierten öffentlichen Schlüsseln, selbstsigniertem
certund beliebigensignatureEs256-Bytes antwortet. Der Client muss den Handshake ablehnen. Falls nicht, ist der Validator nicht eingehängt.
Bewertung im Detail
/CertData-Endpunkt reicht aus. Keine Zeit- oder Umgebungsbedingungen.PR:NAußer der Netzwerkposition selbst werden keine Credentials benötigt.UI:NDas DiGA-Backend initiiert den VAU-Handshake nach seinem eigenen Zeitplan.S:UDie Auswirkung ist auf den VAU-Kanal und die ePA-Payloads beschränkt, die er transportiert.C:HKlartext-Zugriff auf ePA-Dokumenten-Reads und Metadaten jeder Betroffenen, deren DiGA diese Bibliothek nutzt.I:HKlartext-Zugriff auf und Modifikation von ePA-Dokumenten-Writes und Autorisierungsflüssen.A:NKeine Auswirkung auf die Verfügbarkeit.Referenzen
- GHSA-q2jw-6c4w-86jc (fbeta)
- fbeta-ePA3-Service-OpenSource-PR #12 (Fix)
- fbeta-ePA3-Service-OpenSource-Repository
- gemSpec_Krypt A_24624-01 (Client-Prüfung der signierten öffentlichen Server-Schlüssel)
- Verwandt: Deaktivierte TLS-Zertifikatsprüfung
- Verwandter Upstream: Fehlende VAU-Server-Authentifizierung in gematik lib-vau
- Verwandt: ePA-VAU-Client-Sicherheit (Übersicht)
So können wir helfen
Wer wir sind
Die Sicherheitsforscher hinter diesem Sicherheitshinweis.

Dr. rer. nat. Simon Weber
Senior Pentester & MedSec-Forscher
Ich evaluiere Ihr SaMD mit derselben branchenprägenden Sicherheitsexpertise, die ich dem BAK MV für die Überarbeitung des B3S-Standards beigetragen habe.
- Promotion über Krankenhaus-Cybersicherheit
- Kritische Schwachstellen in Krankenhaussystemen gefunden
- Alumni der THB MedSec-Forschungsgruppe
- gematik Security Hero

Dipl.-Inf. Volker Schönefeld
Senior Application Security Expert
Als ehemaliger CTO und Entwickler, der zum Pentester wurde, arbeite ich mit Ihrem Team zusammen, um Schwachstellen aufzudecken und Lösungen zu finden, die zu Ihrer Architektur passen.
- 20+ Jahre als CTO, 50+ Mio. App-Downloads
- Architektur und Absicherung großer IoT-Flotten
- Certified Web Exploitation Specialist
- gematik Security Hero
Penetrationstest gesucht?
Machine Spirits ist spezialisiert auf Sicherheitsbewertungen für Medizinprodukte und Gesundheits-IT. Von MDR-Penetrationstests bis C5-Cloud-Compliance helfen wir MedTech-Unternehmen, regulatorische Anforderungen zu erfüllen.
