FlawOpen

flawopen.com/AI Security/semantic-kernel-inmemory-vector-filter-cve-2026-26030

● CVE-2026-26030 · CVSS 9.9[1] · Kritis
Riset Keamanan · FlawOpen

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]

Vektor CVSSCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H[1]
💡 Penjelasan Sederhana (ELI5)

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

Langkah 1

Jalur filter rentan digunakan

Aplikasi menggunakan Semantic Kernel Python sebelum 1.39.4 dan filter InMemoryVectorStore. Microsoft menilai Critical (CVSS 3.1 9.9, CWE-94) dan menyarankan versi 1.39.4 atau lebih baru.[1], [4]

Langkah 2

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]

Langkah 3

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]

Langkah 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]

Langkah 5

Perbaiki batas parser dan selidiki paparan

Perbarui semantic-kernel ke 1.39.4 atau lebih baru. Patch memeriksa atribut berbahaya dan membatasi nama ke parameter lambda. Selidiki anomali proses, jaringan, dan kredensial selama masa terdampak.[1], [2], [3], [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]

IMPLEMENTASI RENTAN
# 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
PERBAIKAN AMAN & KUAT
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

Sumber

← AI Security Directory →