Zum Inhalt springen

Eigene Forschung

CVE-2026-114123: Fehlende Authentifizierung im D365 F&O MCP Server erklärt

Von Lucas Weber, CyberSec42 · Stand 28.10.2026

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

CVE-2026-114123 ist eine fehlende Authentifizierung durch einen unsicheren Standardwert im Open-Source-Projekt D365 F&O MCP Server (npm-Paket d365fo-mcp): Die offizielle Azure-One-Click-Bereitstellung setzte den API-Schlüssel standardmäßig auf einen leeren Wert, und mit leerem Schlüssel ließ der Server jede Anfrage ohne Anmeldung durch. Wer der Anleitung folgte und das optionale Feld leer ließ, stellte damit einen öffentlich erreichbaren Endpunkt bereit, über den indexierter, proprietärer X++-Quellcode und Metadaten aus Dynamics 365 Finance & Operations abrufbar waren. Die Schwachstelle ist mit CVSS 7.5 (hoch) bewertet, betrifft alle Versionen bis einschließlich 1.10.1 und ist in Version 1.11.0 behoben; gemeldet hat sie CyberSec42.

Kurz gefasst.

Hintergrund

Was der Server tut und was in seinem Index liegt.

Zum Abschnitt

Die Schwachstelle

Mechanik in einfachen Worten und technisch.

Zum Abschnitt

Wer betroffen war

Versionen und Bereitstellungswege.

Zum Abschnitt

Behebung

Was der Fix ändert und was Betreiber tun sollten.

Zum Abschnitt

Zeitleiste

Nur öffentlich belegte Daten.

Zum Abschnitt

Das Muster dahinter

Optionale Anmeldung als unsicherer Standard.

Zum Abschnitt

Die Fakten auf einen Blick

MerkmalAngabe
KennungCVE-2026-114123, GHSA-8764-fh3m-wf7g
ProduktD365 F&O MCP Server (dynamics365ninja/d365fo-mcp-server), npm-Paket d365fo-mcp
KlasseCWE-306 „Missing Authentication for Critical Function“, CWE-1188 „Insecure Default Initialization of Resource“
SchwereCVSS 3.1: 7.5, hoch (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)
Betroffenalle Versionen bis einschließlich 1.10.1
Behoben1.11.0, veröffentlicht am 13.08.2026
VeröffentlichtGitHub-Advisory am 12.08.2026, CVE-Eintrag am 21.10.2026 (GitHub als CVE Numbering Authority)
CreditGemeldet von CyberSec42 (GitHub: lwebmedia), als Reporter in der GitHub-Advisory

Hintergrund: Was der D365 F&O MCP Server ist

Das Model Context Protocol (MCP) ist ein offener Standard, über den KI-Assistenten Werkzeuge und Datenquellen ansprechen. Ein MCP-Server nimmt die Werkzeugaufrufe eines KI-Clients entgegen und beantwortet sie aus einem Zielsystem. Der D365 F&O MCP Server ist laut CVE-Eintrag ein MCP-Server, um X++-Code und Metadaten von Dynamics 365 Finance & Operations abzufragen. Entwickler nutzen ihn, damit ein KI-Assistent beim Schreiben von X++ auf die echten Klassen, Tabellen, Felder und Labels des eigenen Systems zurückgreifen kann.

Dafür baut der Server einen Index, eine Symboldatenbank aus dem PackagesLocalDirectory der D365-Umgebung. Die Sicherheitsrichtlinie des Projekts beschreibt den Inhalt deutlich: X++-Quellcode-Ausschnitte, die Verknüpfung von Erweiterungen und Event-Handlern, Sicherheitsrollen, Privilegien und Duties sowie Label-Texte, ausdrücklich einschließlich der eigenen, kundenspezifischen Modelle. Dieser Index ist also das Geschäftsgeheimnis des jeweiligen Unternehmens in maschinenlesbarer Form.

Der Server kennt zwei Betriebsarten, im MCP-Jargon Transporte. Bei stdio startet der KI-Client den Server als lokalen Prozess, es gibt keinen Netzwerkendpunkt. Beim HTTP-Transport läuft der Server als Netzwerkdienst und nimmt JSON-RPC-Anfragen unter /mcp an. Für den HTTP-Betrieb bietet das Projekt im README einen Knopf „Deploy to Azure“ an, der einen Azure App Service samt Konfiguration aus einem ARM-/Bicep-Template anlegt. Um diesen Weg geht es hier. Grundsätzliches zur Absicherung von MCP-Servern steht in unserem Leitfaden zu MCP-Servern.

Die Schwachstelle

In einfachen Worten

Stellen Sie sich ein Archiv vor, dessen Tür ein Zahlenschloss hat. Bei der Lieferung ist das Schloss so eingestellt, dass eine leere Kombination die Tür öffnet, und im Aufbauplan steht neben dem Feld für die Kombination „optional“. Wer das Archiv nach Plan aufstellt und das Feld überspringt, hat eine Tür, die für jeden aufgeht, der davorsteht. Und das Archiv steht an einer öffentlichen Straße.

So verhielt sich die Azure-Bereitstellung des D365 F&O MCP Servers bis Version 1.10.1. Die Kombination ist der API-Schlüssel, die Straße ist die öffentliche Adresse des Azure App Service.

Technisch

Drei Stellen wirkten zusammen, alle in der Advisory mit Datei und Zeile belegt:

Das Template setzte auf dem App Service außerdem fest MCP_SERVER_MODE=read-only. Damit waren die schreibenden Werkzeuge auf diesem Weg nicht angeboten. Die lesenden blieben erreichbar, darunter search, get_object_info, batch_get_info, extension_info, security_info, find_references und find_event_handlers. Mehrere davon geben das Feld source_snippet aus dem Index zurück, also Ausschnitte des X++-Quellcodes. Die Sicherheitsrichtlinie des Projekts ordnet MCP_SERVER_MODE inzwischen ausdrücklich als Aufteilung der Werkzeugoberfläche ein, nicht als Berechtigungsgrenze: Der Modus begrenzt, welche Werkzeuge erreichbar sind, nicht wer sie erreichen darf.

Zur Einordnung des Vektors: AV:N, PR:N und UI:N bedeuten Angriff über das Netz, ohne Anmeldung und ohne Handlung eines Nutzers. C:H steht für einen hohen Verlust an Vertraulichkeit. Integrität und Verfügbarkeit sind laut Vektor nicht betroffen, weil auf diesem Weg keine schreibenden Werkzeuge angeboten wurden. Wir haben den Basiswert von 7.5 anhand der Formel der CVSS-3.1-Spezifikation nachgerechnet.

Schematischer Ablauf

Aufrufer ohne API-Schlüssel App Service /mcp API_KEY leer Abgewiesen Schlüssel ist Pflicht Index X++ und Metadaten ab 1.11.0 abgewiesen bis 1.10.1
Bis 1.10.1 führte der dokumentierte One-Click-Weg zu einem leeren Schlüssel, und die Middleware ließ Anfragen ohne Anmeldung zu den lesenden Werkzeugen durch. Ab 1.11.0 verlangt das Template einen Schlüssel, und der Server startet ohne Authentifizierung nicht mehr auf einer öffentlichen Schnittstelle.
  1. Ein Unternehmen stellt den Server über „Deploy to Azure“ bereit und lässt das als optional beschriebene Feld apiKey leer.
  2. Der App Service läuft mit API_KEY="" unter ihrer öffentlichen HTTPS-Adresse.
  3. Ein Aufrufer, der diese Adresse kennt, sendet eine JSON-RPC-Anfrage an /mcp, ohne Schlüssel-Header.
  4. Die Middleware erkennt keinen konfigurierten Schlüssel und reicht die Anfrage an das Werkzeug weiter.
  5. Das Werkzeug antwortet wie für einen berechtigten Nutzer, einschließlich der Quellcode-Ausschnitte aus dem Index.

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

So haben wir geprüft

Der Fund stammt aus einer reinen Quellcode-Prüfung des öffentlichen Repositorys. Wie in der Advisory festgehalten, haben wir keine laufende Installation dieser Software, kein Azure-Abonnement einer anderen Partei und keine D365-Finance-&-Operations-Umgebung angesprochen, gescannt oder kontaktiert. Code aus dem Projekt haben wir zu keinem Zeitpunkt ausgeführt, gebaut oder installiert. Der Ablauf oben ist am Quellcode nachvollzogen, nicht an einem fremden System.

Wer betroffen war

Die GitHub-Advisory nennt das npm-Paket d365fo-mcp in allen Versionen bis einschließlich 1.10.1, der CVE-Eintrag formuliert es als „vor 1.11.0“. Beschrieben ist dort der Weg über die offizielle Azure-One-Click-Bereitstellung. Der CVE-Eintrag grenzt ausdrücklich ab: Installationen, die durch einen gesetzten API-Schlüssel, eine wirksame vorgelagerte Authentifizierung oder Netzwerkbeschränkungen geschützt sind, fallen nicht unter dieses Szenario.

BereitstellungEinordnung bis 1.10.1
stdio (lokaler Prozess des KI-Clients)Kein HTTP-Endpunkt, der beschriebene Weg besteht nicht
Azure One-Click, apiKey leer, keine eigene Netzwerk- oder ZugriffskontrolleBetroffen. Lesende Werkzeuge ohne Anmeldung über die öffentliche Adresse erreichbar
Azure One-Click mit gesetztem apiKeyAnfragen ohne gültigen Schlüssel werden abgewiesen
Eigene Netzwerkbeschränkung oder vorgelagerte Authentifizierung (Private Endpoint, IP-Beschränkung, Easy Auth)Laut CVE-Eintrag außerhalb des Szenarios, sofern ein Angreifer den Endpunkt dadurch nicht erreicht

Zwei Ergänzungen stammen aus den Commit-Nachrichten des Maintainers. Erstens war nach seiner Analyse auch eine Bereitstellung über die mitgelieferte Azure-DevOps-Pipeline auf einen von Hand angelegten App Service ohne API_KEY genauso offen. Der zweite Fix-Commit schließt diesen Weg mit. Zweitens hält er fest, dass der Hostname nicht schwer zu finden ist: Er leitet sich aus dem Namen der Ressourcengruppe ab und taucht in Certificate-Transparency-Protokollen auf.

Wie groß das Risiko im Einzelfall war, hängt davon ab, ob der Schlüssel leer blieb, ob eine eigene Azure-Absicherung vorgeschaltet war und welche Modelle im Index lagen.

Behebung und was Betreiber jetzt tun sollten

Was der Fix in 1.11.0 ändert

Die Korrektur besteht aus zwei Commits, die mit Version 1.11.0 erschienen sind:

Der Fix ist als Breaking Change gekennzeichnet: Ein bestehender App Service ohne API_KEY startet nach dem Update nicht mehr. Das ist gewollt, denn aus einer stillen Offenlegung wird ein sichtbarer Fehler.

Empfehlungen für Betreiber

Die folgenden Schritte sind unsere Empfehlungen. Wo sie sich auf Hinweise des Projekts stützen, ist das vermerkt.

SchrittMaßnahme
1. Schlüssel setzenVor dem Update einen zufälligen, langen API_KEY im App Service hinterlegen, etwa mit openssl rand -hex 32, wie es die Projektdoku vorschlägt. Sonst startet 1.11.0 nicht.
2. AktualisierenAuf 1.11.0 oder neuer aktualisieren. Version 1.10.1 ist laut Advisory noch betroffen.
3. EinordnenWar der Schlüssel leer und der App Service ohne eigene Netzwerkbeschränkung erreichbar, sollten Sie davon ausgehen, dass der Index von außen lesbar war, und das intern entsprechend bewerten.
4. Protokolle sichtenFalls HTTP-Protokolle des App Service aktiviert waren: nach Anfragen an /mcp von unbekannten Adressen suchen.
5. Netzwerk abschirmenPrivate Endpoint oder IP-Beschränkung vor den App Service setzen, wenn die Adressen des Teams bekannt sind. Das empfiehlt auch die Sicherheitsrichtlinie des Projekts.
6. Identität statt EinzelschlüsselEasy Auth mit Entra ID vorschalten, damit jeder Nutzer eigene Zugangsdaten hat. Den gemeinsamen Schlüssel erneuern, wenn jemand das Projekt verlässt (ebenfalls laut Projekt-Richtlinie).

Zeitleiste

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

DatumEreignisBeleg
27.07.2026Version 1.5.2 erscheint, der in der Advisory geprüfte Standnpm-Registry, Advisory
28.07.2026Advisory im Repository angelegtGitHub-Advisory (API)
29.07.2026Erster Fix-Commit verfasstGitHub, Commit e70bd05
11.08.2026Version 1.10.1 erscheint, die letzte betroffene VersionGitHub-Release, npm-Registry
12.08.2026Beide Fix-Commits im Hauptzweig, GitHub-Advisory GHSA-8764-fh3m-wf7g veröffentlichtGitHub
13.08.2026Version 1.11.0 mit dem Fix erscheintGitHub-Release, npm-Registry
20.10.2026CVE-Nummer durch GitHub als CNA reserviertCVE-Eintrag
21.10.2026CVE-Eintrag CVE-2026-114123 veröffentlichtCVE.org, NVD

Das Muster dahinter: optionale Anmeldung als Standard

Hinter CVE-2026-114123 steht ein Muster, das bei Werkzeugen für Entwickler häufig vorkommt. Lokal ist ein Server ohne Anmeldung bequem, also ist die Anmeldung optional. Sobald derselbe Code über ein Template in die Cloud geht, wird aus „optional“ ein offener Dienst im Internet. Gefährlich wird es, wenn ein leeres Geheimnis als „Prüfung aus“ gilt und das Bereitstellungswerkzeug genau diesen leeren Wert als Standard mitbringt.

In unserer Erläuterung der OWASP MCP Top 10 berührt der Fall zwei Klassen: fehlende Transport-Authentifizierung aus Klasse 1 und unsichere Standardwerte aus Klasse 9. Für Entwickler von MCP-Servern lassen sich daraus vier Regeln ableiten:

Für Betreiber gilt die Kehrseite: Ein MCP-Server mit HTTP-Transport ist ein Netzwerkdienst mit Zugriff auf Ihre Daten. Er verdient dieselbe Behandlung wie jede andere API, also Authentifizierung, Netzwerkbeschränkung und einen Blick darauf, was ein One-Click-Template tatsächlich anlegt.

Dank an den Maintainer

Wir danken dem Maintainer des Projekts (GitHub: dynamics365ninja) für die koordinierte Zusammenarbeit. Die Meldung lief vertraulich über eine GitHub-Repository-Advisory. Der Maintainer hat die Ursache an mehreren Stellen behoben, statt nur den Standardwert zu ändern, dabei einen weiteren Bereitstellungsweg mit abgedeckt, Tests ergänzt, eine Sicherheitsrichtlinie veröffentlicht, die CVE-Nummer bei GitHub als CNA angefordert und CyberSec42 in der Advisory als Reporter genannt.

Ist Ihr MCP-Server so abgeschirmt, wie Sie denken?

Wir prüfen MCP-Server und KI-Agenten im schriftlich vereinbarten Umfang: wer den Endpunkt erreichen kann, was ohne Anmeldung durchgeht, was Ihre Bereitstellungs-Templates tatsächlich anlegen und welche Daten ein Werkzeugaufruf zurückgibt. 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 Projekt D365 F&O MCP Server oder zu Microsoft. Dynamics 365 ist eine Marke von Microsoft.

Häufige Fragen

Was ist CVE-2026-114123?

Eine fehlende Authentifizierung durch einen unsicheren Standardwert im D365 F&O MCP Server. Die offizielle Azure-One-Click-Bereitstellung setzte den API-Schlüssel standardmäßig leer, und mit leerem Schlüssel ließ der Server Anfragen ohne Anmeldung zu. Der CVE-Eintrag bewertet sie mit CVSS 7.5 (hoch).

Welche Versionen sind betroffen?

Laut GitHub-Advisory alle Versionen des npm-Pakets d365fo-mcp bis einschließlich 1.10.1. Behoben ist die Schwachstelle in 1.11.0 vom 13.08.2026. Setzen Sie vor dem Update einen API_KEY, sonst startet die neue Version auf dem App Service nicht.

Bin ich betroffen, wenn ich den Server lokal über stdio nutze?

Im stdio-Modus startet der KI-Client den Server als lokalen Prozess ohne HTTP-Endpunkt, der beschriebene Weg besteht dort nicht. Beschrieben ist die Schwachstelle für die Azure-Bereitstellung mit HTTP-Transport. Aktualisieren sollten Sie trotzdem.

Ist Dynamics 365 Finance & Operations selbst betroffen?

Nein. Der CVE-Eintrag nennt ausschließlich den D365 F&O MCP Server. Betroffen waren die Daten, die der Server aus Ihrer D365-Umgebung indexiert hat, nicht die D365-Umgebung selbst. Die Sicherheitsrichtlinie des Projekts nimmt Schwachstellen in D365 F&O ausdrücklich aus.

Wurde die Schwachstelle aktiv ausgenutzt?

Die öffentlichen Quellen, also Advisory, CVE-Eintrag und Fix-Commits, treffen dazu keine Aussage. Ob Ihre eigene Installation betroffen war, lässt sich nur anhand Ihrer Konfiguration und gegebenenfalls Ihrer Protokolle einordnen.

Weiterlesen

Quellen