flawopen.com/AI Security/langgraph-js-graph-input-control-directive-october-2026
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]
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-20und 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
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]
Normale Verarbeitung wird umgangen
Das Objekt kann als Zustandsänderung oder Routing-Anweisung gelten und anwendungseigene Prüf- oder Freigabeknoten umgehen.[1]
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
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";
}
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
- ✓Aktualisieren Sie @langchain/langgraph auf 1.4.21 oder neuer; prüfen Sie die Version in Lockfile und ausgeliefertem Artefakt.[1], [2]
- ✓Übergeben Sie Anforderungs-JSON nicht direkt an
graph.invoke()odergraph.stream(); erstellen Sie serverseitig einen Zustand aus ausdrücklich erlaubten Feldern.[1] - ✓Trennen Sie Steuerobjekte vom aufruferkontrollierten Zustand und testen Sie, dass geparstes JSON auch mit ähnlichen Feldnamen normale Eingabe bleibt.[2]
- ✓Autorisieren Sie jedes sensible Tool und jeden Seiteneffekt an der Operationsgrenze anhand Identität und Ressource; verlassen Sie sich nicht nur auf einen früheren Knoten.[1]
- ✓Ergänzen Sie einen Integrationstest, der nicht vertrauenswürdiges JSON durch den Graphen sendet und sicherstellt, dass ein sensibles Tool-Stub ohne Berechtigung des authentifizierten Subjekts für die Zielressource nie aufgerufen wird.[1], [2]