FlawOpen

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

● CWE-20 · CVSS v4 7.6[1] · Tinggi
Riset Keamanan · FlawOpen

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]

Vektor CVSSCVSS: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]
💡 Penjelasan Sederhana (ELI5)

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

Langkah 1

Aplikasi menerima JSON dari pemanggil

Penerapan terdampak meneruskan JSON tak tepercaya langsung ke graph, bukan membuat state tervalidasi di server.[1]

Langkah 2

Data disangka sebagai objek kontrol

Sebelum 1.4.21, penanda lg_name saja dapat membuat objek biasa tampak seperti Command. Masalahnya pada pengenalan tipe, bukan parsing JSON.[1], [2]

Langkah 3

Pemrosesan normal dapat dilewati

Objek dapat dianggap sebagai pembaruan state atau instruksi perutean sehingga melewati node validasi atau persetujuan aplikasi.[1]

Langkah 4

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

IMPLEMENTASI RENTAN
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";
}
PERBAIKAN AMAN & KUAT
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

Sumber

← AI Security Directory →