CUPS üzerinden UNIX sistemlerine saldırı
(evilsocket.net)- CUPS’un yazıcıyı otomatik keşfetme yolu, IPP öznitelik doğrulamasının olmamasıyla birleştiğinde uzak ve kimliği doğrulanmamış bir saldırganın kötü amaçlı yazıcı yapılandırması enjekte etmesine ve yazdırma sırasında keyfi komut çalıştırmaya kadar giden bir akışı tetiklemesine yol açabiliyor
- Saldırının başlangıç noktası,
cups-browsedbileşeninin UDP 631 portunda herhangi bir kaynaktan gelen paketi kabul edip saldırganın URL’sineGet-Printer-AttributesIPP isteği göndermesi - Zafiyetler CVE-2024-47176, CVE-2024-47076, CVE-2024-47175, CVE-2024-47177 olarak ayrılıyor ve
libcupsfilters,libppd,cups-filtersiçindeki PPD oluşturma ilefoomatic-ripçalıştırma akışına kadar uzanıyor - Etki alanı çoğu GNU/Linux dağıtımı, bazı BSD sürümleri, Oracle Solaris ve olası Chromium/ChromeOS etkisini kapsıyor; herkese açık IPv4 taramalarında yüz binlerce cihazdan callback ve aynı anda en fazla 200 bin ila 300 bin istemci gözlemlendi
- Pratikte gerekmeyen
cups-browsedservisini devre dışı bırakmak veya kaldırmak ve CUPS paketlerini güncellemek gerekiyor; güncelleme zorsa UDP 631 ve gerekirse DNS-SD trafiğinin engellenmesi değerlendirilmeli
Zafiyet zincirinin özü
- Bu zincir, CUPS’un yazıcıyı otomatik keşfetme özelliğiyle başlayıp IPP öznitelik işleme, PPD dosyası oluşturma ve filtre çalıştırmaya kadar uzanıyor
- Başlıca zafiyetler dört aşamada birbirine bağlanıyor
- CVE-2024-47176:
cups-browsed2.0.1 ve altı sürümlerUDP INADDR_ANY:631adresine bağlanıyor, herhangi bir kaynaktan gelen paketlere güveniyor ve saldırgan kontrolündeki URL’yeGet-Printer-AttributesIPP isteğini tetikliyor - CVE-2024-47076:
libcupsfilters2.1b1 ve altındakicfGetPrinterAttributes5, IPP sunucusundan gelen öznitelikleri doğrulamadan veya temizlemeden CUPS sistemine iletiyor - CVE-2024-47175:
libppd2.1b1 ve altındakippdCreatePPDFromIPP2, IPP özniteliklerini doğrulamadan ve temizlemeden geçici PPD dosyasına yazarak saldırgan kontrollü veri eklenmesine izin veriyor - CVE-2024-47177:
cups-filters2.0.1 ve altındakifoomatic-rip, PPD içindekiFoomaticRIPCommandLineparametresi üzerinden keyfi komut çalıştırılmasına izin veriyor
- CVE-2024-47176:
Saldırı giriş noktası ve etki kapsamı
- Uzak ve kimliği doğrulanmamış bir saldırgan, mevcut bir yazıcının IPP URL’sini sessizce kötü amaçlı bir URL ile değiştirebilir veya yeni bir yazıcının kurulmasını sağlayabilir
- Gerçek komut çalıştırma, ilgili bilgisayarda yazdırma işi başlatıldığında gerçekleşiyor
- Giriş noktası iki farklı biçimde ortaya çıkıyor
- WAN / açık internet: Uzak saldırgan
UDP 631portuna paket gönderiyor ve kimlik doğrulama gerekmiyor - LAN: Yerel saldırgan zeroconf, mDNS, DNS-SD duyurularını spoof ederek aynı kod yolundan RCE’ye ulaşabiliyor
- WAN / açık internet: Uzak saldırgan
- CUPS ve
cups-browsed, çeşitli UNIX türevi sistemlerde paketlenmiş durumda- çoğu GNU/Linux dağıtımı
- bazı BSD sistemleri
- Google Chromium / ChromeOS olasılığı
- Oracle Solaris
- Açık internet üzerindeki tüm IPv4 aralığı, birkaç hafta boyunca günde birkaç kez tarandığında UDP paket gönderiminin ardından yüz binlerce cihazın callback yaptığı ve eşzamanlı 200 bin ila 300 bin istemci tepesinin görüldüğü bildirildi
cups-browsed tarafından açılan yol
- Ubuntu dizüstünde
netstat -anuçalıştırılırken0.0.0.0:631üzerinde dinleyen bir UDP portu bulundu lsof -i :631çıktısına göre TCP 631’icupsd, UDP 631’i isecups-browsedkullanıyordups auxçıktısı,cups-browsedsürecinin root olarak çalıştığını gösterdicups-browsed, CUPS sisteminin bir parçası olarak yeni yazıcıları keşfedip otomatik olarak sisteme eklemekle görevli- Kaynak kod incelemesinde servisin
INADDR_ANY:631 UDPadresine bağlandığı veHEX_NUMBER HEX_NUMBER TEXT_DATAbiçimindeki UDP paketlerini beklediği görüldü - Varsayılan yapılandırma dosyasındaki seçeneklerin çoğu yorum satırı halinde bırakıldığında erişim kısıtlamaları fiilen zayıflıyor
Ayrıştırma sorunları ve ek hatalar
- CUPS paketinin kendisi oss-fuzz kapsamında yer alsa da,
cups-browsediçin fuzzing kapsamı olmadığı görülüyor process_browse_dataçevresinde AFL tabanlı bir fuzzing hedefi oluşturulduğunda 5 girdi stack-buffer-overflow tetikledi- Neden olarak, iki döngüde sonlandırma koşulu kontrol edilmeden önce işaretçi başvurusunun yapılması gösteriliyor
- Daha sonra kilitleme işlemlerinin geçtiği noktada race condition ve olası bir DoS da bulundu
- Bu sorunlar geliştiricilere ve CERT’e bildirilmiş olsa da, araştırmacıya göre henüz kabul edilmemiş veya yamalanmamış durumdaydı
IPP istekleri ve PPD enjeksiyonu
found_cups_printer, UDP paketinden ayrıştırılan metin alanlarından birini URL olarak ele alıyor- Bu URL ve ilişkili veriler,
examine_discovered_printer_recordvecreate_remote_printer_entryakışı üzerindenlibcupsfiltersiçindekicfGetPrinterAttributesçağrısına gidiyor - Saldırgan
0 3 http://<ATTACKER-IP>:<PORT>/printers/whateverbiçiminde bir paket gönderdiğinde hedeftekicups-browsed, saldırganın URL’sine bağlanıyor - Bağlantı sırasında User-Agent başlığı çekirdek sürümünü ve mimariyi içeriyordu; bazı isteklerde hedef kullanıcı adı da görüldü
- Internet Printing Protocol, istemci ile yazıcı veya yazdırma sunucusu arasındaki iletişim protokolüdür ve yazıcı durumu sorgulama ya da yazdırma işi gönderme gibi amaçlarla kullanılır
- Hedef sistem, saldırganın sunucusunu bir yazıcı olarak algılıyor ve HTTP içine kapsüllenmiş
Get-Printer-Attributesisteği gönderiyor - ippserver python package kullanılarak kontrol edilebilir özniteliklerle yanıt verildiğinde, sahte yazıcı kullanıcıya bildirim gösterilmeden yerel yazıcılara eklendi
PPD ve foomatic-rip çalıştırma yolu
- Debug günlükleri, yazıcı kuyruğu oluşturma, geçici PPD dosyası oluşturma, PPD kullanımı ve düzenleme sürecini gösteriyor
create_queueişlevi, IPP özniteliklerinilibppdiçindekippdCreatePPDFromIPP2API’sine iletiyorppdCreatePPDFromIPP2,printer-make-and-modelgibi saldırgan kontrollü metin özniteliklerini doğrulama veya escape etme olmadan PPD dosyasına yazıyor- PostScript Printer Description dosyası, yazıcının işlev ve yeteneklerini açıklayan bir metin dosyasıdır; CUPS içinde yazıcının özellikleri ve nasıl kullanılacağı bununla belirlenir
- PPD içindeki çeşitli yönergelerden CUPS uzantısı
cupsFilter2, yazdırma işi sırasında/usr/lib/cups/filteraltındaki yürütülebilir dosyaların filtre olarak çalıştırılmasına izin verebilir foomatic-rip, PPD içindekiFoomaticRIPCommandLineyönergesi üzerinden komut çalıştırabilen bir filtre olarak ele alınıyor- Geçmişte
foomatic-filtersiçin CVE-2011-2964 ve CVE-2011-2697 ile ilişkili düzeltmeler yapılmıştı, ancak bunların CUPS entegrasyonu sırasında taşınmadığı doğrulandı - Daha yeni tarihli CVE-2024-35235 kaydında da
FoomaticRIPCommandLineüzerinden keyfi komut çalıştırmadan söz ediliyor - CUPS geliştiricilerine göre
FoomaticRIPCommandLineiçine konabilecek içerikleri sınırlandırmak, mevcut sürücüleri bozmadan çözülmesi çok zor bir konu; ayrıca 2010 öncesi yüzlerce eski yazıcı modeli yalnızca Foomatic’e bağımlı olabilir
RCE yeniden üretim akışı
- RCE zinciri üç aşamadan oluşuyor
- Hedef sistemin saldırganın kötü amaçlı IPP sunucusuna bağlanmasını sağlamak
- Saldırgan kontrollü IPP öznitelik dizelerini döndürerek geçici PPD dosyasına yönergeler enjekte etmek
- Yazdırma işi sahte yazıcıya gönderildiğinde PPD yönergelerinin ve komutların çalıştırılması
- IPP sunucusu yapılandırmasında PPD dizesi kapatılıp yeni satır enjekte edildikten sonra
FoomaticRIPCommandLinevecupsFilter2yönergeleri eklenerek komut çalıştırma düzeni kuruluyor - Demo hedefi tamamen yamalanmış
Ubuntu 24.04.1 LTSvecups-browsed 2.0.1idi; saldırgan makinede komut çalıştırma başarıldı - Bu akış,
cups-browsed,libcupsfilters,libppd,cups-filtersiçindeki birden çok işleme aşamasının birlikte zincirlenmesiyle mümkün oluyor
Azaltma ve öneriler
cups-browsedgerekli değilse servisin devre dışı bırakılması ve kaldırılması öneriliyor- Sistemdeki CUPS paketleri güncellenmeli
- Güncelleme mümkün değilse ve ilgili servis gerekiyorsa
UDP 631trafiği engellenmeli - Duruma göre DNS-SD trafiği de engellenebilir, ancak zeroconf kullanılan ortamlarda bunu uygulamak zor olabilir
- Araştırmacı kişisel öneri olarak kendi sistemlerinden CUPS servislerini, binary’lerini ve kütüphanelerini kaldıracağını ve UNIX sistemler üzerinden yazdırma yapmayacağını belirtiyor
- Buna ek olarak zeroconf, Avahi ve Bonjour dinleyicilerini de kaldıracağını söylüyor
Açıklama süreci ve devam çalışmaları
- Araştırmanın kendisi birkaç gün sürse de, 5 Eylül’de OpenPrinting
cups-browseddeposunda güvenlik duyurusu açılıp sorumlu açıklama süreci başlatıldıktan sonra kamuya açıklanması 22 gün aldı - İlgili tartışmalar,
cups-browsed,libcupsfilters,libppd,cups-filtersiçin güvenlik duyurularına dönüştü - Araştırma 2 gün sürdü, çalışan exploit 249 satır tuttu; açıklama sürecindeyse tartışmalar, e-postalar, mesajlar ve 100 sayfayı aşan metin üretildi
- 9.9 CVSS puanı tartışması hakkında, başlangıçtaki 9.9 puanın VINCE raporunda bir RedHat mühendisi tarafından tahmin edilip başka bir mühendis tarafından gözden geçirildiği belirtildi
- Araştırmacı, RCE’nin kolay istismar edilebilir olması ve etkilenen paketlerin çok yaygın bulunması nedeniyle ilk 9.9 puanın verildiğini düşünüyor, ancak etki açısından kendisi bunun 9.9 olarak sınıflandırılmayacağını ekliyor
- Yalnızca CERT VINCE ile paylaşılan ayrıntılı Markdown raporunun ve exploit’in sızdırıldığı ifade edildi
- İlk
exploit.py, yalnızca UDP paket gönderiyor ve kötü amaçlı IPP sunucusu oluşturuyordu; daha sonra zeroconf duyuru özelliği eklenerek araçlaştırıldı - Sonrasında Go ile yeniden yazılıp bettercap içine entegre edildi; LAN üzerinde zeroconf, Bonjour ve Avahi ile duyurulan servisleri şeffaf biçimde taklit etme ve IPP ile ilgili işlemler ekleme yetenekleri kazandı
- Bir sonraki yazıda, henüz yayımlanmamış bir bettercap modülüyle Apple macOS’a saldırı konusu ele alınacak; ancak takvim başka açıklama süreçleri nedeniyle belirsiz
1 yorum
Hacker News yorumları
Bunun şaka olduğunu sandım. Söylediği şey şu: “Kimliği doğrulanmamış uzak bir saldırgan, mevcut bir yazıcının IPP URL’sini kötü amaçlı bir URL ile değiştirebilir ya da yeni bir tane kurabilir; o bilgisayarda bir yazdırma işi başlatıldığında da keyfi komut çalıştırabilir.” Heartbleed 7.5 iken bunun 9.9 olması pek mümkün görünmüyor.
İlk tweet “tüm GNU/Linux sistemleri vb. için kimlik doğrulamasız uzaktan kod çalıştırma” diyordu; ama gerçekte birçok dağıtımda CUPS yalnızca loopback’e bağlanıyor ya da hiç kurulu olmuyor.
Ayrıca herkese açık IPv4 adres alanının tamamını haftalar boyunca günde birkaç kez tarayıp yüz binlerce cihazdan callback aldığını söylüyor. Doğru anladıysam bu, tüm herkese açık IPv4’te açık CUPS instance’larının yaklaşık 300 bin olduğu anlamına geliyor; uzaktan kod çalıştırmanın gerçekleşmesi için de ilgili CUPS sunucusunun bir yazdırma işi alması gerekiyor, ki çoğu için bunun olmayacağını düşünüyorum.
cups-browseddaemon’ının tamamen ortadan kalkması ve Linux ekosisteminin CUPS’ın geleceğini ciddi biçimde tartışması gerektiği sonucuna yakın.Hatalar şaşırtıcı derecede basit görünüyor ve sonuçta oldukça ciddi bir güvenlik sorunu; ancak varsayılan kurulumla gelen bir masaüstü Linux paketinin upstream yanıtından beklenebilecek düzeyde değil.
Yine de dünyayı durduracak türden bir CVSS 9.9 paniği kesinlikle değil.
Daha doğrusu yapı şöyle: Saldırganın değiştirdiği yazıcı ayarları, kullanıcı bir sonraki sefer kendi yazıcısına yazdırdığında gecikmeli olarak çalışıyor; açık cupsd’de değil, cupsd-browser tarafında.
Yazarın tavrıyla ilgili sorunlar olabilir, ama bu güvenlik açığının kendisi gerçekten büyük bir mesele.
CUPS’ı internete açan biri, CVE’lerin yetişemeyeceği düzeyde hiçbir şeyi umursamıyor demektir.
Elbette tetiklemek için kullanıcının bir şey yazdırması gerekiyor ve kişisel olarak Linux’ta hiç bir şey yazdırdığımı sanmıyorum; ama yüz binlerce Linux makinesinden callback aldıkları iddiası makul geliyor.
En azından bir Linux dizüstünün havaalanı Wi‑Fi’ı gibi yerlerde diğer tüm cihazlara karşı ciddi biçimde savunmasız hale gelmemesi gerektiğini düşünüyorum.
CVSSv3’te Scope metriğini nasıl yorumladığınıza bağlı olarak daha doğrusu 8.8 veya 9.6 gibi görünüyor.
Özetle, bazı masaüstü Linux varyantlarında LAN’a açık CUPS 0.0.0.0 üzerinde ayağa kalkıyor, root olarak çalışıyor ve kimlik doğrulamasız uzaktan kod çalıştırmaya açık. Ubuntu Server veya CentOS gibi sunucu odaklı çoğu Linux’ta varsayılan servis değil; ancak masaüstü Linux’ların çoğunda varsayılan olarak başlıyor gibi görünüyor.
Uzaktan kod çalıştırmayı tetiklemek için savunmasız Linux makinesinin kullanıcısının sömürüden sonra bir belge yazdırması gerekiyor.
evilsocket yüz binlerce callback aldığını söyledi; çoğumuz Linux’ta neredeyse hiç yazdırma yapmıyor olsak bile bu ölçekte bir etki büyük bir botnet kurmak için yeterli olabilir.
cupsd’yi internete açık tuttuğum için haberi duyunca biraz paniğe kapıldım; ama buradaki başlık gibi bu konuda da yanlış aktarılan şeyler var. Sorun çekirdek cupsd değil, ayrı bir paket/bileşen olan cups-browsed.
Sunucu için kullandığım Gentoo Linux, cups-browsed’ı ayrı bir paket olarak sunuyor ve ben kurmadığım için etkilenmiyorum. Bu ek paketi kurmamış çoğu CUPS kullanıcısı da bu hatadan etkilenmiyor.
CUPS çalıştıran her sistemin hack’lenebileceğini söylemek ölçeği yanlış ifade etmek olur.
Evde sadece servisi kapattım; ama giderek daha fazla yazılımın kapsamı aşarak isteğe bağlı olması gereken bileşenleri zorunluymuş gibi göstermesi epey can sıkıcı.
Benzer bir örnek avahi-daemon. Masaüstü Debian/Ubuntu’da kaldırmayı denerseniz, avahi’nin neden güçlü bir bağımlılık olması gerektiği anlaşılmayan başka yazılımların da birlikte kaldırılması olası.
“Sizin gibi güvenlik araştırmacılarının ‘dinlenmeye değer olduklarını kanıtlaması gerekir’ gibi davranan triager’lar yüzünden araştırmacılardan çok fazla şey bekleniyor ve bu kanıksanıyor” kısmını anlıyorum, ama ne yazık ki ortada bir gerçek de var.
Böyle iyi araştırılmış her bir rapora karşılık, bug bounty ödülü koparmaya ya da CVE keşfini özgeçmişine yazmaya çalışan 57 tane düşük kaliteli spam rapor geliyor. Özellikle LLM’lerin artmasıyla bu tür spam’ler kolayca kandırıcı olabiliyor.
Üzücü bir durum, ama geliştiricilerin şüpheci davranmasını tamamen suçlamak zor.
0: https://daniel.haxx.se/blog/2024/01/02/the-i-in-llm-stands-f...
Özetle, cups-browsed 631 numaralı UDP portunu dinliyor ve kullanıcı onayı olmadan yazıcıları otomatik olarak kurabiliyor.
Saldırgan bu “özelliği” kullanarak, herhangi bir host’tan indirilebilen özel bir sürücünün bağlı olduğu sahte bir yazıcıyı kullanıcı onayı olmadan kuruyor ve bir yazdırma işi gönderildiğinde çalıştırılacak komutu belirliyor.
Kullanıcı o sahte yazıcıyla bir şey yazdırırsa ilgili komut çalıştırılıyor.
Bu olayda dağıtımlar cups-browsed’ı bir özellik olarak dahil etmiş gibi görünüyor, ama Ubuntu/Debian’ın ve muhtemelen tüm deb tabanlı dağıtımların kurulum sırasında neredeyse tüm servisleri otomatik olarak ayağa kaldırmasını her zaman kötü buluyorum.
Bu, yalnızca bir paket kurmuş olsanız bile bağımlılık olarak kurulan başka bir ağ servisinin yanlışlıkla açılabileceği anlamına geliyor.
exim4’ü zaten biliyorsunuzdur; adil olmak gerekirse varsayılanı yalnızca localhost’u dinlemek olduğu için büyük bir sorun olmayabilir. Az önce bir Debian makinesine cups-browsed kurdum; 0.0.0.0 üzerinde dinleyen iki servis (cups-browsed ve avahi) ayağa kalktı.
Arch/Gentoo ve CentOS ailesi dağıtımlarda böyle değil.
Twitter’da paylaşılan ilk CVSS puanında kullanıcı etkileşimi gerekmediği yazıyordu. Ama sayfadaki uzaktan kod çalıştırma zincirini okuyunca “PPD yönergesinin ve buna bağlı komutun çalıştırılması için sahte yazıcıya bir yazdırma işi gönderilmesini bekler” deniyor.
Alice yazdır düğmesine basmazsa yazdırma işi tetiklenmeyecek gibi görünüyor; acaba neyi kaçırıyorum diye merak ediyorum. evilsocket’ten şüphelendiğim için değil, kendi anlayışımı doğrulamak için soruyorum.
MacOS’ta ne zaman bir şey yazdırmam gerekse yazıcılardan ve yazıcıyla ilgili yazılımlardan ne kadar nefret ettiğimi yeniden hatırlıyorum. 40 yıldır bilgisayarlarla uğraşıyorum ve gerçekten de her 10 yılda bir yazıcılar daha büyük bir baş belası oluyor.
pdf2ps - | nc 9001