flawopen.com/AI Security/langgraph-js-graph-input-control-directive-october-2026
GHSA-wp87-994x-j95x: JSON disalahartikan sebagai perintah graph
LangGraph.js <1.4.21 dapat menganggap JSON biasa sebagai perintah kontrol dan melewati validasi atau persetujuan. Perbarui paket dan validasi state di server.[1]
Bayangkan graph sebagai stasiun: bagasi harus diperiksa sebelum naik. Pada versi terdampak, label “Command” dapat disangka sebagai perintah resmi untuk mengubah jalur. Perbaikan membedakan objek biasa dari objek Command, tetapi aplikasi tetap harus memeriksa izin sebelum setiap tindakan sensitif.[1], [2]
Konsep Kunci & Istilah
GHSA-wp87-994x-j95x- Peringatan High LangChain, diterbitkan 8 Oktober 2026; menyebut CVSS 4.0 7,6,
CWE-20, dan tidak ada CVE yang diketahui.[1] Masukan graph- Objek state untuk pemanggilan LangGraph.js; server harus memvalidasi dan memilih field yang diizinkan.[1]
Command- Objek LangGraph.js yang memperbarui state atau mengarahkan eksekusi; JSON biasa tetap menjadi data.[2]
Batas kontrol- Batas ketika data aplikasi ditafsirkan sebagai instruksi untuk memilih node atau mengubah state.[1]
Pemetaan kerangka kerja
- Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-20
Alur Serangan Langkah demi Langkah
Aplikasi menerima JSON dari pemanggil
Penerapan terdampak meneruskan JSON tak tepercaya langsung ke graph, bukan membuat state tervalidasi di server.[1]
Pemrosesan normal dapat dilewati
Objek dapat dianggap sebagai pembaruan state atau instruksi perutean sehingga melewati node validasi atau persetujuan aplikasi.[1]
Izin tool memperbesar dampak
Jika graph menyediakan tool sensitif, masukan penyerang dapat memicunya dengan izin aplikasi. Otorisasi ulang pada batas operasi.[1]
Analisis Akar Masalah (Root Cause)
Peringatan mencakup @langchain/langgraph >=0.2.23 dan <1.4.21. Aplikasi harus meneruskan JSON tak tepercaya langsung ke graph dan mengandalkan jalur normal untuk validasi atau otorisasi. PR menjelaskan bahwa isCommand sebelumnya mengenali nilai hanya dari field lg_name; akibatnya objek JSON biasa dapat dianggap Command. Graph kemudian dapat menerapkan update atau goto sebelum node validasi atau persetujuan aplikasi. Peringatan menyebut kemungkinan tool sensitif dijalankan tanpa izin dengan hak aplikasi. Versi 1.4.21 menolak objek biasa sebagai Command sambil tetap mengenali instance asli. Ini tidak menggantikan pembuatan state di server, allowlist field, atau otorisasi pada setiap operasi sensitif. Klasifikasinya CWE-20, High, CVSS 4.0 7,6; tidak ada CVE yang diketahui.[1], [2]
Kode Sumber: Rentan vs Aman
Contoh TypeScript ringkas ini mencerminkan perubahan PR #2966: field lg_name saja tidak menjadikan objek biasa sebagai Command. Ini bukan cuplikan sumber persis atau implementasi lengkap. Setelah diperbaiki, JSON yang diparse mengikuti jalur state biasa dan objek Command asli tetap mengendalikan graph. Bentuk objek bukan otorisasi. Buat state di server dari allowlist field dan otorisasi setiap operasi sensitif.[2]
Cuplikan sumber: Ilustrasi perilaku ringkas pemeriksa Command LangGraph.js; bukan seluruh kode sumber
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";
}
Daftar Periksa Penguatan Sistem Rekayasa
- ✓Perbarui @langchain/langgraph ke 1.4.21 atau lebih baru; verifikasi versi pada lockfile dan artefak yang diterapkan.[1], [2]
- ✓Jangan teruskan JSON permintaan langsung ke
graph.invoke()ataugraph.stream(); bentuk state di server dari daftar field yang diizinkan.[1] - ✓Pisahkan objek kontrol dari state pemanggil dan uji bahwa JSON dengan nama field serupa tetap menjadi input biasa.[2]
- ✓Otorisasi setiap tool sensitif atau efek samping pada batas operasi berdasarkan identitas dan cakupan resource.[1]
- ✓Tambahkan uji integrasi yang mengirim JSON tak tepercaya melalui graph dan memastikan stub tool sensitif tidak pernah dipanggil kecuali principal terautentikasi berwenang atas resource tujuan.[1], [2]