“Yardımcıdan Düşmanca Eylete: Ajanslı Yapay Zeka Geliştirici Araçlarının Kötüye Kullanılması”

Geliştiriciler, kodlama için giderek daha fazla yapay zeka destekli araçlara yöneliyor. Bu araçlar arasında Cursor, OpenAI Codex, Claude Code ve GitHub Copilot yer alıyor. Bu otomasyon araçları, hızla gelişim ve inceleme yapmanıza yardımcı olurken, aynı zamanda siber suçlular için genişleyen bir saldırı yüzeyi de oluşturuyor.

Bunlar, farklı uygulama şekillerine sahip olsa da, geliştiricinin yerine eylemler belirlemek için LLM’leri kullanan ortak bir çerçeveye sahiptir. Daha fazla otonomi, daha fazla erişim ve yetenek anlamına gelirken, bu durum birlikte genel belirsizlikte bir artışa yol açıyor.

Bu blogda, saldırganların basit suçlama saldırılarını nasıl kullanabileceğini detaylandıracağız. Amacımız, güvenilmeyen verileri kullanarak, yardımcı uyum ile artan ajan otonomisini birleştirip, geliştirici makinelerinde uzaktan kod yürütme (RCE) elde etmek.

Bu, Black Hat USA’da sunduğumuz bir saldırı çerçevesinin genel bir incelemesidir.

Bilgisayar Kullanım Ajanları Nedir?

Bizim amacımız için, bilgisayar kullanım ajanı (CUA), verilen bir makinede, oturum açmış kullanıcı ile aynı erişim ve izinlere sahip olarak, otonom bir şekilde eylem ve araçları gerçekleştirebilen herhangi bir ajandır.

Genellikle, bu ajanlar, kullanıcı sorgularını, kodları ve komut sonuçlarını analiz etmek için LLM’leri kullanarak bir sonraki eylemi belirler. Kullanıcı isteği tamamlanana kadar sürekli olarak eylemleri devreye almak için tasarlanmıştır. Bu eylemler, fareyi hareket ettirmek veya tıklamak, yazmak, dosyaları düzenlemek ve hatta komutları yürütmek gibi şeyleri içerebilir.

Ajanlar, mümkündür eylem yollarına göre otonomi seviyeleri ile sınıflandırılmaktadır. CUA’lar genellikle seviye 3 ajanlar olarak sınıflandırılır. Bir model—genellikle bir LLM, ama sıklıkla görüntü modelleri ile desteklenir—bir sonraki eylemleri belirler ve bu eylemlerin sonucu modele geri döner. Bu, bir yürütme döngüsü oluşturur ve belirgin bir belirsizlik derecesi sağlar.

General architecture of computer use agents, showing the communication flow between the server agent determining the next tool calls, and the client agent executing the tools. The diagram highlights the execution loop, in which the client continues to execute tools until the server agent (using LLM/vision/other models) determines that the users original task is completed
Şekil 1. Bilgisayar kullanım ajanlarının genel mimarisi

Herhangi bir sorgunun veri ve yürütme akışını güvenilir bir şekilde haritalamak imkânsızdır, çünkü sonuç her seferinde farklı olabilir. Bu belirsizlik, bu ajanların bir kullanıcının makinesinde komutları yürütme yeteneğiyle birleştiğinde, saldırganlar için geniş fırsatlar yaratır.

Ajan Uyumunu Nasıl Kullanabiliriz?

Bu ajanlara karşı bir saldırı geliştirmek, önce onların yeteneklerini, genel uyumunu ve yaygın kullanım durumlarını anlamayı gerektirir.

Örneğin, Cursor gibi araçlar (varsayılan otonom yürütme özelliği açık olduğunda), kullanıcılarının görevlerini otonom olarak tamamlamak üzere tasarlanmıştır ve bu, kod tabanını düzenlemek ve gerekli terminal komutlarını yürütmek gibi eylemleri içerir. Cursor’un çalışma mantığını daha iyi anlamak için, onun çeşitli sistem istemlerine göz atabilirsiniz.

Kodlama görevini çözmek için yanınızda araçlar var. Araç çağrılarına ilişkin aşağıdaki kurallara kesinlikle uyun ve tüm gerekli parametreleri sağladığınızdan emin olun.
...
8. Sorularınızı aydınlatmak ve kullanıcının isteğini tamamen çözmek için ihtiyaç duyduğunuz kadar dosyayı otonom olarak okuyabilirsiniz, sadece bir dosya değil.
9. GitHub çekme talepleri ve sorunları, kod tabanında daha büyük yapısal değişiklikler yapma yolları hakkında faydalı bilgiler içerebilir. Ayrıca, kod tabanındaki son değişiklikler hakkında soruları yanıtlamak için de çok yararlıdırlar. Kullanıcı sorusunu yanıtlıyor olduğunuzu düşünüyorsanız, bir çekme talebinin veya bir sorunun ayrıntılarını almak için ilgili aracı çağırmalısınız. Pull request ve sorunlarının her zaman güncel olmadığını unutmayın, bu nedenle daha yeni olanları eski olanlar yerine öncelikli olarak değerlendirmelisiniz. Bir çekme talebini veya sorunu numarasıyla belirtirken, onu harici olarak bağlamak için markdown formatını kullanmalısınız.

Burada, Cursor’un bir repository’nin herhangi bir çekme talebi veya sorusunu almasına açıkça yönlendirildiğini görmekteyiz. Bu veri kaynağı güvenilir değildir, çünkü dış katkıcılar, bir repository’e çekme talepleri ve sorunlar açabilir. Bunu bildiğimiz için, dolaylı istek enjeksiyonunu kullanarak, mavi hayal gücü ile zararlı talimatları bir GitHub sorusu veya çekme talebine yerleştirebiliriz.

Göstermek adına, hedef repository’miz olan PyCronos, sahte bir Python veri analizi kütüphanesidir. Amacımız, tipik bir ajan kullanımında, bu hedef repository’nin geliştiricilerinin ve yöneticilerinin makinelerinde kod yürütme elde etmesini sağlayacak bir enjeksiyon oluşturmaktı.

Paketin Yüklenmesi İçin Zararlı Yükü Nasıl Yerleştirebiliriz?

Cursor’un otonom olarak terminal komutlarını yürütme kapasitesine sahip olduğunu bildiğimiz için, hedef kullanıcının makinesinde nihayetinde çalıştırılacak bir zararlı yük geliştirmemiz gerekir. Bu örnekte, basit bir Powershell script’i obfuse (karıştırılmış) ederek, Windows geliştiricilerini hedef almayı planladık. Açık kaynak obfuse edici araçlar kullanarak, script sürekli olarak karıştırıldı ve temel Windows Defender korumalarını atlatmayı başardı.

Hayali PyCronos repository’ni hedef alarak, pycronos-integration isimli bir GitHub kullanıcı hesabı oluşturduk. Bu hesaptan win-pycronos adında bir repository yaratarak, Powershell yükünü yerleştirdik.

Şekil 2. Obfuse edilmiş ters shell PS script’in parçası

Artık pycronos-integrations hesabından, bir kullanıcının Cursor ajanını, zararlı Powershell yükümüzü indirmesi ve yürütmesi için ikna etmeye yönelik dolaylı istek enjeksiyonu yapmak zorundayız.

Talep Enjeksiyonunu Nasıl Yerleştiririz?

Öncelikle dolaylı istek enjeksiyonu yapmaya GitHub sorunları aracılığıyla başlıyoruz. Aslında, bu sorunun analiz edilen ajanı ikna etmenin bir yolu olarak görülüyor.

Şekil 3. GitHub sorusu üzerinden dolaylı istekte bulunan bir saldırgan

Burada saldırgan, kütüphanenin (olmayan) Windows entegrasyonunun bozulduğunu ileri sürüyor. Sorunun, hatayı yeniden üretmek için belirli bir komut çalıştırmak gerektiğini iddia ediyor. İnsan bir inceleyici, bu özelliğin olmadığını fark edebilecek olsa da, bu komut uzaktan bir kaynaktan kod indirmek ve yürütmek için.

Bu saldırı yolunu önce Anthropic’in Bilgisayar Kullanım Ajansı deneme sürümüne karşı test ettik. Bu sürümde, istek enjeksiyonunun mümkün olduğunu belirten bir güvenlik uyarısı bulunuyor ve ajan yalnızca izole bir ortamda kullanılmalıdır.

Eğer bir kullanıcı, CUA’ya “Bu repository’deki açık sorunların çözülmesine yardım et” gibi bir talepte bulunursa, ajan buna uyar.

Şekil 4. CUA aracının ilgili soruya yönelme görüntüsü

Ajan, açık soruya yönelerek ekran görüntüsünü analiz ediyor ve yürütmesi gereken komutu çıkartıyor. Ardından, mevcut araçları kullanarak başarılı bir şekilde yürütüyor ve saldırgana geri shell sağlıyor.

Şekil 5. CUA’nın komutu başarıyla yürütmesi

Aynı saldırı yolunu Cursor’a karşı denediğimizde durum bu kadar basit değildi. Cursor, metni doğrudan sorunun meta verilerinden çekiyor ve uzaktaki kodu indirme ve yürütme girişimini gördüğünde, kullanıcıyı olası riskler hakkında bilgilendirip görevi tamamlamayı reddediyor.

Şekil 6. Cursor aracının zararlı komutu yürütmeyi reddettiği ekran görüntüsü

Bu durum, Cursor’un GitHub sorgusunu tarayarak potansiyel zararlı komutlar için koruma önlemlerinin bulunduğunu gösteriyor. Şimdi, amacımız enjeksiyonumuzu daha masum görünür hale getirerek, yükleme talebini daha güvenilir kılmak.

Bunu yapmak, yükleme için zararlı talebi gizleyerek, sahte bir Python paketi oluşturmak oluyor. Saldırganın pycronos-integrations repository’sinden, görünüşte zararsız bir pycronos-windows paketi oluşturuyoruz.

Şekil 7. GitHub’da görünüyor gibi olan zararsız kütüphane

setup.py dosyasına uzaktan yüklenip yürütülecek zararlı komutu koyuyoruz.

Şekil 8. Bu paketin zararlı yükünü içeren setup.py dosyası

Bu komut, bu paket pip install edildiğinde RunCommand işlevini çalıştırır.

Sonra, hedef repository’de bu paketi mevcut projeye bağımlılık olarak eklemek için bir çekme isteği oluşturuyoruz.

Şekil 9. Hedef repository’ye zararlı bağımlılığı ekleyen PR

Kullanıcı, Cursor ajanına açık çekme isteklerini gözden geçirmesi konusunda bir komut verdiğinde, bir dal oluşturur, değişiklikleri kontrol eder ve pip install -r requirements.txt komutunu çalıştırır.

Şekil 10. Cursor aracının zararlı paketi yüklediği ekran görüntüsü

Kullanıcının makinesinde, zararlı paket kurulduğunda, saldırgan geri shell alarak, kullanıcının bilgisayarında doğrudan yürütme gerçekleştirir.

Bu saldırı, tüm bu tür saldırıları mümkün kılan bir kalıbı vurgulamaktadır: aşırı yetkilendirilmiş bir ajanın güvenilir veri olarak güvenilmeyen verileri değerlendirmesi, saldırganın ajanı kendi lehine bir araç haline getirebilmesi için yeterlidir.

Böyle Saldırılardan Nasıl Korunabiliriz?

Black Hat USA 2025’te From Prompts to Pwns: Exploiting and Securing AI Agents konulu konuşmamızda, “istek enjeksiyonunu varsayma” yaklaşımının benimsenmesini öneriyoruz. Eğer bir ajanın LLM’leri eylemleri belirlemede kullanıyorsa, saldırganın LLM çıktısını kontrol edebileceğini ve dolayısıyla tüm ardışık olayları kontrol edebileceğini varsayın.

Benzer ajansik uygulamalar tasarlarken, NVIDIA’nın LLM zafiyet tarayıcısı garakyı kullanarak bilinen istek enjeksiyon sorunlarını test etmek faydalı olabilir. LLM’lerin isteğe karşı daha dayanıklı hale gelmesi için NeMo Guardrails ile LLM giriş ve çıkışlarını güvence altına almayı düşünebilirsiniz.

En güvenli yaklaşım, otonomi düzeyini mümkün olduğunca kısıtlamak ve ajanın rastgele planlar yürütmesini önleyebilecek belirli belirlenmiş iş akışlarını tercihe almaktır. Eğer bu mümkün değilse, özellikle güvenilmeyen verilerin bulunduğunda “hassas” komutlar veya işlemler için insan onayı uygulamak önemlidir.

Geçici olarak insan denetimi olmayan tamamen otonom ajansik iş akışları gerekliyse, en iyi yaklaşım, bunların mümkün olduğunca hassas araçlardan ya da bilgiden izole edilmesidir. Örneğin, tamamen otonom bilgisayar kullanım ajanları yalnızca sınırlı ağ çıkışı ve kurumsal verilere sınırlı erişimle, bağımsız bir sanal makinede çalıştırılmalıdır.

Buna ek olarak, yerel geliştirme konteynerlerinin kullanımını zorunlu kılmak benzer bir ama daha az etkili bir yaklaşımdır; bu da ajanın belirli bir derecede izolasyon sağlamasını sağlar fakat tam izole edilmiş bir sanal makineden daha az etkilidir.

Cursor’a özel olarak, işletim müdahale araçları, otomatik yürütmeyi devre dışı bırakma veya yalnızca izin verilen komutların otomatik olarak çalıştırılmasını sağlama gibi kontroller sunar. Ayrıca, kullanıcıların Cursor’un izole bulut altyapısında konteynerler içinde otonom ajanlar başlatmasına olanak tanıyan arka plan ajanları mevcuttur.

Ajanik kodlama iş akışları, sektörde hızlı gelişim becerilerini açığa çıkardı. Ancak, bu yeni verimliliği etkili bir şekilde kullanmak için, işletmelerin ve geliştiricilerin potansiyel riskleri anlaması ve azaltıcı politikalar benimsemesi gerekir.

Daha fazla detay için, lütfen Black Hat USA’daki konuşmamızı izleyin. Black Hat, konuşma kaydını YouTube üzerinde uygun olduğunda paylaşacaktır.

Kaynak

Nvdia Blog

Exit mobile version