iToverDose/Yazılım· 25 NISAN 2026 · 20:44

Cursor ve AI Kod Üreticilerinin Ürettiği Tehlikeli Nesne Birleştirme Hatası

AI destekli kod editörleri tarafından üretilen derin birleştirme fonksiyonları, Node.js uygulamalarında prototip kirliliği saldırılarına yol açıyor. İşte bu tehlikeli hatanın nasıl önleneceği ve AI’nın neden bu kusurlu kodu üretmeye devam ettiği.

DEV Community3 dk okuma0 Yorumlar

Son zamanlarda bir arkadaşımın üzerinde çalıştığı Node.js projesini gözden geçirirken oldukça etkileyici bir kod yapısıyla karşılaştım. Temiz bir yapı, anlaşılır değişken isimleri ve hatta bazı yerlerde açıklayıcı yorumlar bulunuyordu. Hatta projenin büyük bir kısmı Cursor gibi AI destekli bir kod editöründe yazılmıştı. Her şey yolunda gidiyordu ki, aniden bir yardımcı fonksiyona denk geldim.

Arka uç projelerinde neredeyse herkesin kullandığı bir derin birleştirme fonksiyonuydu bu. İki nesneyi alıp, anahtarlarını özyinelemeli olarak birleştiren bir fonksiyon. AI’ların bu tür yardımcı fonksiyonları yazması sadece birkaç saniye sürüyor. Ancak sorun, AI’nin eksik bıraktığı bir detaydaydı.

Cursor’un ürettiği kodun birebir kopyası şöyleydi:

deepMerge(target, source) {
  for (const key in source) {
    if (source[key] && typeof source[key] === 'object') {
      target[key] = deepMerge(target[key] || {}, source[key]);
    } else {
      target[key] = source[key];
    }
  }
  return target;
}

Buradaki tehlike, for...in döngüsünün sadece kendi özellikleri değil, aynı zamanda kalıtımla gelen özellikleri de içermesi. Peki saldırganlar bu zafiyeti nasıl kötüye kullanabilir? Basitçe, __proto__ anahtarını içeren bir nesne göndererek Object.prototype’ı manipüle edebilirler. Örneğin:

deepMerge({}, JSON.parse('{"__proto__": {"isAdmin": true}}'));
console.log({}.isAdmin); // true — artık tüm nesnelerde isAdmin özelliği mevcut

Bu durumda, Node.js sürecindeki her nesne artık isAdmin özelliğine sahip oluyor. Yönetici kontrolleri geçersiz hale geliyor, denetim kayıtları atlanıyor ve saldırganlar sistemde tam kontrol sağlıyor. Bu sadece teorik bir tehdit değil; gerçek dünya saldırılarında da sıkça karşımıza çıkan bir vektör.

AI Neden Hala Bu Hatalı Kodu Üretiyor?

for...in ile nesne birleştirme, 2013 ile 2019 yılları arasında StackOverflow’da en çok önerilen çözümlerden biriydi. Binlerce beğeni alan yanıtlar, yüzlerce blog yazısı ve düzinelerce npm paketi bu kusurlu yöntemi benimsedi. AI’lar ise bu büyük veri kümesi üzerinde eğitildiği için, istatistiksel olarak en yaygın olan yanıtı otomatik olarak üretir — ki bu yanıt maalesef güvenlik açıklarını barındıran bir yanıt.

Güvenlik odaklı makalelerde Object.hasOwn() kullanımı ve __proto__ korumaları hakkında bilgiler mevcut. Ancak genel JavaScript eğitimlerinde bu konular nadiren vurgulanır. AI’lar, prompt’unuzda özel olarak güvenlik vurgusu yapmadığınız sürece, bu kusurlu yöntemi tercih eder. Cursor, Claude Code ya da Copilot fark etmeksizin, 2020 öncesi eğitim verileriyle çalışan herhangi bir AI modeli bu hatayı tekrarlayacaktır.

Tehlikenin Önüne Geçmek İçin Basit Çözümler

Neyse ki, bu güvenlik açığını kapatmak oldukça basit. İki temel yaklaşım bulunuyor:

Yöntem 1: `Object.hasOwn()` ile koruma (minimum değişiklik)

function deepMerge(target, source) {
  for (const key in source) {
    if (!Object.hasOwn(source, key)) continue; // Kalıtımla gelen özellikleri ve __proto__’yu engeller
    if (source[key] && typeof source[key] === 'object') {
      target[key] = deepMerge(target[key] || {}, source[key]);
    } else {
      target[key] = source[key];
    }
  }
  return target;
}

Yöntem 2: Sadece kendi özellikleri işlemek için `Object.keys()` kullanmak (daha temiz çözüm)

function deepMerge(target, source) {
  Object.keys(source).forEach(key => {
    if (source[key] && typeof source[key] === 'object') {
      target[key] = deepMerge(target[key] || {}, source[key]);
    } else {
      target[key] = source[key];
    }
  });
  return target;
}

İkinci yöntem, kalıtımla gelen özellikleri tamamen devre dışı bırakarak daha temiz bir çözüm sunuyor. Güvenlik odaklı projelerdeyse, kullanıcı girişinden önce bir doğrulama adımı eklemek de önemli:

function isSafeObject(obj) {
  return !('__proto__' in obj) && 
         !('constructor' in obj) && 
         !('prototype' in obj);
}

Bu fonksiyon, saldırganın gönderebileceği tehlikeli özellikleri tespit ederek, işlemden önce reddetmenizi sağlıyor.

Bu Hata Nerelerde Gizleniyor?

Bu tehlikeli desen sadece yardımcı fonksiyonlarda değil, aynı zamanda:

  • Konfigürasyon dosyalarını birleştirme işlemlerinde
  • Kullanıcı ayarlarını varsayılanlarla birleştirirken
  • API isteklerinde gönderilen verileri işlerken
  • Yama uç noktalarında (patch endpoints) yapılan güncellemelerde

görülebilir. Projenizdeki tüm for (const key in ifadelerini aratarak bu zafiyetleri tespit edebilirsiniz. Güvenlik açısından risk genellikle tek bir dosyadan çok daha geniş olabilir.

AI destekli kod editörleriyle çalışırken, güvenlik açıklarını erken aşamada yakalamak için otomatik araçlardan faydalanabilirsiniz. Örneğin, SafeWeave gibi bir araç Cursor ve Claude Code’a entegre olarak bu tür desenleri tespit edip sizi uyarabilir. Bunun yanı sıra, basit bir pre-commit hook’u veya semgrep ile gitleaks gibi araçlar da çoğu vakada yeterli olacaktır. Önemli olan, bu hataları geliştirme sürecinin erken aşamalarında yakalamak ve güvenli kod pratiklerini benimsemek.

Güvenlik, yalnızca projenin tamamlanmasından sonra değil, her adımda dikkate alınması gereken bir konu. AI’ların ürettiği kodlarda bile bu hassasiyeti korumak, gelecekte karşılaşabileceğiniz ciddi sorunların önüne geçecektir.

Yapay zeka özeti

AI destekli kod editörleri (Cursor, Claude Code) tarafından üretilen derin birleştirme fonksiyonları, Node.js uygulamalarında prototip kirliliği saldırılarına yol açıyor. Güvenli kod için basit çözümleri keşfedin.

Yorumlar

00
YORUM BIRAK
ID #1C3T0U

0 / 1200 KARAKTER

İnsan doğrulaması

8 + 8 = ?

Editör onayı sonrası yayına girer

Moderasyon · Spam koruması aktif

Henüz onaylı yorum yok. İlk yorumu sen bırak.