FlawOpen

flawopen.com/AI Security/langroid-neo4j-cypher-injection-cve-2026-55615

● CVE-2026-55615 · CVSS v4 9.2[1] · Kritis
Riset Keamanan · FlawOpen

Langroid CVE-2026-55615: injeksi prompt-ke-Cypher

Langroid meneruskan Cypher buatan model ke Neo4j tanpa validasi. Perbarui ke 0.65.5; izin database tetap menjadi batas keamanan.[1], [2], [4]

Vektor CVSSCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N[1]
💡 Penjelasan Sederhana (ELI5)

Pustakawan menerima pertanyaan biasa lalu memberikan instruksi database yang dihasilkan langsung kepada petugas berhak tinggi. Jika catatan jahat mengubah pertanyaan, petugas tetap menjalankan instruksinya. CVE-2026-55615 memungkinkan konten tak tepercaya memengaruhi Cypher yang dikirim Langroid ke Neo4j.[1]

Konsep Kunci & Istilah

Cypher
Bahasa kueri Neo4j untuk membaca dan mengubah data graf. Prosedur tambahan bergantung pada konfigurasi server dan hak akun.[1]
Neo4jChatAgent
Agen Langroid yang mengubah tugas bahasa alami menjadi Cypher dan mengirimkannya ke Neo4j lewat tool baca atau pembuatan.[1], [3]
Prompt injection
Input tak tepercaya mengubah perilaku model. Kueri buatan model harus dianggap sebagai input tak tepercaya.[1]
Least-privilege database role
Identitas database yang hanya memiliki akses ke data dan operasi yang diperlukan. Batas ini penting sekalipun aplikasi memvalidasi kueri.[1], [5]
Validator kueri Cypher
Validator Langroid 0.65.5 memeriksa kata kunci dan pola. Dokumentasinya memperingatkan bahwa pemeriksaan ini dapat dilewati; fungsinya hanya pertahanan berlapis, bukan batas otorisasi. Terapkan kontrol akses melalui hak peran Neo4j.[6], [3]

Pemetaan kerangka kerja

  • Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-74

Alur Serangan Langkah demi Langkah

Langkah 1

Agen graf yang rentan menerima kueri model

Langroid sampai 0.65.4 terdampak. Jalur serangan memerlukan prompt dipengaruhi langsung atau lewat konten retrieval dan model memakai tool Neo4jChatAgent. Advisory mencantumkan CWE-74 dan CVSS 4.0 9.2 (Critical).[1], [2]

Langkah 2

Konten memengaruhi Cypher yang diteruskan

Pada jalur rentan, cypher_retrieval_tool meneruskan msg.cypher_query ke read_query dan cypher_creation_tool mengirim kueri ke write_query. Advisory menelusuri nilai itu ke session.run(query, parameters) dan tx.run(query, parameters) tanpa validasi perantara.[1], [3]

Langkah 3

Hak database menentukan dampak langsung

Tool baca dapat mengungkap data yang dapat diakses akun; tool pembuatan dapat mengubah atau menghapus data sesuai hak akun. Advisory juga menyebut pengambilan jarak jauh melalui LOAD CSV. Akses file atau perintah host bergantung pada prosedur aktif dan hak database.[1]

Langkah 4

Versi 0.65.5 menambah pemeriksaan di tool

Resolusi maintainer menyatakan 0.65.5 menambahkan allow_dangerous_operations yang default-nya mati, membatasi pembacaan dan memeriksa operasi berbahaya tertentu di handler tool. Ini pertahanan tambahan, bukan otorisasi. Resolusi maintainer dan panduan SQL-agent Langroid menunjuk role database dengan hak minimum sebagai batas keamanan.[1], [3], [4], [5]

Langkah 5

Perbarui dan batasi hak database

Perbarui Langroid ke 0.65.5 atau lebih baru, pastikan versi di image, dan biarkan opsi berbahaya mati. Gunakan role Neo4j berhak minimum, nonaktifkan prosedur tak diperlukan, dan batasi host agen.[4], [5]

Kode Sumber: Rentan vs Aman

Cuplikan rentan mengikuti jalur dalam advisory; contoh perbaikan merangkum perilaku 0.65.5, bukan patch persis. Perbaikan memvalidasi di batas tool, membatasi pembacaan, dan mengatur operasi berbahaya. Perlakukan pemeriksaan kueri sebagai pertahanan tambahan, bukan otorisasi. Resolusi maintainer dan panduan SQL-agent Langroid menunjuk role Neo4j dengan hak minimum sebagai batas keamanan; isolasi juga proses agen. Dokumentasi Langroid menyebut pemeriksaan kata kunci dan pola dapat dilewati; hak Neo4j tetap menjadi batas penegakan.[1], [3], [4], [6]

IMPLEMENTASI RENTAN
# Jalur rentan Neo4jChatAgent (Langroid <= 0.65.4).
def cypher_retrieval_tool(self, msg: CypherRetrievalTool):
    query = msg.cypher_query
    return self.read_query(query)

def read_query(self, query: str):
    with self.driver.session() as session:
        return session.run(query, parameters=None)
PERBAIKAN AMAN & KUAT
# Perilaku versi 0.65.5: validasi di batas tool yang dihadapi LLM.
def cypher_retrieval_tool(self, msg: CypherRetrievalTool):
    query = msg.cypher_query
    rejection = validate_cypher_query(
        query, is_write=False,
        allow_dangerous=self.config.allow_dangerous_operations,
    )
    if rejection is not None:
        return rejection
    return self.read_query(query)

Daftar Periksa Penguatan Sistem Rekayasa

Sumber

← AI Security Directory →