iTerm2 kullanıyorsanız, "cat readme.txt" bile güvenli değil
(blog.calif.io)- SSH integration, uzak kabukla iletişim kurmak için terminal escape sequence'lerini kullanır ve bu yapı nedeniyle sıradan terminal çıktısı da conductor protokolü gibi yorumlanabilir
- Temel sorun güvenin başarısız olmasıdır; gerçek bir uzak conductor yerine kötü amaçlı dosya, banner, MOTD veya sunucu yanıtı da sahte
DCS 2000pveOSC 135aracılığıyla conductor gibi davranabilir - Yalnızca
cat readme.txtkomutunu çalıştırmak bile sahte bir conductor transcript'i render edilirse iTerm2'ningetshell·pythonversion·run(...)akışını kendi kendine yürütmesine yol açar; saldırı çıktısının tek yapması gereken yanıt veriyormuş gibi görünmektir - Exploit, PTY'ye yazılan base64 komutların gerçek bir SSH conductor olmadığında yerel kabuğun düz metin girdisine dönüşmesiyle oluşan karışıklıktan yararlanır; son parça
ace/c+aliFIoyolu olarak yorumlandığında çalıştırma mümkün olur - Düzeltme 31 Mart tarihli
a9e745993c2e2cbb30b884a16617cd5495899f86commit'ine eklendi, ancak açıklama anı itibarıyla stable release'e dahil edilmemişti ve yama yaygınlaşmadan yapılan açıklama bir koruma boşluğu yarattı
iTerm2'nin SSH entegrasyonunun arka planı
- iTerm2 SSH integration, uzak oturumu daha zengin biçimde anlayabilmek için tasarlanmış bir özelliktir ve uzak kabuğa conductor adlı küçük bir yardımcı betik yüklenerek çalışır
it2sshile SSH entegrasyonu başlatılır- Mevcut SSH oturumu üzerinden conductor adlı uzak bootstrap betiği aktarılır
- Bu uzak betik iTerm2 protokolünün karşı tarafı olarak görev yapar
- iTerm2 ile uzak conductor, tipik bir ağ servisi gibi değil, terminal I/O üzerinde escape sequence alışverişi yaparak iletişim kurar
- login shell tespiti
- Python varlığını kontrol etme
- dizin değiştirme
- dosya yükleme
- komut çalıştırma
PTY nasıl çalışır
- Modern terminal emülatörleri, geçmişteki donanım terminallerinin yazılım sürümüdür ve ekran çıktısı, klavye girdisi ile terminal kontrol dizilerini yorumlamaktan sorumludur
- Kabuklar ve komut satırı programları hâlâ gerçek bir terminal gibi görünen bir aygıt beklediğinden, işletim sistemi PTY yapısını sağlar
- PTY, terminal emülatörü ile ön plandaki süreç arasında yer alan bir pseudoterminal'dir
- Tipik bir SSH oturumunda iTerm2 baytları PTY'ye yazar, ön plandaki süreç olan
sshbunları uzak makineye iletir ve uzak conductor bunları stdin'den okur - iTerm2 uzak conductor'a komut gönderdiğinde, yerelde sonuçta yaptığı şey PTY'ye bayt yazmaktır
conductor protokolü
- SSH entegrasyon protokolünün taşıma mekanizması olarak terminal escape sequence'leri kullanılır
- İki temel öğe vardır
DCS 2000p, SSH conductor'ı hook etmek için kullanılırOSC 135, pre-framer conductor mesajları için kullanılır
- Kaynak kod seviyesinde
DCS 2000p, iTerm2'nin bir conductor parser oluşturmasına neden olur; ardından parserOSC 135mesajlarını işlerbegin <id>- komut çıktı satırları
end <id> <status> runhook
- Normal bir uzak conductor, yalnızca terminal çıktısıyla iTerm2 ile iletişim kurabilir durumdadır
Temel zafiyet
- Zafiyetin özü güvenin başarısız olmasıdır; iTerm2, güvenilir bir conductor oturumu olmayan terminal çıktısını da SSH conductor protokolü olarak kabul eder
- Sonuç olarak güvenilmeyen terminal çıktısı uzak conductor kılığına girebilir
- kötü amaçlı dosya
- sunucu yanıtı
- banner
- MOTD
- Saldırı girdisi sahte bir
DCS 2000phook'u ve sahteOSC 135yanıtları üretebilir; bu durumda iTerm2 gerçek bir SSH integration alışverişi sürüyormuş gibi davranır
Exploit nasıl çalışıyor
- Exploit dosyası, sahte bir conductor transcript'i içerir
- Kullanıcı
cat readme.txtçalıştırdığında iTerm2 dosyayı render eder, ancak dosya basit metin değil, şu öğeleri içerir- sahte bir conductor oturumunu bildiren sahte bir
DCS 2000psatırı - iTerm2 isteklerine yanıt veren sahte
OSC 135mesajları
- sahte bir conductor oturumunu bildiren sahte bir
- Hook kabul edildiğinde iTerm2 normal conductor iş akışını başlatır; yukarı akış kaynak kodunda
Conductor.start()hemengetshell()gönderir ve başarılı olursapythonversion()yollar - Saldırının bu istekleri enjekte etmesi gerekmez; iTerm2 istekleri kendisi üretir, kötü amaçlı çıktının ise yalnızca yanıtları taklit etmesi yeterlidir
Durum makinesinin ilerleyişi
- Sahte
OSC 135mesajları asgari düzeydedir, ancak doğru sırada düzenlenmiştirgetshelliçin komut gövdesini başlatma- kabuk tespit çıktısı gibi görünen satırlar döndürme
- ilgili komutu başarıyla sonlandırma
pythonversioniçin komut gövdesini başlatma- ilgili komutu başarısızlıkla sonlandırma
unhook
- Yalnızca bu akış bile iTerm2'nin normal fallback yoluna girmesine neden olur; ardından SSH integration iş akışının yeterince tamamlandığı varsayılır ve sonraki adıma geçilir
- Sonraki adım,
run(...)komutunu oluşturup göndermektir
sshargs'ın rolü
- Sahte
DCS 2000phook'u birden çok alan içerir ve bunlardan biri saldırganın kontrol ettiğisshargsdeğeridir - Bu değer daha sonra iTerm2 conductor için
run ...isteğini oluştururken komut malzemesi olarak kullanılır - Exploit, iTerm2'nin şu veriyi base64 kodlaması için
run <padding><magic-bytes>
sshargs, son 128 baytlık parçanınace/c+aliFIoolması sağlanacak şekilde seçilir- Bu dizge rastgele değildir; aynı anda şu iki koşulu karşılayacak şekilde seçilmiştir
- conductor kodlama yolunun geçerli bir çıktısı olması
- geçerli bir göreli yol adı olması
Exploit'i mümkün kılan PTY karışıklığı
- Normal bir SSH integration oturumunda iTerm2, base64 kodlanmış conductor komutlarını PTY'ye yazar ve
sshbunları uzak conductor'a iletir - Exploit senaryosunda da iTerm2 aynı şekilde komutları PTY'ye yazar, ancak gerçek bir SSH conductor olmadığı için yerel kabuk bunları düz metin girdi olarak alır
- Kaydedilmiş oturumda şu biçim gözlemlenir
getshell, base64 biçiminde görünürpythonversion, base64 biçiminde görünür- ardından uzun, base64 kodlanmış bir
run ...payload'u gelir - son parça
ace/c+aliFIoolur
- Önceki parçalar anlamsız komutlar olarak başarısız olur; son parça ise bu yol yerelde mevcut ve çalıştırılabilirse devreye girer
Yeniden üretim adımları
- Orijinal dosya tabanlı PoC,
genpoc.pyile yeniden üretilebilirpython3 genpoc.pyunzip poc.zipcat readme.txt
- Bu adımlar sonunda şu iki dosya oluşur
ace/c+aliFIoadlı çalıştırılabilir bir yardımcı betik- kötü amaçlı
DCS 2000pveOSC 135dizilerini içerenreadme.txt
- İlk dosya iTerm2'yi sahte conductor ile iletişim kurmaya yönlendirir; ikinci dosya ise son parça ulaştığında kabuğun gerçekten çalıştıracağı hedefi sağlar
- Exploit'in başarılı olması için
cat readme.txtkomutununace/c+aliFIodosyasının bulunduğu dizinde çalıştırılması gerekir; ancak bu sayede son saldırgan kontrollü parça gerçek bir çalıştırılabilir yol olarak yorumlanabilir
Açıklama ve yama takvimi
- 30 Mart'ta hata iTerm2'ye bildirildi
- 31 Mart'ta düzeltme
a9e745993c2e2cbb30b884a16617cd5495899f86commit'inde tamamlandı - Yazım anı itibarıyla düzeltme henüz stable release'e dahil edilmemişti
- Yama commit'i yayımlandıktan sonra, yalnızca yamaya dayanarak exploit'i sıfırdan yeniden kurma denemesi yapıldı
- bu sürecin prompt'ları
prompts.mdiçinde - sonuç
genpoc2.py genpoc.pyile çok benzer şekilde çalışır
- bu sürecin prompt'ları
Açıklama zamanlamasına yönelik eleştiri
- Düzeltme stable release'e ulaşmadan yapılan açıklama, kullanıcıların büyük çoğunluğunun fiilen korunmasının zor olduğu bir durumda zafiyetin duyurulmasına yol açtı
- Böyle bir açıklama zamanlaması için açık bir gerekçe gerekir
- İki hafta, anlamlı bir yaygınlaştırma beklemek için de kısa; erken açıklamayı savunup müdahaleyi zorunlu kılmak için de kısa bir süredir
- Sonuçta zafiyet geniş ölçüde bilinir hale gelirken, düzeltme pratikte ona ihtiyaç duyan kullanıcılara henüz ulaşmamış bir açıklama boşluğu dönemi oluştu
- Daha iyi bir seçenek, düzeltmenin gerçekten kullanıcıların eline ulaşmasını beklemek ya da neden erken açıklamanın gerekli olduğunu net biçimde ortaya koymaktı; ancak ikisi de sağlanmadı
1 yorum
Hacker News yorumları
Kararlı sürüm için yama henüz çıkmamışken bunun neden şimdi açıklandığını merak ettim. Upstream’e bildirilmesinin üzerinden yalnızca 18 gün geçmiş ve blog yazısı, yayımlanan commit’ten çok daha ayrıntılı olduğu için gerçek dünyada istismar olasılığını artırıyor gibi geldi. Yazarın, yalnızca upstream commit’e bakıp LLM kullanarak exploit üretebildiğini doğruladıktan sonra bile, bu yazının zafiyetin görünürlüğünü daha da artırdığını düşünüyorum
Bu çalışma etkileyici ama çok da şaşırtıcı değildi. Özellik açısından zengin terminal uygulamalarında tekrar tekrar görülen bir sorundu ve son 15 yılda benzer zafiyetler defalarca açıklandı. less ya da vim gibi araçlar da istisna değildi; bu tür sorunların önemli bir kısmı bellek güvenliğinden çok mantık hatasına daha yakın, yani Rust ile yeniden yazmak da bunları otomatik olarak çözmez. Bir yandan işletim sistemi düzeyindeki araçların sade ve öngörülebilir olmasını istiyoruz, ama öte yandan güzel renkler, animasyonlar ve bitmeyen özelleştirme de talep ediyoruz; burada bir gerilim var. Şimdi buna AI agent’lar da eklenince, kötü niyetli bir metin dosyasının sadece "önceki talimatları yok say" gibi bir ifade içermesinin yettiği bir döneme gelmiş olduk
PDP-10 döneminden bir hikâye aklıma geldi. Bir iş arkadaşı, backspace’e sürekli basıldığında terminal işleyicisinin tamponun baş tarafındaki karakterleri bile sildiğini keşfetmişti; sonra da bir satırın tamamını silen bir escape karakteri kullanınca işletim sistemi çöküyordu
6 yıl önce de neredeyse aynı iTerm2 güvenlik sorunu yaşanmıştı
Ben iTerm2’nin yazarıyım. Bu sorun bir exploit zincirinin halkalarından biri olarak kullanılabilir ama başlıktaki gibi tek başına çok büyük bir riskmiş gibi sunulmasını abartılı buluyorum. Şu an aile tatilindeyim; döndüğümde düzeltilmiş sürümü yayımlayacağım
bootstrap script’ler, uzak conductor agent’lar, escape sequence’ler gibi unsurları kullanan karmaşık sistemlerde ince hataların çıkması şaşırtıcı değil. Bileşenler aslında amaçlanmayan biçimlerde bir araya getirildiğinde bu tür sorunlar kolay doğuyor. Metin dosyası ya da sunucu banner’ı gibi ekrana yazdırılan güvenilmeyen çıktı içinde özel kodlar varsa ve sistem bunları kaynağını doğrulamadan işliyorsa, yapı kabaca böyle görünüyor
Bu bana daha önce duyduğum bir hikâye gibi geldi. iTerm2’nin SSH integration özelliği daha önce de bir CVE’ye neden olmuştu; CVE-2025-22275 de akla geliyor. Daha önce örnekler vardı ve bu başlıkta anılan eski sorun da tmux integration tarafındaydı. Bu tür entegrasyon özelliklerini biraz daha az agresif eklemek daha iyi olmaz mı diye düşünüyorum
Başlık fazla sansasyonel. Sorun
catdeğil, iTerm’in SSH integration özelliği; ayrıca veri akışından ayrılmamış bir kontrol kanalı yapısı da riskli görünüyor. Bu özelliği kullanmayıp normal SSH kullanırsanız büyük ölçüde sorun yaşamazsınız diye düşünüyorumEski terminal emülatörleri escape code ile klavye yeniden eşlemeye kadar izin veriyordu. Bu yüzden güvenilmeyen dosyaları
catile göstermemek, onun yerinelessgibi araçlarla açmak neredeyse genel kabul görmüş bir kuraldıYazının ifadeleri tam doğru değil. İkinci paragraf, "iTerm2 kullanıyorsan güvenli değilsin" gibi okunuyor; oysa daha doğrusu, isteğe bağlı Shell Integration özelliğini kullanırken sorun çıkabileceği söylenebilir. Bu özellik varsayılan olarak kapalıysa etki alanının sınırlı olduğunu anlıyorum. Yanlışsam düzeltilmek isterim