Yazılım ve Yapay Zekâ · security · supply chain
Plugin4Shell: Yapay zekâ ajanlarının mühürlü eklentisi

Selam sevgili okurlar. Bu ay size bir eklentinin nasıl kılık değiştirebildiğini anlatacağım. Konu bir güvenlik açığı. Adı Plugin4Shell. İçinde ne var biliyor musunuz? Tek bir eksik kontrol. Daha fazlası değil. Ama o tek kontrol, dört büyük yapay zekâ kodlama ajanında birden eksik çıkmış. Baştan söyleyeyim: bu yazı araştırmacıların raporuna, üreticilerin belgelerine ve sürüm notlarına, bir de yazılım deposundaki düzeltme kayıtlarına dayanıyor. Biz bu açığı kendi makinemizde kurup denemedik.
Önce mesele ne?
Bugün Claude Code, Codex, Copilot, Gemini CLI gibi kodlama ajanları (agent - kendi başına komut çalıştırabilen yapay zekâ yardımcısı) eklentiyle genişletilebiliyor. Eklentiler de bir pazar yerinden (marketplace) geliyor. Pazar yeri her eklenti için belirli bir commit'i gösteriyor, yani deponun belli bir anını 40 karakterlik bir SHA özetiyle (hash - parmak izi) sabitliyor. Buna "pinleme" deniyor. Mantık oldukça sağlam: biri o commit'i incelemiş, temiz bulmuş, pazar yeri de "bu eklentinin bu hâli güvenli" diye mühürü basmış. Depo sahibi ertesi gün ne değiştirirse değiştirsin, siz incelenmiş hâli alacaksınız.
Teoride böyle. Air Security adlı güvenlik şirketinin araştırmacıları Or Nevo, Dor Granat ve Niv Hoffman, 17 Eylül 2026 tarihli yazılarında başka bir şey anlatıyor. Ajanlar pazar yerinin gösterdiği commit'i checkout ediyor ama sonunda ellerinde kalan kodun gerçekten o commit olup olmadığına hiç bakmıyor. Ajan size "pinlenmiş, incelenmiş sürümü kurdum" diyor, oysa diskte bambaşka bir kod duruyor olabilir.
Bu neden önemli? Çünkü eklenti sizin yetkilerinizle çalışıyor. Dosyalarınıza da, makinede duran kimlik bilgilerinize de (API anahtarları, bulut erişim belgeleri, ne bileyim, SSH anahtarınız) erişebilecek durumda. Eskiden bir programın diskinizi karıştırması için onu kendi elinizle çalıştırmanız gerekirdi. Şimdi ajan sizin yerinize çalıştırıyor, üstelik "her şey yolunda" raporunu da kendisi veriyor.
Hile nasıl işliyor?
İşin püf noktası git'in bir huyunda. Siz git'e bir ad verdiğinizde, o ad hem bir dalın (branch) adı hem de bir commit'in özeti olabiliyorsa, git dalı tercih ediyor. Peki bir dalın adı 40 karakterlik bir commit özeti olabilir mi? Bazı sunucularda olabiliyor!
Air'in anlattığı ilk yöntem bu. Saldırgan, adı pinlenmiş commit'in özetiyle birebir aynı olan bir dal açıyor ve onu deponun varsayılan dalı yapıyor. Ajan "şu commit'i getir" dediğinde git dalı buluyor ve checkout saldırganın koduna düşüyor. Claude Code, Codex ve Copilot bu yönteme açık çıkmış.
Gemini CLI'da yol biraz farklı. Orada varsayılan dalın adı FETCH_HEAD yapılıyor. FETCH_HEAD git'in kendi kullandığı özel bir ad: en son getirilen şeyi gösterir. Aynı adda bir dal, gerçekten getirilmiş commit'in önüne geçiyor. Şirin bir isim çakışması gibi duruyor ama sonucu hiç şirin değil.
Saldırının sırası da sabırlı bir dolandırıcının işi gibi. Önce zararsız bir eklenti yayımlanıyor. Kullanıcılar onu benimseyene kadar bekleniyor. Sonra pin başka bir zararsız commit'e kaydırılıyor, pazar yeri bunu inceleyip onaylıyor. En son da o commit'in adını taşıyan kötü niyetli dal ekleniyor. İnceleme yapan herkes temiz bir commit görüyor, kullanıcıya giden ise başka bir şey. Kimse yalan söylemiyor gibi görünüyor, git sadece kendi kurallarına uyuyor. İşte bu yüzden fark etmesi bu kadar zor.
Kim ne zaman ne yaptı?
Air'in verdiği takvime göre açık Mayıs 2026'da bulunmuş, dört ajana karşı da çalışan bir kavram kanıtıyla (proof of concept). Haziran'da dört üreticiye de bildirilmiş. Sonrası üretici üretici değişiyor:
Anthropic, Claude Code: Air'e göre Anthropic düzeltmeyi 17 Haziran 2026'da Claude Code 2.1.179 ile doğrulamış. Yalnız şunu bilin: 2.1.179'un sürüm notlarında bu düzeltmeden söz edilmiyor. "Düzeldi" bilgisi Air'den geliyor.
OpenAI, Codex: Burada iş belgeli. openai/codex deposunda "Verify Git plugin SHA checkouts" başlıklı 34644 numaralı pull request 22 Temmuz 2026'da birleştirilmiş. Yaptığı şey tam olarak olması gereken: checkout'tan sonra çözülen HEAD pinlenmiş SHA ile birebir aynı değilse eklenti kaynağını reddediyor. Air, 12 Ağustos'ta Codex 0.146.0'ın düzeldiğini doğrulamış. Kodunu açıkça okuyabildiğiniz bir düzeltme, bir sürüm notundaki suskunluktan her zaman daha inandırıcıdır.
GitHub Copilot (Microsoft): Eylül ortası itibarıyla yayımlanmış bir düzeltme yok. Air Haziran'da bildirdiğini söylüyor. Microsoft, The Register'ın yorum isteğine yanıt vermemiş. Eylül ortasından sonraki durumu biz de kontrol edemedik, o yüzden Copilot için bugün kesin bir şey söyleyemiyorum.
Google, Gemini CLI: Google 4 Ağustos'ta düzeltme çıkarmayacağını söylemiş. Gemini CLI'ı kullanımdan kaldırdığını (deprecated), kullanıcıları korunaklı olduğunu söylediği Antigravity'ye yönlendirdiğini bildirmiş. Bireysel kullanıcılara yönelik Gemini CLI hizmeti Haziran 2026'da sona ermiş, kurumsal erişim ise sürüyor. Kurumsal kullanıcıların bir düzeltme alıp almayacağı belli değil. (Emekliye ayrılan bir aracın kapısı açık kalmış. Bizim mahallede buna "evi sat ama anahtarı paspasın altında bırak" denir.)
18 Eylül itibarıyla açığa bir CVE numarası verilmemiş. Dört üreticiden hiçbiri bir güvenlik bülteni (advisory) yayımlamamış. Bilinen gerçek bir saldırı da yok.
GitHub'ın itirazı ve "sıfır tık" tartışması
Haberi 17-19 Eylül arasında The Register, CSO Online, The Next Web ve Cloud Security Alliance'ın bir araştırma notu verdi. Bunların hepsi Air'in çerçevesini olduğu gibi tekrarladı: sıfır tıkla uzaktan kod çalıştırma (RCE - Remote Code Execution), yapay zekâ tedarik zincirine türünün ilk saldırısı. Ben bu çerçeveyi biraz kırparak okumanızı öneririm. Nedenini anlatayım.
Birincisi, dal adı yöntemi yalnızca özet görünümlü dal adlarına izin veren sunucularda çalışıyor: Bitbucket ve kendi kurduğunuz git sunucuları gibi. GitHub bu tür adları reddediyor. GitHub sözcüsü The Register'a bunun GitHub üzerinde istismarı engellediğini söylemiş. Air buna katılmıyor, çünkü pazar yerleri başka yerlerde de barındırılabiliyor. Air bir de GitHub'ın kuralının FETCH_HEAD adlı bir dalı açıkça engellemediğini öne sürüyor. The Hacker News'in haberi önemli bir ayrıntı ekliyor: Anthropic'in topluluk kataloğundaki eklentilerin tamamı, Claude Code ile Copilot'un varsayılan kataloglarındakiler de GitHub'ı gösteriyor. Yani gerçek dünyadaki tehlike asıl olarak Bitbucket'ta ya da kendi sunucusunda duran pazar yerlerine daralıyor.
İkincisi, "sıfır tık" iddiası. Air, Claude Code ile Codex'te eklentilerin arka planda kendiliğinden güncellenmesinin varsayılan olarak açık olduğunu, dolayısıyla kılık değiştirmiş kodun kullanıcı hiçbir şey yapmadan kurulabileceğini söylüyor. Anthropic'in ve GitHub'ın belgeleri ise otomatik güncellemenin yalnızca yerleşik, GitHub'da barındırılan pazar yerleri için varsayılan olarak açık olduğunu yazıyor. Üçüncü taraf pazar yerlerinde "sıfır tık" iddiası bu yüzden tartışmalı. Dal adı hilesinin çalıştığı yerle otomatik güncellemenin varsayılan olarak açık olduğu yer, belgelere bakılırsa pek örtüşmüyor.
Üçüncüsü, kimin konuştuğu. Air kendi ürünlerini satan bir şirket (Air Marketplace ve Air Filter). Yazılarında bu ürünleri kullanan kurumların etkilenmediğini de belirtiyorlar. "Milyonlarca ajan etkilendi" sözü de Air'in kendi tahmini. Bulgu ciddi ve gerçek, bunu tartışmıyorum. Ama sonuçta okuduğunuz bir satıcı yazısı, bunu aklınızın bir köşesinde tutun.
Asıl ders: mühür kontrol edilmezse süs olur
Bu açığın beni en çok düşündüren yanı teknik olarak ne kadar basit olduğu. Pinlemenin bütün amacı "elimdeki şey incelenen şeyle aynı" diyebilmek. Ajanlar mührü okumuş, ama paketin mühürle eşleşip eşleşmediğine bakmamış. Önerilen düzeltme de tek satırlık bir fikir: checkout'tan sonra çözülen HEAD'i pinlenmiş SHA ile karşılaştır, farklıysa dur. Bunu pazar yeri yapamaz, çünkü kodun nereye checkout edildiğini görmez. Kontrol ajanın içinde olmak ZORUNDA. Codex'in birleştirilen düzeltmesi de tam olarak bunu yapıyor.
Bir de şunu sormak lazım: Zaten kurulmuş ve kılık değiştirmiş bir eklenti güncellemeden sonra temizleniyor mu, yoksa güncelleme yalnızca bundan sonraki değişimleri mi engelliyor? Bu sorunun yanıtı hiçbir kaynakta yok. Bilmediğim şeyi bildiğimi söylemeyeceğim. Üreticiler bu konuda bir şey yazmadıkça kurulu eklentilerinize kendiniz bakın.
Peki siz ne yapacaksınız?
Eh, hemen paniğe kapılmayın. Ama boş da durmayın:
- Ajanınızı güncelleyin. Claude Code'u 2.1.179 ya da üstüne, Codex'i 0.146.0 ya da üstüne çıkarın. Bu iki sürümün altında kalmak için bir nedeniniz olamaz.
- Gemini CLI kullanıyorsanız (özellikle kurumsal tarafta) üreticinin düzeltme çıkarmayacağını söylediği bir araçla çalıştığınızı bilin. Üçüncü taraf pazar yerinden eklenti almayın ya da araçtan vazgeçin.
- Copilot kullanıyorsanız Microsoft bir düzeltme duyurana kadar GitHub dışındaki pazar yerlerinden eklenti almamanızı öneririm.
- Pazar yerinizin nerede durduğuna bakın. Bitbucket ya da kendi git sunucunuzda barındırılan bir pazar yeri ekliyseniz, orada otomatik güncellemeyi kapatın. Güncellemeyi elle, neyin değiştiğine bakarak yapın.
- Kimlik bilgilerinizi ajanın erişebileceği yerlerde açıkta bırakmayın. Bu yalnızca Plugin4Shell için değil, her eklenti için geçerli.
- Ve en önemlisi: ajana bir projeyi açmadan önce MUTLAKA yedeğiniz olsun. Ajan kodu sizin yerinize çalıştırıyor, sizin yerinize siliyor da.
Bana sorarsanız bu olayın en temiz yanı Codex tarafı: düzeltme açık, kodu okunabiliyor, ne yaptığı belli. En karanlık yanı ise Gemini CLI. Bir aracı kullanımdan kaldırmak açığını kapatmıyor, sadece kapatmayacağınızı ilan ediyor. Arada kalan Claude Code'a gelince: düzeltme var gibi görünüyor ama bunu Anthropic'in sürüm notundan değil, araştırmacılardan öğreniyoruz. Bir güvenlik düzeltmesini kullanıcıya duyurmak da düzeltmenin bir parçası olmalı.
Bizden buraya kadar. Kurulu eklentilerinizi gözden geçirirken tuhaf bir şeye rastlarsanız bize yazın (evet, mektup diyorum, e-postaya da razıyız). Gelecek ay görüşmek üzere, hoşçakalın!
Kaynaklar
- Birincil kaynak air.security