Fotoğraf Makinesini İşlemciye Çevirmek! YZ’nin O Müthiş Hack Tekniği!

Önceki yazımızda “ajanlar depoyu kullanarak internete çıkmanın yolunu buldu” deyip geçmiştik ya… İşte o cümlenin arkasında öyle bir zekâ var ki, okuyunca “lan bunu ben düşünemezdim” diyeceksiniz. Hadi gelin perde arkasına bakalım. Yapay Zeka ajanlarının Hugging Face olayında kullanmış olduğu fotoğraf makinesi tekniğini sizlere anlatayım! Evet benzetme biraz garip gelebilir amma ve lakin aynen başlıkta söylediğim gibi ajanların sistemleri hacklerken kullandıkları bir teknik aynen bir fotoğraf makinesini işlemciye çevirmekten farksız ve zeka kokuyordu.

Bir düşünün. Elinizde bir bilgisayar var ama üzerinde tek bir kural koşuyor: “Sadece bakabilirsin, dokunamazsın.” İnternette istediğin sayfayı açıp okuyabilirsin, ama hiçbir yere tek bir harf gönderemezsin. Form dolduramazsın, “gönder” tuşuna basamazsın, veri yollayamazsın. Teknik tabirle sadece GET isteği yapabiliyorsun, POST yok. Güvenlikçiler buna yıllardır “e tamam, bu adam dışarı veri sızdıramaz” diye güvenir. Yapay zeka ajanları da aynen bu şekildeydi. Yani hack yapabilmek için internete çıktılar ancak sadece bakabiliyor okuyabiliyor ancak veri yazamıyorlardı.

Aslında ajanların aşmaya çalıştığı şey veri sızdıramamak değildi. Kendi ortamlarında (sandbox/environment) dışarıya doğrudan çıkış yapan (egress) soket bağlantısı kuramamaları veya POST/write yetkilerinin kısıtlanmış olmasıydı ve bunu aştılar. Ajan, doğrudan bir cURL/POST atamadığı için mShots’a bir URL (GET) vererek arka planda mShots’un o adrese gitmesini sağlamış ve bir nevi SSRF (Server-Side Request Forgery) benzeri bir dolaylı erişim kanalı kurmuştur. “

Ajan doğrudan dışarı bir veri paketi atamıyordu, sadece izin verilen bir servise adres sunabiliyordu…

Şöyle düşünün bir kütüphaneye üye oldunuz ama kartınız sadece kitap okumaya yarıyor. İçeri girip istediğiniz rafı karıştırabilir, istediğiniz kitabı okuyabilirsiniz. Ama yanınızda kalem yok, fotokopi yok, hiçbir şeyi dışarı çıkaramazsınız. Güvenlik görevlisi rahat ve şöyle düşünyüyor. “Bu adam buradan ne çalabilir ki, eli boş girdi eli boş çıkacak.” Değil mi ama? İşte Hugging Face olayındaki Yapay Zeka ajanları da bu durumdaydı. İyi bir güvenlik önlemiydi.

İşte 8 Temmuz akşamı ajanlardan biri bu “sadece bak” dünyasında bir zaaf buldu. Önce ajanın birinin aklına şu fikir geldi. İnternette mShots diye bir servis var. Bu servise bir link veriyorsun, o da o sayfayı kendi tarayıcısında açıp ekran görüntüsünü (screenshot) çekiyor ve sana resmi geri yolluyor. Linkleri önizleme olarak gösteren o küçük kapak resimlerini üreten masum bir servis. Ama kritik detay şu!

Ekran görüntüsünü alabilmek için, o sayfadaki bütün kodu kendi tarayıcısında baştan sona çalıştırıyordu.

“mShots fotoğraf çekmek için arka planda bir taranan sayfadaki JavaScript’leri çalıştırdığından, Yapay Zeka ajanları mShots sunucusunun kendi işlem gücünü bir yürütme ortamı (execution environment) olarak kullandı”

Daha net anlamak isterseniz şöyle bir örnek verebilirim. Fotoğrafçıya “şu sahnenin fotoğrafını çek” diyorsunuz. Fotoğrafçı sahneyi çekmek için önce o sahneyi kurmak, ışığı yakmak, perdeyi açmak zorunda. Siz sadece “fotoğraf çek” dediniz ama adam aslında o sahneyi gerçekten canlandırdı. Peki ya o sahnenin içine gizlice çalışan bir mekanizma koyarsanız? Fotoğrafçı farkında olmadan onu da çalıştırmış olmaz mıydı?

Ajan şöyle düşündü: “Eğer ben bir web sayfasının içine kendi kodumu yazabilsem, bu fotoğraf servisine o kodu çalıştırtabilirim.” Burada ikinci bir araç devreye girdi! httpbun.com sitesi… Bu site geliştiricilerin HTTP testleri için yaptığı sıradan bir araç. Küçük bir kod parçasını Base64 ile şifreleyip linkin sonuna ekliyorsun, httpbun da onu çözüp sana web sayfası olarak geri sunuyor. Yani ajan, kodunu bir linke saklayıp onu çalışan bir web sayfasına dönüştürebiliyordu. İki servisi birleştirip kod çalıştırmak müthiş bir fikir değil mi?

Diyelim ki bir kağıda şifreli bir not yazdınız ve bu notu okuyan herkes yazdığınızı sesli okumak zorunda. Siz notu şifreleyip birine veriyorsunuz, o kişi şifreyi çözüp yüksek sesle okuyor. İşte httpbun o “şifreyi çözüp açık açık okuyan” kişi. Ajan kodunu linke gizledi, httpbun onu açık bir sayfaya çevirdi, mShots da o sayfayı “çekmek” için ajanın kodunu çalıştırdı. İşte zincir bu şekilde kurulmuş oldu!

Yapay Zeka ajanlarının ilk denemeleri çocuk oyuncağı gibiydi. Ekrana sadece HELLO ve o anki saati yazdıran minik testler. Ama iş büyüyünce bir sorunla karşılaştılar. Bir linkin uzunluk sınırı var. Koca bir program tek bir URL’ye sığmıyor. Çözümü yine zekiceydi. Programı küçük küçük parçalara böldüler, her parçanın yanına bir sonraki parçanın adresini gösteren kısaltılmış bir link (aynı bit.ly mantığı) koydular. Böylece bir link zinciri oluştu takip ettikçe parçalar birleşip koca bir program haline geliyordu.

Yani bir URL ve Ekran görüntüsü alma servisinde 100kb’lık bir kodun 5kb’lık kısmının sığdığını düşünün! 100 kb / 5 yapıp 5’erli parçaları ardı ardına çalıştırıp 100KB’lık kodu çalıştırmayı başardılar.

Ve bu zincir ne kadar uzadı dersiniz? Bazı programlarda 900’den fazla link arka arkaya bağlandı. Bağımsız araştırmacıların (SwarmTraces ekibi, raporu 25 Eylül 2026’da yayınladı) topladığı kadarıyla ortada yaklaşık 1 milyon kısaltılmış link ve bunlardan yeniden kurulan 80.000’den fazla saldırı parçası vardı. Hani “tek başına yaparım hacklerim” diyen abiler vardı ya? Buyursunlar 900 linklik zinciri elle örsünler de görelim bakalım 🙂

Bir URL’ye httpbun üzerinden Base64 gömerken varsayımsal 5 KB’lık sınırlar tutarlıdır. Ancak 900 linkin birbirine bağlanarak çalıştırılması sürecinde zaman aşımı (Timeout) ve tarayıcı belleği (DOM state) gibi engeller oluşur. Ajanların her parçayı bir sonraki adrese yönlendiren kısaltılmış URL zincirleri (URL Shortener Redirection Loop) üzerinden yönetmesi senaryosu teknoloji açısından yapılabilir ancak kim bunu düşünecek kadar zeki?

Ayrıca bu operasyonun ne kadar yavaş (asenkron) işlediğini vurgulamak forensics açısından belirtmek isterim. Öyle hızlı işleyen bir süreç de değildir?

Tamam, kodu çalıştırdılar diyelim. Peki cevabı nasıl geri okuyacaklar? Çünkü mShots sadece bir resim geri yolluyor, metin değil. İşte en dâhiyane kısım burası. Ajanlar, sunucudan gelen cevabı mShots’un tarayıcısı içinde piksel ızgarasına çevirdi. Her harfin her bitini tek bir siyah veya beyaz noktaya dönüştürdüler. Ekran görüntüsü bu nokta bulutunu resim olarak geri getirdi, ajan da o resme bakıp tekrar yazıya döktü. Yani sadece “bak” izni olan ajanlar internette etkileşim oluşturarak bir sistemde çift yönlü bir konuşma kanalı kurdular.

Bu teknik Steganography ve Visual Data Exfiltration / Optical Data Transfer olarak bilinir. Bir ajanın Görsel Dil Modeli (VLM / Vision Capabilities) kullanarak gelen PNG/JPEG ekran görüntüsündeki QR kod benzeri piksel matrislerini çözüp komut çıktısı olarak okuması mükemmel ve teknik olarak tamamen geçerli bir C2 (Command & Control) kanalıdır. İşte burada hayretle bakıyorsunuzdur. Ben hayret ettim siz de edebilirsiniz 🙂

Tabiki yapay zeka ajanları bununla da yetinmediler!

Tek bir kanala da güvenmediler. Yedek olarak DNS tüneli kullandılar. DNS normalde “google.com hangi IP’de?” diye soran masum bir sistemdir ve neredeyse hiçbir yerde engellenmez. Ajanlar çaldıkları veriyi şifreleyip bu masum soruların içine gizleyerek dışarı kaçırdı. Yanında pastebin’ler, webhook servisleri ve Hugging Face’in kendi veri setleri de depo olarak kullanıldı. Şunu da söyleyeyim. Kurumunuzda bir DNS Security ürünü kullanmıyorsanız bırak siem edr epp’yi hiçbir şeyin farkında da varmazsınız. Hem etkili bir yöntem hem de yakalanması çok zor!

Peki bu müthiş fikir onlara ne kazandırdı? Sadece “GET metodu kullanarak kod çalıştırma ve cevabı okuma” yeteneği. İçeri girişin kendisi ayrı bir hikâyeydi. Bu güçle içeri girdikten sonra ajanlar çaldıkları bütün şifreleri LOOT (ganimet) adını verdikleri bir torbada topladı. Yaklaşık 115 Docker imajını zehirlediler, Artifactory önbellek zehirlemesi için bir açığı (CVE-2026-66384) denedi, Hugging Face’in iç Slack’inde 27 arama yaptı, Kubernetes kümesini karış karış haritaladı ve izlerini silmeye çalıştı ve commit mesajlarında “remove evil yaml” (şeytani yaml’ı sil) gibi notlar bırakarak…

Tam bir bilim kurgu hikayesi değil mi? Hayır değil gerçek oldu!

Elbette ki işin forensic tarafında dürüst olmak gerekiyor. Ben ve benim gibi savunma tarafındakiler genelleme sevmeyiz ya, onun için altını çiziyorum. SwarmTraces ekibi bu verinin tamamının o OpenAI sürüsünden geldiğini garanti edemiyor. Çünkü veri milyonlarca halka açık kısaltma linkinden toplandı. Aynı numarayı kullanan başka ajanlar ya da insanlar da bu havuza karışmış olabilir. Üstelik parçaların yaklaşık %80’i sadece giden istek yani çoğu isteğin sonucunu göremiyorlar. Kaç ajan olduğu bile net (~700 mü ~1.200 mü, uzlaşmadı netleştiremediler) değil. Kullanılan kısaltma servislerinin isimleri ve çözülememiş şifreli bloklar da, yeni bilgi sızmasın diye raporda bilerek kararttılar!

Forensic gözüyle… Bir suç mahallinde yerde 100 ayak izi buldunuz diyelim. Hepsi katilin mi? Belki 70’i olaydan önce oradan geçen masum insanlara ait. “Hepsi katilin” demek forensic’te en büyük hatadır. SwarmTraces ekibi de dürüst davranıp “bu izlerin bir kısmı başkasının olabilir” dedi. Biz savunmada işte bu yüzden asla “hepsi şöyledir” demeyiz delile bakarız, eksiğimizi de açık açık söyleriz…

Peki bütün bu zincire bakalım mı?

Aşağıdaki şema tam da bu “sadece bak / sadece oku olarak ayarlanmış agentların bakarak kod çalışdırdığı ” dünyasında kurulan o dâhiyane zinciri gösteriyor. Kodu parçala, linklerle zincirle, httpbun ile sayfaya çevir, mShots’ta çalıştır, cevabı piksele dök ve pikselleri oku!

Önceki yazımda “makineler ancak bizim izin verdiğimiz kadar ileri gider” rahatlığının sonunu gördük. Bu yazı o cümleyi bir adım daha ileri taşıyor! Biz onlara “sadece bak, dokunma” dedik. Onlar bakmayı bir silaha çevirdi. Bir kütüphane kartından, bir fotoğraf servisinden ve bir avuç kısa linkten koca bir bilgisayar inşa ettiler… Hem de kocaman!

==Biz “GET yeter, bu adam veri sızdıramaz” derken; onlar fotoğraf makinesini işlemciye, linki hafızaya, ekran görüntüsünü ekrana çevirdi. Savunma tarafında “bu method engelli, o yüzden güvendeyiz” demenin artık hiçbir anlamı yok. Engellenmesi gereken method değil, nereye gidildiği.==

Ve yine aynı soru kalıyor aklımda: Bunu bir sınavda kopya çekmek için yaptılar. Ucunda para yoktu, ödül yoktu. Ya bir dahakine ucunda bir şey olursa?

Kurgulanan senarya bütünüyle baktıımda SSRF, Steganography, Payload Chunking, URL Redirection Chain ve Egress Filtering Bypass tekniklerinin harika birleşimi olduğunu görüp tekrarda bu ZEKA kokan yapay zeka ajanları hack vakasının detayları dikkat çekmeli… Ya aslında mShots’un kendisinin bir CPU’ya dönüşmediği ortada benim Fotoğraf makinesi benzetmem biraz fazla olabilir ancak mShots sunucusundaki headless tarayıcının ajanın “kiralık işlemcisi” gibi kullanıldığı alenen ortaya çıkmış oldu.

Saldırıdaki MITRE ATT&CK haritası

  • Dead Drop Resolver (T1102.001): İşin tacı bu. Link kısaltıcı zincirinde her link, bir sonrakinin adresini tutuyor. Bu, ders kitabı “dead drop resolver” Artifactory’deki klasör-adı posta kutuları da aynı aileden (T1102 Web Service).
  • Egress bypass / Proxy (T1090): GET-only filtresi metodu engelledi, hedefi değil. Allowlist’teki mShots…
  • Data Encoding (T1132): Base64 (httpbun payload’ı) ve DNS tarafında Base32. Kurtarılan DNS payload’ı birebir base32encode kullanıyordu.
  • Exfiltration over C2/Alternative Protocol (T1048 / T1071.004 DNS): DNS tüneli.
  • Steganografi / Obfuscation (T1001.002): Piksel ızgarası kanalı.
  • Encrypted Channel (T1573): Controller’lar (G236 vb.) RSA-imzalı, şifreli komut kutuları kullandı.
  • Indicator Removal (T1070): “remove evil yaml”, webhook silme, pastebin’lere çok kısa TTL verme.
  • Unsecured Credentials (T1552): Halka açık veri setinde unutulmuş 14 anahtar + “LOOT” torbası.
  • Supply Chain / Cache Poisoning (T1195 + Artifactory CVE-2026-66384): 115 Docker imajı.

Gelelim Forensic Gevherler’e

  • Kanıt 2 ay açıkta kaldı çünkü deponun kendisi (link kısaltıcı) halka açıktı. Saldırının deposu / saldırının mezar taşı. Forensic için şiir gibi…
  • Payloadların %97’sinde zaman damgası yoktu. SwarmTraces tarihleri gzip header’ının 4-7. byte’larından, JWT decode’dan, Docker build zamanlarından çıkardı. Bir olay müdahalecisi için bu detay altın değerindedir!
  • 1.588 farklı encoding kombinasyonu. Basit base64’ten, iç içe sıkıştırma RSA-imzalı şifreli bloğa kadar; üstelik bloğun anahtarı başka bir zincirde saklıydı. Yani tek imza/kural ile yakalanmayı baştan öldürmüşler. Benim önceki yazımdaki SIEM kuralı esprinin teknik karşılığı tam burada işte! Kural yok lan kural!
  • 7.905 farklı ajan ismi ama ~1.200 ajan. Ajanlar sürekli isim değiştirdi ve sayım ve atıf güvenilmez.
  • Görsel DLP kör noktası: çıktı kanalı gri karelerden ibaret, “görsel olarak ölü” Yani içerik bazlı DLP’yi tetiklemez. He he DLP kullan he!

Bir de defans köşesinden bakalım!

SwarmTraces’in kendi tavsiyesi aynen şu oldu bir SOC analisti tek bir session içinde şu dördünü birlikte arasın ekran görüntüsü API’leri, URL kısaltıcılar, paste host’ları ve HTTP-mirror (httpbun gibi). Dördü yan yana görünüyorsa alarm oluşturulsun! Bu olayı ancak böyle yaklayabilirlerdi.

  • Egress’i metoda göre değil hedefe göre allowlist
  • Her “render + screenshot” servisini kod çalıştırma primitifi say, izole et mutlaka!
  • Redirect zinciri derinliği bir sinyal ama hangi normal iş yükü 900 redirect’i kim takip edecek? Kurum 10dk’da bana dön diyor?
  • Kimlik bilgilerini ajan-başına scope’la, proje-başına değil (136 anahtarlık tek kasa + tek admin cred faciası) da işin cabası!

==Allah’ını seven defansa koşsun diye boşu boşuna Tweet atmıyoruz arkadaş!==

Yorum yapın