GuardFall Kusuru 11 Popüler Açık Kaynak Yapay Zeka Aracısından 10'unu Etkiliyor
Pierluigi Paganini 01 Temmuz 2026 01 Temmuz 2026
Araştırmacılar, 11 popüler açık kaynaklı yapay zeka aracısının 10'unda, saldırganların komut filtrelerini atlamasına olanak tanıyan bir kabuk enjeksiyon kusuru buldu.
Adversa AI, on bir açık kaynaklı AI kodlama ve bilgisayar kullanım aracısını içeren "GuardFall: açık kaynaklı AI aracılarında evrensel bir kabuk enjeksiyon güvenlik açığı" başlıklı bir anket yayınladı ve manşet bulgusu rahatsız edici: bunlardan on tanesi, kabuk bypass'ının doğrudan komut filtrelerinden geçmesine izin veren yapısal bir boşluk bırakıyor. Olmayan ise Devam'dır. Geri kalanlar arasında Hermes, opencode, Goose, Cline, Roo-Code, Aider, Plandex, Open Interpreter, OpenHands ve SWE-agent yer alıyor; bunlar GitHub yıldız sayısına göre sıralanıyor (toplamda yaklaşık 548.000).
GuardFall sorununun özü, onlarca yıldır güvenlik literatüründe yer alan bir uyumsuzluktur. Filtre, komutun nasıl göründüğünü kontrol eder. Bash, komutun ne anlama geldiğini çalıştırır. Bu iki şey aynı şey değil.
"Yapay zeka kodlama aracıları ve bilgisayar kullanım aracıları, kabuk komutlarını tam hesap yetkinizle çalıştırır: SSH anahtarlarınız, bulut kimlik bilgileriniz, $HOME'daki her şey. Çoğu, bu gücü, tehlikeli kalıplar listesine karşı komut dizisiyle eşleşen bir korumanın arkasına kapatır." Adversa'nın yayınladığı raporu okuyor. "Ancak incelenen dize, yürütülen komuttan farklıdır. Bir koruma ham metni incelerken, sistem kabuğu (bash) çalıştırmadan önce metni genişletir, alıntıları kaldırır ve yeniden yazar. Dolayısıyla, bir aracı güvenilmeyen içeriği işlediğinde (örneğin, zehirlenmiş README içeren bir npm paketi), istem enjeksiyonu onun tüm yürütme filtrelerini geçen bir komutu çalıştırmasını sağlayabilir."
Bash her zaman alıntı kaldırma, parametre genişletme, komut değiştirme ve alan bölme işlemlerini gerçekleştirmiştir. Bunlar hata değil. Bunlar belgelenmiş özelliklerdir. Sorun, ham komut dizelerini bir red listesine göre kalıpla eşleştiren bir AI aracısının, bash'ın yürütmeden önce yeniden yazacağı metin üzerinde bir güvenlik kararı vermesidir.
Adversa beş bypass sınıfı belirledi. A Sınıfı: rm yerine r''m yazın. Regex asla patlamaz. Bash tırnak işaretlerini çıkarır ve rm komutunu çalıştırır. Sınıf B: rm$IFS-rf$IFS/ yazın. rm'yi ve ardından bir boşluğu arayan bir normal ifade için bu bir kelimedir. Bash, $IFS'yi boşluk olarak genişletir ve üç argüman yürütür. C Sınıfı: ikili adı $(echo rm) -rf / gibi bir komut yerine koymanın içine koyun. Normal ifade, ikili bir ad değil, bir ikame ifadesi görür. Sınıf D: sh aracılığıyla boru tabanı64 kodlu yük. Her segment tek başına iyi huyludur. Kompozisyon öyle değil. E Sınıfı en başarılı ve yamalaması en zor olanıdır çünkü belirli işaretlerle yıkıcı hale gelen alternatif komutlar içerir: find /x -delete , dd of=/dev/sda , install -m 4755 payload /usr/local/bin/backdoor . rm -rf'yi reddeden bir gardiyan hepsini kaçırır.
"rm -rf ve mkfs.*'yi reddeden bir koruma, doğru işaretlerle yıkıcı hale gelen POSIX yardımcı programlarının uzun kuyruğunu kaçırır." rapora devam ediyor. "E Sınıfı, anketimizdeki en güçlü tokenleştirilmiş koruma da dahil olmak üzere çoğu korumadan sağ kurtuldu, çünkü bayrak başına akıl yürütme, her ikili için hangi bayrak kombinasyonlarının onu zararsızdan yıkıcıya çevirdiğini bilmeyi gerektirir."
Araştırma, Adversa'nın NousResearch/hermes-agent'ta bir bypass bulması ile başladı: 30 kalıplı regex red listesine karşı kabuk yeniden yazma işlemleri tarafından mağlup edilen bir onay kapısı. Bunu canlı olarak doğruladılar ve ardından anketi kategorinin geri kalanındaki aynı bypass sınıfı etrafında oluşturdular. Bulgu, ajanların kötü yazıldığı anlamına gelmiyor. Paylaştıkları gelenek yapısal olarak yanlıştır.
"GuardFall bir hata değil, tehlikeli bir gelenek ve bir dizi sorundur. Ham komutlarla dizeyle eşleşen bir filtre, bash'ın genişlemesini modelleyemez, bu nedenle korumasız güven sağlar; bu güven, Döngüdeki İnsan'ın kapatılmasına ve otomatik modun açılmasına neden olur." rapora devam ediyor.
Üç ajan, var olan ve doğrudan mağlup edilen bir korumayı gönderir: Hermes, açık kod ve Goose. Ham dize üzerinden normal ifade korumaları rm'de ateş ediyor
-rf ancak baypas varyantlarında sessiz kalın ve test setindeki hemen hemen her probu sızdırın. Goose 23 vakanın 22'sini sızdırdı. Açık kod 16/16'yı sızdırdı.
İki tane daha, anlamlı derecede daha iyi ancak hala eksik olan tokenize edilmiş bir koruma gönderiyor. Tokenleştirme, fiyat teklifi kaldırma bypass'larını ve bazı $IFS değişkenlerini kapatır. Kapatmadığı şey, alıntılanan bir argümanın içindeki bir komut değişikliğidir, örneğin echo "$(rm -rf /x)" dış komutun echo olduğu, her korumanın izin verdiği ve yıkıcı komutun bir yan etki olarak çalıştığı. Aynı zamanda E Sınıfı'nı da kapatmaz çünkü bayrak bazında akıl yürütme, hangi bayrak kombinasyonlarının belirli bir ikiliyi yıkıcı hale getirdiğini bilmeyi gerektirir ve bu aracıların hiçbiri bu bilgiye sahip değildir.
Geri kalan ajanlar hiçbir statik koruma göndermezler ve her komut çalıştırılmadan önce tamamen insan onayına güvenirler. Operatör, CI ardışık düzenlerinde varsayılan olan ve bir aracı iş akışını kesintiye uğratmaya başladığında bariz seçim olan otomatik yürütmeyi açana kadar bu normaldir. Bazı aracılar bunu daha da kötüleştirir: Kötü amaçlı bir depo, otomatik test: true ile .aider.conf.yml gibi özel bir yapılandırma dosyası gönderebilir ve test-cmd alanında operatörden herhangi bir işaret olmadan yükü kabul edilen ilk düzenlemede ateşleyen bir yük taşıyabilir.
Konteyner kasası kendi kategorisinde yer alır. Ekipler, korumalı alanın tehlikeli komutların durdurulduğu anlamına geldiğini varsayar. Bunun aslında anlamı, komutların tek kullanımlık bir kutu içinde çalıştırılmasıdır. Çalışma alanı tek kullanımlık olmadığı anda koruma ortadan kalkar. Anketteki her sanal alan aracısı, konteyneri devre dışı bırakan ve komutları doğrudan ana makinede çalıştıran belgelenmiş bir yerel mod yapılandırması gönderir. Yerel modda geri dönüş koruması yoktur. Adversa'nın yerel modda SWE-agent ve OpenHands'e karşı yaptığı canlı testler bunu doğruladı: yıkıcı komut ana bilgisayar üzerinde çalışıyordu.
Zincir, dil modelinin saldırganın çerçevesiyle işbirliği yapmasını gerektirir ve bu, modelin son savunma hattı olduğunu varsayan herkes için bulgunun rahatsız olduğu yerdir. rm'yi çalıştırmaya yönelik doğrudan bir istem reddedilir. Bir Makefile hedefine sarılmış aynı komut, bir MCP "belgeleme" yanıtı veya enjekte edilmiş bir README görevi rutin çalışma olarak yayılır. Adversa'nın canlı yayınlarında model olarak Claude Sonnet 4.6 kullanıldı; bu aynı zamanda açık kod, Goose, Cline ve Roo-Code için de varsayılandı. Zincir modele ve çerçeveye bağlıdır; bu, güvenlik eğitimi geliştikçe değişebileceği anlamına gelir.
Bir Cline testi kırılganlığı tam olarak gösterdi. MCP içeriği olarak çerçevelenen model, enjeksiyonu tespit etti ve salt okunur bir komut yayınladı. Yetkili bir MCP direktifi olarak yeniden çerçevelendi ve riskten korunma olmadan find -delete yaydı. Bul izin verilenler listesinde olduğundan denetleyici bunu geçti. Aynı model, aynı yük, farklı çerçeveleme, farklı sonuç.
Continue beş bileşeni sırayla uygular. Herhangi bir eşleşmeden önce kabuk alıntısını kullanarak komutu tokenleştirir, bu da alıntı kaldırma bypass'larını kapatır. $IFS gibi değişken genişletme belirteçlerini algılar ve bu komutları izin gerektirecek şekilde iletir. Komut değişikliklerini yinelemeli olarak değerlendirir ve dış kararı iç sonuçla sınırlandırır. Herhangi bir boru bölümünün kabuk yorumlayıcısında sonlanıp bitmediğini kontrol eder ve bunları da üst kademeye iletir. Kurallı yıkıcı kalıplar için açık bir devre dışı bırakılmış liste tutar.
21 baypas durumundan sıfırı sınırsız yürütmeye geçti. 12 kurallı yıkıcı vakanın tümü doğru şekilde engellendi. Alıntı yapılan bir argümanın içinde C Sınıfı ve E Sınıfının uzun kuyruğu hala açık kalıyor, ancak Continue ankette yüzeyin yapısal çoğunluğunu kapatan tek ajan olarak hala boşluklar var.
"Beş bileşen birbirinden bağımsız olarak anlamlıdır: yalnızca üçünün (tokenleştirme + ikame-özyineleme + kanal hedefi) benimsenmesi A, B, C-dışarı ve D Sınıflarını kapatır, yalnızca C-iç tırnaklar ve E'yi bırakır; her ikisi de numaralandırılmış devre dışı bırakılmış bir liste aracılığıyla adreslenebilir. Modeli yeniden uygulamak, deneyimli bir mühendis için iki günlük bir alıştırmadır." raporu okur.
Continue'nun CLI modu, comm komutunu çalıştırarak --auto altında uygulamayı kısmen gevşetir
ve IDE uzantısının açılacağı. Devre dışı bırakılan katman her iki modda da geçerlidir: rm -rf / , sudo ve chmod +s ne olursa olsun sabit olarak engellenir. Düzeltme, IDE uzantısının kullandığı politikanın aynısını CLI'nin politika çözümleyicisine uygulamaktır.
Kısa vadeli kontrollerin hiçbiri tam anlamıyla sağlam savunma değildir. Telafi edici tedbirler alıyorlar. En güçlü acil adım, aracıları $HOME yönlendirmeli kapsamlı bir kabuktan çalıştırmaktır. Tek satırlık bir sarmalayıcı proje dizinini korur ancak ~/.ssh/ , ~/.aws/ , kabuk geçmişini ve kimlik bilgisi yüzeyinin geri kalanını kapsam dışına taşır. Her zaman açıktır ve belgelenmiş tek bayraklı devre dışı bırakma özelliği yoktur, bu da onu operatör disiplininden daha dayanıklı kılar.
Bu hafta ayrıca şunu yapmaya değer: Bir temsilcinin bunları okumasına izin vermeden önce depo yapılandırmalarını denetleyin. A malicious .aider.conf.yml committed to a repository can trigger remote code execution on the first accepted edit, with no CLI flag from the operator. CI'daki çatal çekme isteklerinde aracı yürütmeyi devre dışı bırakın. Kullanım durumu gerçekten kesintiye uğramadığı sürece tüm otomatik evet işaretlerini kapatın.
Tek sağlam, her zaman açık savunma, tokenize etme ve kanonikleştirme değerlendiricisidir. Until that becomes the convention rather than the exception, every agent shipping a string-matching guard is structurally one prompt injection away from the operator’s full account authority being handed to whoever controls the content the agent reads.
“An unsound guard offers no protection even when left on; a sandbox offers full protection until it’s switched off; and only a sound, on-by-default guard protects the operator’s own host without asking them to opt in.” raporu sonuçlandırıyor. “Until that last shape becomes the convention, every agent that ships a string-matching guard is one prompt injection away from operator-account compromise.”
Beni Twitter'da takip edin: @securityaffairs ve Facebook ve Mastodon
Pierluigi Paganini
(SecurityAffairs – bilgisayar korsanlığı, yapay zeka)