flawopen.com/AI Security/semantic-kernel-inmemory-vector-filter-cve-2026-26030
Semantic Kernel CVE-2026-26030: injeksi kode filter
Filter vektor yang dipengaruhi prompt melewati pemeriksaan AST hingga mencapai Python eval. Perbarui SDK ke 1.39.4 atau lebih baru.[1], [4]
Bayangkan pustakawan menerima kartu aturan pencarian, memeriksa beberapa kata yang dikenal, lalu meminta komputer menjalankan seluruh kartu sebagai program kecil. Orang yang memengaruhi kartu dapat memanfaatkan celah pemeriksaan. CVE-2026-26030 memungkinkan filter yang dipengaruhi model beralih dari pencarian data ke eksekusi kode di proses aplikasi.[4]
Konsep Kunci & Istilah
InMemoryVectorStore- Penyimpanan vektor dalam proses Semantic Kernel; pencarian dapat memfilter record sebelum hasil dikembalikan.[4]
Filter expression- Predikat yang menentukan apakah record masuk ke hasil pencarian vektor. Jalur Python terdampak memparse dan mengevaluasi filter string sebagai ekspresi Python.[4]
Abstract Syntax Tree (AST)- Representasi terstruktur dari kode yang diparse. Pemeriksaan AST yang tidak lengkap dapat menyisakan jalur introspeksi objek Python.[2], [4]
Prompt injection- Teks tak tepercaya memengaruhi model AI agar melakukan tindakan yang tidak dimaksudkan. Risiko muncul jika aplikasi meneruskan input model ke jalur filter rentan.[4]
Pemetaan kerangka kerja
- Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-94
Alur Serangan Langkah demi Langkah
Konten tak tepercaya memengaruhi filter pilihan model
Serangan memerlukan injeksi prompt yang memengaruhi input agen dan Search Plugin dengan filter default InMemoryVectorStore. Filter buatan model tidak otomatis tepercaya hanya karena datang melalui tool call bertipe.[4]
Filter menjadi kode Python
Sebelum perbaikan, filter diparse sebagai AST dan dievaluasi tanpa builtins, tetapi pemeriksaannya belum cukup membatasi penelusuran model objek. Versi 1.39.4 tetap mengizinkan ast.Subscript untuk mengakses field record dan menggabungkannya dengan allowlist node, blocklist atribut berbahaya, pembatasan nama bebas hanya ke parameter lambda, serta allowlist pemanggilan fungsi. Kode upstream tidak menolak subskrip dengan sendirinya; eval tanpa builtins bukan sandbox.[2], [4]
Eksekusi mencapai proses aplikasi
Jika validasi dilewati, logika yang dipengaruhi penyerang dapat berjalan di proses Python agen. Dampak dibatasi izin OS, lingkungan, kredensial, dan jangkauan jaringan proses tersebut.[4]
Kode Sumber: Rentan vs Aman
Panel rentan menunjukkan pola representatif, bukan kode produk secara persis: nilai yang dikendalikan model disisipkan ke sintaks Python sebelum eval. Panel perbaikan berfokus pada pemeriksaan upstream 1.39.4. Allowlist AST yang dikonfigurasi sengaja mencakup ast.Subscript untuk akses field record; patch menggabungkannya dengan pemblokiran atribut berbahaya, pembatasan nama bebas hanya ke parameter lambda, dan pemeriksaan pemanggilan fungsi yang diizinkan. Menghapus builtins tidak menjadikan eval sebagai sandbox. Perbarui paket dan jangan menyalin cuplikan ini sebagai validator mandiri.[2], [6], [4]
# Pola representatif sebelum perbaikan: teks kendali model mengubah ekspresi.
filter_text = f"lambda x: x.city == '{model_selected_city}'"
tree = ast.parse(filter_text, mode="eval")
code = compile(tree, filename="<filter>", mode="eval")
filter_fn = eval(code, {"__builtins__": {}}, {}) # nosec
def validate_filter(self, tree):
# Pemeriksaan utama upstream 1.39.4; pesan exception disingkat.
# Filter tingkat atas harus berupa ekspresi lambda.
if not (isinstance(tree, ast.Expression) and isinstance(tree.body, ast.Lambda)):
raise VectorStoreOperationException("Filter must be a lambda expression")
lambda_param_names = {arg.arg for arg in tree.body.args.args}
for node in ast.walk(tree):
if type(node) not in self.allowed_filter_ast_nodes:
raise VectorStoreOperationException("AST node type is not allowed")
if isinstance(node, ast.Attribute) and node.attr in self.blocked_filter_attributes:
raise VectorStoreOperationException("Dangerous attribute is not allowed")
if isinstance(node, ast.Name) and node.id not in lambda_param_names:
raise VectorStoreOperationException("Only lambda parameter names are allowed")
if isinstance(node, ast.Call):
if isinstance(node.func, ast.Name):
func_name = node.func.id
elif isinstance(node.func, ast.Attribute):
func_name = node.func.attr
else:
func_name = None
if func_name and func_name not in self.allowed_filter_functions:
raise VectorStoreOperationException("Function is not allowed")
code = compile(tree, filename="<filter>", mode="eval")
func = eval(code, {"__builtins__": {}}, {}) # nosec
Daftar Periksa Penguatan Sistem Rekayasa
- ✓Temukan semua lingkungan Python dengan semantic-kernel dan catat versi, termasuk container, notebook, worker, dan image CI.[4]
- ✓Perbarui ke 1.39.4 atau lebih baru, buat ulang lockfile dan image.[1], [3]
- ✓Sebelum pembaruan, nonaktifkan filter InMemoryVectorStore di produksi.[1]
- ✓Pada setiap PR yang menambah atau mengubah filter pencarian vektor, tambahkan tes yang membuktikan teks pengguna, dokumen hasil retrieval, dan argumen dari model tidak dapat mengubah struktur filter yang diparse; tolak bentuk yang tidak didukung.[4]
- ✓Tambahkan uji regresi yang menolak atribut AST berbahaya dan nama di luar parameter lambda tanpa payload eksploit yang dapat dijalankan.[2]
- ✓Representasikan filter pilihan model sebagai data bertipe dengan allowlist field dan operator yang eksplisit; tambahkan tes untuk menolak string ekspresi serta field atau operator yang tidak dikenal.
- ✓Batasi akses file, jaringan, dan kredensial proses agen.[4]
- ✓Tambahkan tes regresi deteksi pada host agen yang menghasilkan peristiwa contoh proses anak dan koneksi keluar, lalu pastikan aturan telemetri yang diterapkan memberi peringatan untuk keduanya.[4]