Unix通用打印系统cups-browsed远程代码执行漏洞分析
2024-12-13 11:18:0 Author: mp.weixin.qq.com(查看原文) 阅读量:3 收藏

更多安全资讯和分析文章请关注启明星辰ADLab微信公众号及官方网站(adlab.venustech.com.cn)

一、漏洞描述
2024年9月,安全研究员Simone Margaritelli披露了Unix通用打印系统CUPS(Common UNIX Printing System)存在一系列安全漏洞,利用多个漏洞组合可在受影响的系统上执行远程命令。启明星辰ADLab研究人员对该漏洞的原理进行深入分析,同时提出修复建议和缓解措施。

CVE 编号

严重程度

受影响的服务

CVE-2024-47176

8.3

cups-browsed <= 2.0.1

CVE-2024-47076

8.6

libcupsfilters <= 2.1b1

CVE-2024-47175

8.6

libppd <= 2.1b1

CVE-2024-47177

9.0

cups-filters <= 2.0.1

二、相关介绍

CUPS是一个开源的打印系统,用于Linux和其他类UNIX操作系统。CUPS 提供 Web界面和Berkeley命令行界面等多种方式来管理打印机和打印任务。例如访问http://localhost:631可管理打印机。

CUPS主要使用Internet Printing Protocol(IPP)来实现本地和网络打印机的打印功能。IPP是一个在互联网上打印的标准网络协议,它容许用户可以通过互联网作远距离打印及管理打印工作等。IPP采用的超文本传输协议HTTP的POST方法在客户端和打印服务器之间进行会话。

cups-browsed是一个开源的打印服务组件,它是Common UNIX Printing System(CUPS)的一部分。cups-browsed负责在本地网络上自动发现和添加打印机,使用mDNS(多播DNS)或DNS-SD(DNS服务发现)协议来侦测网络上的打印设备。它使得用户能够无需手动配置即可使用网络打印机。

三、原理分析

该漏洞源于cups-browsed服务,该服务绑定在UDP INADDR_ANY:631端口上,接受任何ip发送过来数据。同时该服务适配大多数UNIX系统,且大多数设备默认开启该服务。

该服务的功能是发现互联网上的打印机,然后将打印机添加到系统服务上,相关功能的实现代码在cups-browsed.c文件中。代码中创建一个名为BrowseSocket的套接字,然后绑定在631端口。

当检查到系统支持BrowseRemoteProtocols时,创建一个 UNIX 套接字通道,并设置监视该通道上的输入事件。一旦有数据可读,将调用process_browse_data函数来处理这些数据。

BrowseRemoteProtocols参数可通过/etc/cups/cups-browsed.conf文件进行配置,此处一般默认开启。

process_browse_data是关键的数据处理函数,该函数调用recvfrom从BrowseSocket套接字读取数据包packet。数据包格式遵从HEX_NUMBER HEX_NUMBER TEXT_DATA,使用该格式的数据的原因时是程序在处理packet时使用了下面的函数对数据进行处理。

sscanf (packet, "%x%x%1023s",&type, &state, uri)

接收到数据包后会调用allowed函数对ip进行合理性检查,该检查规则可通过/etc/cups/cups-browsed.conf文件进行配置。

allowed检查通过后会将数据包传入found_cups_printer函数进行进一步处理。

found_cups_printer函数中调用httpSeparateURI函数解析传入的uri参数并将其拆分为协议、用户名、主机名、端口、资源路径等部分。然后根据解析得到的各部分信息,对uri是否等于”/printers/”和”/calsses/”字符串进行检查。检查通过后调用examine_discovered_printer_record函数来处理发现的打印机记录。

处理完数据后调用cfGetPrinterAttributes函数进行回连,其中先使用httpConnect函数先建立http连接,然后调用ippNewRequest建立IPP连接,最后向IPP Server发送获取打印机属性的请求。

发送完请求后cups-browsed程序会调用ppdCreatePPDFromIPP2函数创建PPD文件然后将接收的打印机属性依次保存到文件里面。

至此,已经可以成功设置PPD的属性,接下来就是想办法执行写入的数据。这需要使用CUPS的一个过滤器指令cupsFilter2,该指令用于处理打印作业中的筛选和转换操作。

例如下面的指令要求cups将符合打印机属性的postscript格式的数据传递给program过滤器进行处理,优先级为0。

*cupsFilter2:"application/pdf application/vnd.cups-postscript 0 program

CUPS规定只能使用/usr/lib/cups/filter路径下面的可执行文件,最终以foomatic-rip过滤器作为利用的目标。该过滤器接受PPD文件中的FoomaticRIPCommandLine指令,通过它可以执行任意命令。

四、漏洞修复

截至目前,Ubuntu,Debian,Fedora等多个系统中涉及漏洞的多个版本已基本修复。

在Ubuntu最新版的修复方案中完全删除对旧版 CUPS 协议和 LDAP 的支持。

五、缓解措施

漏洞修复版本已经上传,Ubuntu系统中运行下面两条命令即可进行升级。

sudo apt update

sudo apt upgrade

如果上面的升级不成功,使用下面两种办法缓解该漏洞:

(1)直接禁用cups-browsed服务

sudo systemctl stop cups-browsed

sudo systemctl disable cups-browsed

(2)如果该功能需要使用,建议将/etc/cups/cups-browsed.conf中BrowseRemoteProtocols指令值从默认的“dnssd cups”更改为“none”。

参考链接:

[1]https://www.evilsocket.net/2024/09/26/Attacking-UNIX-systems-via-CUPS-Part-I/

[2]https://gist.github.com/stong/c8847ef27910ae344a7b5408d9840ee1

[3]https://censys.com/common-unix-printing-service-vulnerabilities/

[4]https://blog.ostorlab.co/cups-vulnerabilities.html

[5]https://github.com/OpenPrinting/cups-browsed/security/advisories/GHSA-rj88-6mr5-rcw8

[6]https://ubuntu.com/security/notices/USN-7043-4

[7]https://ubuntu.com/security/notices/USN-7042-3

[8]https://launchpad.net/ubuntu/+source/cups-browsed/2.0.1-0ubuntu2.1

[9]https://www.upwind.io/feed/analyzing-the-latest-cups-rce-vulnerability-threats-and-mitigations

启明星辰积极防御实验室(ADLab)

ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员,“黑雀攻击”概念首推者。截至目前,ADLab已通过 CNVD/CNNVD/NVDB/CVE累计发布安全漏洞5000余个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖基础安全研究、数据安全研究、5G安全研究、人工智能安全研究、移动安全研究、物联网安全研究、车联网安全研究、工控安全研究、信创安全研究、云安全研究、无线安全研究、高级威胁研究、攻防体系建设。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等


文章来源: https://mp.weixin.qq.com/s?__biz=MzAwNTI1NDI3MQ==&mid=2649619760&idx=1&sn=941fa5fb1aeba9276998379a942c2a88&chksm=83062020b471a936682483c6d85729d8982115b1c593f912008de19196d755214a58855c0e6d&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh