Zum Inhalt springen

Eigene Forschung

CVE-2026-110787: Wie der MCP-Endpunkt von pREST die expose-Einstellungen umging

Von Lucas Weber, CyberSec42 · Stand 28.10.2026

Schematische Darstellung eines MCP-Servers zwischen KI-Client und Zielsystem

CVE-2026-110787 ist eine Schwachstelle in der Zugriffskontrolle (CWE-284) des Open-Source-Projekts pREST: Der MCP-Endpunkt /_mcp beachtete die Einstellungen im Abschnitt [expose] nicht und listete Datenbanken, Schemata, Tabellen und Spaltennamen auch dann auf, wenn der Betreiber diese Auflistung abgeschaltet hatte. Die GitHub-Advisory GHSA-x62p-38px-pp73 bewertet sie mit CVSS 5.3 (mittel) und führt das Go-Modul github.com/prest/prest/v2 bis einschließlich Version 2.4.0 als betroffen, behoben ist sie in 2.4.1 vom 29.07.2026. Betroffen waren nur Installationen, die [expose] aktiv zum Verbergen ihres Katalogs nutzten, und sichtbar wurden Namen, keine Tabelleninhalte über das hinaus, was die Zugriffsregeln ohnehin erlaubten.

Kurz gefasst.

Hintergrund

Was pREST ist und was [expose] regelt.

Zum Abschnitt

Die Schwachstelle

Mechanik in einfachen Worten und technisch.

Zum Abschnitt

Wer betroffen war

Versionen und Konfigurationen.

Zum Abschnitt

Behebung

Was der Fix ändert und was Betreiber tun sollten.

Zum Abschnitt

Zeitleiste

Nur öffentlich belegte Daten.

Zum Abschnitt

Das Muster dahinter

Ein neuer MCP-Zugang neben einer alten Kontrolle.

Zum Abschnitt

Die Fakten auf einen Blick

MerkmalAngabe
KennungCVE-2026-110787 (zugeteilt), GHSA-x62p-38px-pp73
ProduktpREST (prest/prest), Go-Modul github.com/prest/prest/v2
KlasseUmgehung einer Zugriffskontrolle; CWE-284 „Improper Access Control“
SchwereCVSS 3.1: 5.3, mittel (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N); mit aktivierter Authentifizierung laut Advisory 4.3 (PR:L)
Betroffenalle Versionen bis einschließlich 2.4.0
Behoben2.4.1, veröffentlicht am 29.07.2026
VeröffentlichtGitHub-Advisory am 29.07.2026; CVE-Eintrag im CVE-Verzeichnis am 28.10.2026 noch nicht veröffentlicht
CreditGemeldet von CyberSec42 (GitHub: lwebmedia)

Hintergrund: Was pREST ist und was [expose] regelt

pREST ist ein in Go geschriebenes Open-Source-Projekt unter MIT-Lizenz. Es stellt für eine bestehende PostgreSQL-Datenbank, seit Version 2.5 auch für MySQL, ohne eigenen Backend-Code eine REST-API bereit: Lesen, Schreiben, Filtern, eigene SQL-Routen, Authentifizierung und Zugriffsregeln. Seit Version 2.1.0 vom 09.07.2026 bietet derselbe Server zusätzlich einen Endpunkt nach dem Model Context Protocol (MCP) unter /_mcp. Über ihn können KI-Agenten den Datenbankkatalog erkunden, Tabellen beschreiben und Zeilen lesen. Der Endpunkt ist laut Dokumentation bewusst nur lesend und nutzt dieselbe Authentifizierung und dieselben Zugriffsregeln wie die REST-API.

Für das Verständnis dieser Schwachstelle sind zwei Konfigurationsabschnitte wichtig, die pREST ausdrücklich voneinander trennt:

Beide Abschnitte sind standardmäßig offen: expose.enabled steht auf false, damit ist alles auflistbar, und access.restrict ebenfalls auf false. Auch die Authentifizierung (auth.enabled) ist in der Standardkonfiguration ausgeschaltet. Wer pREST öffentlich betreibt, schaltet diese Schutzschichten also bewusst ein. Grundsätzliches zur Absicherung von MCP-Servern steht in unserem Leitfaden zu MCP-Servern; hier geht es um den konkreten Fall.

Die Schwachstelle

In einfachen Worten

Stellen Sie sich ein Bürogebäude vor, das sein Mieterverzeichnis im Foyer abgehängt hat, damit Besucher nicht sehen, welche Firmen im Haus sitzen. Wer in welches Büro darf, regelt weiterhin die Zugangskarte, daran ändert das Verzeichnis nichts. Dann öffnet das Gebäude einen zweiten Eingang, und dort hängt das vollständige Verzeichnis noch an der Wand, samt Raumplan.

So verhielt sich pREST bis Version 2.4.0. Das abgehängte Verzeichnis sind die [expose]-Einstellungen für die REST-Routen, der zweite Eingang ist /_mcp, die Zugangskarte ist [access].

Technisch

pREST setzt [expose] an genau einer Stelle durch, in der ExposureMiddleware. Sie hängt im globalen Middleware-Stapel, sobald expose.enabled aktiv ist, und vergleicht den Pfad jeder Anfrage mit drei festen Präfixen: /databases, /schemas und /tables. Passt ein Präfix und ist die zugehörige Einstellung false, antwortet der Server mit HTTP 401 („unauthorized listing“). Jeder andere Pfad wird ohne Prüfung durchgereicht.

/_mcp passt auf keines der drei Präfixe. Die MCP-Werkzeuge prest.list_databases, prest.list_schemas und prest.list_tables lieferten denselben Katalog wie die REST-Routen, fragten die [expose]-Konfiguration aber nicht ab. Hinzu kam die Discovery-Antwort auf ein einfaches GET /_mcp: Sie zählt die verfügbaren Werkzeuge auf, darunter je ein Lesewerkzeug pro Tabelle, dessen Name Datenbank, Schema und Tabelle trägt und dessen Beschreibung die Spaltennamen enthält. Ein Aufrufer, dem GET /databases korrekt verweigert wurde, sah den Katalog über /_mcp also vollständig, ohne ein einziges Werkzeug aufzurufen.

Wichtig für die Einordnung: Die Lesewerkzeuge auf /_mcp unterlagen weiterhin [access]. Mit access.restrict = true filterte pREST auch die Schema- und Tabellenlisten nach diesen Regeln, laut Advisory mit Ausnahme der Datenbankliste. Offengelegt wurden Metadaten, nicht der Inhalt von Tabellen, die der Aufrufer nicht ohnehin hätte lesen dürfen.

Zur Einordnung des Vektors: PR:N spiegelt die dokumentierte Standardkonfiguration, in der auth.enabled ausgeschaltet ist und /_mcp keine Anmeldung verlangt. Ist die Authentifizierung aktiv, braucht der Aufrufer ein gültiges Konto mit beliebigen Rechten; die Advisory nennt dafür PR:L und einen Basiswert von 4.3. C:L steht für einen begrenzten Verlust an Vertraulichkeit, Integrität und Verfügbarkeit sind nicht betroffen. Wir haben beide Basiswerte anhand der Formel der CVSS-3.1-Spezifikation nachgerechnet.

Schematischer Ablauf

Aufrufer fragt den Katalog ab ExposureMiddleware prüft drei Pfade GET /databases 401, verweigert /_mcp liefert den Katalog greift wie vorgesehen bis 2.4.0 ungeprüft
Bis 2.4.0 prüfte die ExposureMiddleware nur die drei REST-Pfade, /_mcp lief ungeprüft durch. Ab 2.4.1 prüfen auch die MCP-Werkzeuge die [expose]-Einstellungen.
  1. Der Betreiber setzt expose.enabled = true und schaltet die Auflistung von Datenbanken, Schemata oder Tabellen ab.
  2. Ein Aufrufer, der den HTTP-Endpunkt von pREST erreicht, fragt /databases ab und erhält korrekt eine Ablehnung.
  3. Derselbe Aufrufer ruft /_mcp ab. Die Middleware erkennt den Pfad nicht als Katalogroute und reicht die Anfrage weiter.
  4. Die Discovery-Antwort und die Listenwerkzeuge des MCP-Endpunkts geben Datenbank-, Schema-, Tabellen- und Spaltennamen zurück.
  5. Welche Tabelleninhalte der Aufrufer danach lesen kann, bestimmt weiterhin [access], genau wie bei einer direkten REST-Abfrage.

Wir veröffentlichen bewusst keinen Exploit-Code. Die Beschreibung reicht, um die eigene Installation einzuordnen und den Fix nachzuvollziehen.

Wer betroffen war

Die Advisory führt das Go-Modul github.com/prest/prest/v2 in allen Versionen bis einschließlich 2.4.0 als betroffen. Den Endpunkt /_mcp gibt es laut Release-Notes und Dokumentation erst seit Version 2.1.0; im Quellcode von 2.0.0 ist er nicht registriert. Praktisch relevant war die Schwachstelle nur für Betreiber, die [expose] tatsächlich zum Verbergen ihres Katalogs eingesetzt hatten.

KonfigurationEinordnung bis 2.4.0
Version vor 2.1.0Kein MCP-Endpunkt, der beschriebene Weg besteht nicht
expose.enabled = false (Standard)Der Katalog ist über REST und MCP gleichermaßen auflistbar, so ist es konfiguriert. Die Schwachstelle ändert daran nichts
expose.enabled = true mit abgeschalteten Listen, Authentifizierung ausBetroffen. Jeder, der den HTTP-Endpunkt erreicht, sah den Katalog über /_mcp (CVSS 5.3)
expose.enabled = true mit abgeschalteten Listen, Authentifizierung anBetroffen für jedes angemeldete Konto, unabhängig von seinen Rechten (CVSS 4.3)
zusätzlich access.restrict = trueSchema- und Tabellenlisten auf /_mcp waren auf das begrenzt, was die Zugriffsregeln dem Aufrufer erlauben; die Datenbankliste nicht

Wie viel ein offengelegter Katalog im Einzelfall verrät, hängt von den Namen ab. Tabellen wie orders sagen wenig, Schemata, die nach Kunden oder Projekten benannt sind, mehr. Und davon, wer den HTTP-Endpunkt erreichen konnte: nur der lokale Rechner, ein internes Netz oder das Internet.

Behebung und was Betreiber jetzt tun sollten

Was der Fix in 2.4.1 ändert

Die Korrektur (Pull Request #1016) definiert an einer zentralen Stelle, was [expose] erlaubt: drei Prüffunktionen für Datenbank-, Schema- und Tabellenlisten. Die REST-Middleware und die MCP-Werkzeuge fragen seitdem dieselben Funktionen ab. Ein Kommentar im Code begründet das ausdrücklich damit, dass ein neuer Discovery-Endpunkt die Kontrolle nicht mehr unbemerkt umgehen soll.

Auf /_mcp bedeutet das laut Dokumentation: Ist eine Liste abgeschaltet, verschwindet das passende prest.list_*-Werkzeug aus der Discovery-Antwort, und ein direkter Aufruf endet mit „unauthorized listing“. Ist irgendeine Liste abgeschaltet, zählt die Discovery-Antwort auch die Lesewerkzeuge pro Tabelle nicht mehr auf, weil deren Namen und Beschreibungen den Katalog verraten würden. Die allgemeinen Werkzeuge prest.describe_table und prest.select_table bleiben im Rahmen von [access] verfügbar, für Aufrufer, die ihr Ziel bereits kennen. Der Fix ergänzt Tests für genau diese Fälle und erweitert den Kommentar in der Beispielkonfiguration um den MCP-Endpunkt. Derselbe Commit enthält außerdem eine davon unabhängige Härtung der Parameterprüfung für Skripte, die nicht Gegenstand dieser Advisory ist.

Empfehlungen für Betreiber

Die folgenden Schritte sind unsere Empfehlungen, keine Vorgaben des Projekts.

SchrittMaßnahme
1. Version prüfenAuf 2.4.1 oder neuer aktualisieren. Die jüngste veröffentlichte Version am 28.10.2026 ist 2.5.2.
2. Wirkung nachprüfenWenn Sie [expose] nutzen: nach dem Update an Ihrer eigenen Installation prüfen, dass die Discovery-Antwort von /_mcp keine Tabellen- und Spaltennamen mehr aufzählt.
3. Daten über [access] schützenVertrauliche Tabellen nicht durch Verbergen schützen, sondern mit access.restrict = true und Freigaben je Tabelle, Feld und Nutzer.
4. Authentifizierung einschaltenIst pREST über das lokale Netz hinaus erreichbar, auth.enabled aktivieren. /_mcp nutzt dieselbe Authentifizierung wie die REST-Routen.
5. Ungenutzten Endpunkt sperrenWer MCP nicht verwendet, kann /_mcp am Reverse Proxy sperren. Diese Übergangsmaßnahme nennt auch die Advisory.
6. Protokolle sichtenWenn Ihr Reverse Proxy Zugriffe protokolliert: nach Anfragen an /_mcp aus unerwarteten Quellen suchen.

Zeitleiste

Aufgeführt sind nur Daten, die sich aus öffentlichen Quellen belegen lassen.

DatumEreignisBeleg
09.07.2026Release 2.1.0 führt den MCP-Endpunkt /_mcp einGitHub-Release v2.1.0, Dokumentation
27.07.2026Release 2.4.0, die letzte betroffene Version; geprüft wurde laut Advisory der Quellcode dieses StandsGitHub-Release v2.4.0, Advisory
27.07.2026Advisory im Repository angelegtGitHub-API der Advisory
29.07.2026Fix gemergt (Pull Request #1016), GHSA-x62p-38px-pp73 veröffentlicht, Release 2.4.1GitHub
28.10.2026CVE-2026-110787 ist in der Advisory eingetragen; der Eintrag im CVE-Verzeichnis ist noch nicht veröffentlichtAdvisory, CVE-API von MITRE

Zwischen dem Anlegen der Advisory und der korrigierten Version lagen damit zwei Tage. Wann die CVE-Nummer zugeteilt wurde, ist öffentlich nicht dokumentiert und deshalb nicht aufgeführt.

Das Muster dahinter: Ein neuer MCP-Zugang umgeht eine bestehende Kontrolle

Hinter CVE-2026-110787 steht ein Muster, das mit dem Einzug von MCP häufiger werden dürfte. Ein bewährtes Produkt hat eine Zugriffskontrolle, die an bestimmten Routen hängt. Später kommt ein MCP-Endpunkt hinzu, der dieselben Daten über einen neuen Weg liefert. Die alte Kontrolle kennt den neuen Weg nicht, und niemand bemerkt es, weil die alten Routen weiterhin korrekt ablehnen. Für den Betreiber sieht die Einstellung wirksam aus.

In unserer Erläuterung der OWASP MCP Top 10 entspricht das der Klasse 8, Autorisierung, die über die Protokollfläche ungleich angewandt wird, mit einem Einschlag von Klasse 4, einer Kontrolle, die mehr verspricht, als sie abdeckt. Für Entwickler, die einer bestehenden Anwendung einen MCP-Zugang geben, lassen sich daraus vier Regeln ableiten:

Für Betreiber gilt die Kehrseite: Ein MCP-Endpunkt in einer bestehenden Anwendung ist eine zusätzliche Schnittstelle zu Ihren Daten. Prüfen Sie, ob alle Einstellungen, auf die Sie sich verlassen, dort ebenfalls greifen. Weitere dokumentierte Funde dieser Art finden Sie auf unserer Seite Forschung.

Dank an die Maintainer von pREST

Wir danken den Maintainern von pREST für die schnelle und sachliche Zusammenarbeit in der koordinierten Offenlegung. Die Meldung lief vertraulich als Security-Advisory im Repository. Zwei Tage nach dem Anlegen der Advisory waren Fix, Tests, angepasste Dokumentation und Release 2.4.1 veröffentlicht, die Advisory nennt CyberSec42 als Melder. Die Korrektur behebt nicht nur den gemeldeten Weg, sondern bündelt [expose] in einer zentralen Definition, auf die sich auch künftige Discovery-Endpunkte stützen können.

Zum Vorgehen: Wir haben ausschließlich den öffentlichen Quellcode des Projekts geprüft. Laut Advisory wurde keine laufende pREST-Instanz, keine Datenbank und kein fremdes System kontaktiert, alle Beispielwerte in der Meldung sind erfunden, und auf GitHub wurden keine Issues, Pull Requests, Kommentare oder Branches angelegt oder verändert.

Greifen Ihre Zugriffsregeln auch auf dem MCP-Endpunkt?

Wir prüfen MCP-Server und KI-Agenten im schriftlich vereinbarten Umfang: ob bestehende Kontrollen auf jedem Zugang gleich greifen, was Discovery-Antworten preisgeben, wie Authentifizierung und Zugriffsregeln zusammenspielen und was ein Werkzeugaufruf tatsächlich erreicht. Jeder Befund kommt mit einem nachvollziehbaren Nachweis und einem konkreten Korrekturvorschlag. Mehr dazu unter KI-Pentest & MCP-Sicherheit.

KI-Pentest anfragen

CyberSec42 ist eine unabhängige technische Sicherheitsprüfung, keine akkreditierte Zertifizierungsstelle und keine Rechtsberatung. CyberSec42 steht in keiner Verbindung zum pREST-Projekt.

Häufige Fragen

Was ist CVE-2026-110787?

Eine Schwachstelle in der Zugriffskontrolle von pREST (CWE-284). Der MCP-Endpunkt /_mcp listete Datenbanken, Schemata, Tabellen und Spaltennamen auf, obwohl der Betreiber diese Auflistung per [expose] abgeschaltet hatte. Die GitHub-Advisory GHSA-x62p-38px-pp73 bewertet sie mit CVSS 5.3 (mittel). Die CVE-Nummer ist zugeteilt, der Eintrag im CVE-Verzeichnis war am 28.10.2026 noch nicht veröffentlicht.

Welche Versionen von pREST sind betroffen?

Laut Advisory alle Versionen des Go-Moduls github.com/prest/prest/v2 bis einschließlich 2.4.0. Den MCP-Endpunkt gibt es seit 2.1.0. Behoben ist die Schwachstelle in 2.4.1 vom 29.07.2026. Aktualisieren Sie auf 2.4.1 oder neuer.

Konnten Angreifer darüber Tabelleninhalte lesen?

Nicht über das hinaus, was die Zugriffsregeln ohnehin erlaubten. [expose] steuert laut Dokumentation nur die Auffindbarkeit, den Datenzugriff regelt [access], und das galt für /_mcp genauso wie für die REST-Routen. Sichtbar wurden Namen von Datenbanken, Schemata, Tabellen und Spalten. Wer vertrauliche Tabellen nur durch Verbergen geschützt hatte, sollte [access] konfigurieren.

Bin ich betroffen, wenn ich [expose] nicht nutze?

Nein, nicht im Sinne dieser Schwachstelle. Mit der Standardeinstellung expose.enabled = false ist der Katalog über REST und MCP gleichermaßen auflistbar, so ist er konfiguriert. Aktualisieren sollten Sie trotzdem, weil sich die Konfiguration später ändern kann.

Wurde die Schwachstelle aktiv ausgenutzt?

Die öffentlichen Quellen, also Advisory, Release-Notes und Dokumentation, treffen dazu keine Aussage. Wir haben ausschließlich Quellcode geprüft und keine laufenden Installationen untersucht.

Weiterlesen

Quellen