FlawOpen

flawopen.com/AI Security/langgraph-js-graph-input-control-directive-october-2026

● CWE-20 · CVSS v4 7.6[1] · Hoch
Sicherheitsforschung · FlawOpen

GHSA-wp87-994x-j95x: JSON als Graphbefehl fehlgedeutet

LangGraph.js <1.4.21 konnte gewöhnliches JSON als Steueranweisung behandeln und Prüf- oder Freigabeschritte umgehen. Aktualisieren und den Zustand serverseitig prüfen.[1]

CVSS-VektorCVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N[1]
💡 Einfache Erklärung (ELI5)

Stell dir den Graphen als Bahnhof vor: Gepäck muss vor dem Einstieg kontrolliert werden. In betroffenen Versionen konnte ein Etikett mit „Command“ als berechtigter Auftrag zum Weichenstellen gelten. Der Fix unterscheidet einfache Objekte von Command-Objekten; die Anwendung muss trotzdem jede sensible Aktion gesondert autorisieren.[1], [2]

Kernkonzepte & Begriffe

GHSA-wp87-994x-j95x
High-Sicherheitsmeldung von LangChain vom 8. Oktober 2026; nennt CVSS 4.0 7,6, CWE-20 und keine bekannte CVE.[1]
Graph-Eingabe
Zustandsobjekt für einen LangGraph.js-Aufruf; der Server sollte es prüfen und nur erlaubte Felder übernehmen.[1]
Command
LangGraph.js-Objekt zum Ändern des Zustands oder Lenken der Ausführung; gewöhnliches JSON bleibt eine Dateneingabe.[2]
Steuerungsgrenze
Grenze, an der Anwendungsdaten als Anweisungen zum Wählen von Knoten oder Ändern des Zustands gelten.[1]

Framework-Zuordnungen

  • CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-20

Schritt-für-Schritt Angriffsablauf

Schritt 1

Anwendung nimmt JSON des Aufrufers an

Die betroffene Bereitstellung übergibt nicht vertrauenswürdiges JSON direkt an den Graphen, statt serverseitig einen geprüften Zustand zu erstellen.[1]

Schritt 2

Daten gelten als Steuerobjekt

Vor 1.4.21 konnte das Feld lg_name allein ein einfaches Objekt wie ein Command aussehen lassen. Der Fehler liegt in der Typ-Erkennung, nicht im JSON-Parser.[1], [2]

Schritt 3

Normale Verarbeitung wird umgangen

Das Objekt kann als Zustandsänderung oder Routing-Anweisung gelten und anwendungseigene Prüf- oder Freigabeknoten umgehen.[1]

Schritt 4

Tool-Rechte bestimmen mögliche Folgen

Wenn der Graph sensible Tools bereitstellt, können laut Meldung Eingaben diese mit Anwendungsrechten ausführen. Autorisieren Sie an jeder Operationsgrenze erneut.[1]

Ursachenanalyse

Die Meldung betrifft @langchain/langgraph >=0.2.23 und <1.4.21. Die Anwendung muss nicht vertrauenswürdiges JSON direkt an den Graphen übergeben und sich für Validierung oder Autorisierung auf den normalen Ablauf verlassen. Laut PR erkannte isCommand einen Wert zuvor allein anhand des Felds lg_name; dadurch konnte normales JSON als Command gelten. Der Graph konnte update oder goto vor anwendungseigenen Prüf- oder Freigabeknoten ausführen. Die Meldung beschreibt mögliche unbefugte Aufrufe sensibler Tools mit Anwendungsrechten. Version 1.4.21 weist einfache Objekte als Command zurück und unterstützt weiterhin echte Instanzen, auch aus einer zweiten installierten Paketkopie. Das ersetzt weder serverseitige Zustandserzeugung noch Feld-Allowlisting oder Autorisierung an jeder sensiblen Operation. Die Meldung nennt CWE-20, High, CVSS 4.0 7,6; eine CVE ist nicht bekannt.[1], [2]

Quellcode: Verwundbar vs. Sicher

Dieses gekürzte TypeScript-Beispiel bildet die in PR #2966 beschriebene Änderung ab: lg_name allein macht ein einfaches Objekt nicht mehr zu einem Command. Es ist kein wörtlicher Quelltext und keine vollständige Implementierung. Analysiertes JSON folgt nach dem Fix dem normalen Zustandspfad; echte Command-Objekte behalten ihre Steuerfunktion. Objektform ist keine Autorisierung. Erzeugen Sie den Zustand serverseitig aus erlaubten Feldern und prüfen Sie jede sensible Operation.[2]

Quelltextauszug: Gekürzte Verhaltensdarstellung des LangGraph.js-Command-Prüfers; kein vollständiger Quelltext

VERWUNDBARE IMPLEMENTIERUNG
type CommandLike = { lg_name: string; goto?: unknown; update?: unknown };

function isCommand(value: unknown): value is CommandLike {
  return typeof value === "object" && value !== null &&
    "lg_name" in value && value.lg_name === "Command";
}
GEHÄRTETER SICHERHEITS-PATCH
type CommandLike = { lg_name: string; goto?: unknown; update?: unknown };

function isPlainObject(value: object): boolean {
  const prototype = Object.getPrototypeOf(value);
  return prototype === Object.prototype || prototype === null;
}

function isCommand(value: unknown): value is CommandLike {
  return typeof value === "object" && value !== null &&
    !isPlainObject(value) &&
    "lg_name" in value && value.lg_name === "Command";
}

Checkliste für Engineering & Systemsicherheit

Quellen

← AI Security Directory →