1 puan yazan GN⁺ 2024-09-27 | 1 yorum | WhatsApp'ta paylaş
  • 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-browsed bileşeninin UDP 631 portunda herhangi bir kaynaktan gelen paketi kabul edip saldırganın URL’sine Get-Printer-Attributes IPP 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-filters içindeki PPD oluşturma ile foomatic-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-browsed servisini 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-browsed 2.0.1 ve altı sürümler UDP INADDR_ANY:631 adresine bağlanıyor, herhangi bir kaynaktan gelen paketlere güveniyor ve saldırgan kontrolündeki URL’ye Get-Printer-Attributes IPP isteğini tetikliyor
    • CVE-2024-47076: libcupsfilters 2.1b1 ve altındaki cfGetPrinterAttributes5, IPP sunucusundan gelen öznitelikleri doğrulamadan veya temizlemeden CUPS sistemine iletiyor
    • CVE-2024-47175: libppd 2.1b1 ve altındaki ppdCreatePPDFromIPP2, IPP özniteliklerini doğrulamadan ve temizlemeden geçici PPD dosyasına yazarak saldırgan kontrollü veri eklenmesine izin veriyor
    • CVE-2024-47177: cups-filters 2.0.1 ve altındaki foomatic-rip, PPD içindeki FoomaticRIPCommandLine parametresi üzerinden keyfi komut çalıştırılmasına izin veriyor

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 631 portuna 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
  • CUPS ve cups-browsed, çeşitli UNIX türevi sistemlerde paketlenmiş durumda
  • 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ırken 0.0.0.0:631 üzerinde dinleyen bir UDP portu bulundu
  • lsof -i :631 çıktısına göre TCP 631’i cupsd, UDP 631’i ise cups-browsed kullanıyordu
  • ps aux çıktısı, cups-browsed sürecinin root olarak çalıştığını gösterdi
  • cups-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 UDP adresine bağlandığı ve HEX_NUMBER HEX_NUMBER TEXT_DATA biç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-browsed iç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_record ve create_remote_printer_entry akışı üzerinden libcupsfilters içindeki cfGetPrinterAttributes çağrısına gidiyor
  • Saldırgan 0 3 http://<ATTACKER-IP>:<PORT>/printers/whatever biçiminde bir paket gönderdiğinde hedefteki cups-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-Attributes isteğ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_queue işlevi, IPP özniteliklerini libppd içindeki ppdCreatePPDFromIPP2 API’sine iletiyor
  • ppdCreatePPDFromIPP2, printer-make-and-model gibi 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/filter altındaki yürütülebilir dosyaların filtre olarak çalıştırılmasına izin verebilir
  • foomatic-rip, PPD içindeki FoomaticRIPCommandLine yönergesi üzerinden komut çalıştırabilen bir filtre olarak ele alınıyor
  • Geçmişte foomatic-filters iç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 FoomaticRIPCommandLine iç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 FoomaticRIPCommandLine ve cupsFilter2 yönergeleri eklenerek komut çalıştırma düzeni kuruluyor
  • Demo hedefi tamamen yamalanmış Ubuntu 24.04.1 LTS ve cups-browsed 2.0.1 idi; saldırgan makinede komut çalıştırma başarıldı
  • Bu akış, cups-browsed, libcupsfilters, libppd, cups-filters içindeki birden çok işleme aşamasının birlikte zincirlenmesiyle mümkün oluyor

Azaltma ve öneriler

  • cups-browsed gerekli 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 631 trafiğ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-browsed deposunda 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-filters iç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

 
GN⁺ 2024-09-27
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.

    • Yazıyı okuyunca bunun oldukça kötü olduğu doğru, ama daha çok cups-browsed daemon’ı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.
    • Adil olmak gerekirse yazar da “etki açısından bakarsak bunu 9.9 olarak sınıflandırmazdım; ama nihayetinde ben ne bilirim ki” demişti.
    • Kullanıcı etkileşimi olmadan sömürülebilen bir buffer overflow da var. Yazdırma işi gerektiren foomatic yolu, taraması ve sömürmesi en kolay yollardan yalnızca biriydi.
    • “Look at me, I'm the printer now” meme’ine bayağı güldüm. Ciddiyet değerlendirmesinden bağımsız olarak en azından iyi bir şaka çıkmış.
    • Heartbleed bir bellek sızıntısıydı; bu ise kullanıcı etkileşimi gerektirmeyen tam uzaktan kod çalıştırma. Uzaktan kod çalıştırma doğal olarak tam bilgi sızıntısı ve daha fazlası demek.
      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.

    • Sorunlu savunmasız servisin 0.0.0.0 üzerinde dinliyor gibi görünmesi endişe verici. Bu, varsayılan olarak LAN’da saldırıya açık olduğu; sunucu internete açıksa 631 portunun özellikle engellenmesi gerektiği anlamına geliyor.
      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.
    • Bu durumda “CUPS’ı internete açmak”, “internete bağlı bir Linux masaüstü çalıştırmak” anlamına geliyor gibi. Ben yapmazdım, ama delilik de sayılmaz; varsayılan Debian masaüstü kurulumunun güvenlik duvarı olmadan da yeterince güvenli olmasını beklersiniz.
      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.
    • Kafeye gidip halka açık Wi‑Fi kullanan biri CUPS’ı açığa çıkarmış sayılır ve sömürülebilir. Bunu basitçe geçiştirmek kimseye yardımcı olmaz.
    • Saçma biçimde CUPS, güçlü biçimde sandbox’lanmış bir kullanıcı programı olarak değil, sistem daemon’ı olarak çalışıyor.
    • Yine de lateral movement ve yetki yükseltme için tam bir zafer.
  • 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.

    • Üniversitelerde genel IP’ye sahip Linux masaüstü kullanan ve ister makale olsun ister kendi yazıları ya da başkalarının yazıları olsun sürekli çıktı alan çok kişi var.
    • Linux masaüstü pazar payı, ChromeOS hariç tutulsa bile kabaca %4.5. Çoğumuz yazdırma yapmasak da Linux host’lardan çıkan yazdırma işleri hâlâ epey fazladır.
    • Heartbleed 7.5’ti ve xz olayından yalnızca 0.4 daha düşüktü; bunun nasıl 9.6 olabildiğini anlamıyorum.
  • 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.

    • Debian muhafazakâr sayılır ama cups kurulduğunda genelde cups-browsed’ın varsayılan olarak beraber gelmesi hep hoşuma gitmemiştir. “no install recommends” ile çözülebiliyor gibi, ama hatırladığım kadarıyla hplip gibi ek sürücüler onu tekrar beraberinde getirebiliyor.
      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.

  • Ö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.

    • CUPS 1999’da tanıtıldığına göre, o dönemde kullanıcı onayı olmadan otomatik kurulum mantıklı gelmiş olabilir. Ama bunun bugün hâlâ neden kaldığını bilmiyorum.
  • 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.

    • Fuzzer ile bulunan bir buffer overflow da var ve bu, kullanıcı etkileşimi olmadan uzaktan kod çalıştırmaya yol açabilir. Ancak yazarın bu alandaki uzmanlığı yeterli olmadığı için gerçek bir exploit hazırlayamamış.
    • “Etkileşim” tanımına bağlı. Benim anladığım kadarıyla Alice’in saldırganın sağladığı belgeyi yazdırması gerekmiyor; sadece herhangi bir şey yazdırması yeterli.
  • 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.

    • FSF hareketinin büyük ölçüde Stallman’ın yazıcı sürücüsü kalitesine sinirlenmesiyle başlamış olması ilginç. Ama bu hareket, 40 yıl boyunca nedense yazıcıyla ilgili yazılım kalitesini gözle görülür biçimde iyileştiremedi.
    • 10 yıldan uzun süre yazıcı kodu yazdım. Teknik sorunların ne kadar zor olduğunu anlıyorum, ama tedarikçiler durumu çok daha kötü hale getiriyor. Yazıcılardan nefret ediyorum ve bence zirve LaserJet III dönemiydi.
    • Yazıcıların 10 yıl öncesine göre çok daha iyi olduğunu düşünüyorum. En azından MacOS ve iOS’ta yazıcı bulma ve yazdırma konusunda sorun yaşamıyorum. 10 yıl önce işkenceydi ama şimdi benim ölçütlerime göre sorunsuz; sürücü kurmaya da gerek yok.
    • Son haber: HP yazıcı sürücülerine AI ekliyor. Şaka değil: https://hardware.slashdot.org/story/24/09/27/0030239/hp-is-a...
    • İş kontrolünü kaybediyorsunuz ama belgeyi PostScript’e dönüştürüp ardından netcat ile yazıcı portuna gönderirseniz gayet çalışıyor.
      pdf2ps - | nc 9001