CUPS SNMP后端asn1_get_string()函数远程栈溢出漏洞

本文介绍了Common Unix Printing System (CUPS) 在处理SNMP请求时存在的一个漏洞,该漏洞可能导致远程攻击者控制服务器。详细解释了漏洞触发机制,并提供了修复版本。
发布日期:2007-11-08
更新日期:2008-01-03

受影响系统:
Apple CUPS <= 1.3.4
不受影响系统:
Apple CUPS 1.3.5
描述:
BUGTRAQ  ID: 26917
CVE(CAN) ID: CVE-2007-5849

Common Unix Printing System (CUPS)是一款通用Unix打印系统,是Unix环境下的跨平台打印解决方案,基于Internet打印协议,提供大多数PostScript和raster打印机服务。

CUPS处理包含畸形数据的SNMP请求时存在漏洞,远程攻击者可能利用此漏洞控制服务器。

CUPS的backend/snmp.c文件中的asn1_get_string()函数存在符号错误。当后端SNMP程序广播SNMP请求发现网络打印服务器时,攻击者可以回复畸形的SNMP请求,后端SNMP程序处理包含有负值asn1编码字符串的SNMP响应时就会触发栈溢出,导致拒绝服务或执行任意指令。

<*来源:Wei Wang ( wei_wang@mcafee.com
  
  链接: http://secunia.com/advisories/28129
         http://bugs.gentoo.org/show_bug.cgi?format=multiple&id=201570
         http://www.cups.org/str.php?L2589
         http://www.debian.org/security/2007/dsa-1437
         http://security.gentoo.org/glsa/glsa-200712-14.xml
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

http://www.cups.org/str.php?L2589
 
`CUPS_NETWORK_PRINTER_PDD` 是 CUPS(Common UNIX Printing System,通用 UNIX 打印系统)中的一个常量或宏定义,通常用于表示某种打印机类型或状态。它主要出现在 CUPS 的源代码或其 API 的上下文中。 具体来说,`CUPS_NETWORK_PRINTER_PDD` 表示一个网络打印机的 PDD(PostScript Printer Description)信息。PDD 文件类似于传统的 PPD(PostScript Printer Description)文件,但 PDD 是 CUPS 特有的、用于描述打印机功能的结构化数据格式,通常以 XML 形式存储。PDD 用于支持 CUPS 的自动配置和驱动程序加载机制。 在 CUPS 中,`CUPS_NETWORK_PRINTER_PDD` 通常用于标识某个打印机是通过网络发现的,并且其描述信息(PDD)已经由 CUPS 自动生成或从网络中获取。 ### 示例代码 以下是一个简单的 CUPS API 使用示例,展示了如何获取打印机的信息,包括其 PDD 数据。这个示例使用 CUPS 提供的 C API: ```c #include <cups/cups.h> #include <stdio.h> int main() { // 获取本地可用的所有打印机 cups_dest_t *dests; int num_dests = cupsGetDests(&dests); for (int i = 0; i < num_dests; i++) { cups_dest_t *dest = &dests[i]; printf("Printer: %s\n", dest->name); // 获取打印机的 PDD 信息 ipp_t *pdd = cupsGetPPD(dest->name, NULL); if (pdd) { printf("PDD data retrieved for printer %s\n", dest->name); // 检查是否是网络打印机的 PDD // 这里是一个伪代码,因为 CUPS API 中没有直接暴露 CUPS_NETWORK_PRINTER_PDD 的使用 // 实际上该常量可能用于内部逻辑判断 // if (some_condition == CUPS_NETWORK_PRINTER_PDD) // printf("This is a network printer PDD.\n"); ippDelete(pdd); } else { printf("Failed to retrieve PDD data for printer %s\n", dest->name); } } // 释放打印机信息 cupsFreeDests(num_dests, dests); return 0; } ``` ### 代码解释 1. **获取打印机列表**:通过 `cupsGetDests` 获取本地所有可用的打印机。 2. **遍历打印机**:循环遍历每个打印机,打印其名称。 3. **获取 PDD 数据**:使用 `cupsGetPPD` 获取打印机的 PDD 描述信息。 4. **判断是否为网络打印机**:虽然 `CUPS_NETWORK_PRINTER_PDD` 并不会直接出现在 CUPS 的公共 API 中,但在 CUPS 内部源码中,它可能用于标识某些特定的 PDD 类型,例如网络打印机的描述信息。 ### 使用场景 - **网络打印机自动配置**:当 CUPS 发现一个网络打印机(例如通过 Bonjour 或 IPP 协议),它会自动生成一个 PDD 文件,而不是依赖传统的 PPD 文件。 - **驱动程序加载**:CUPS 可以根据 PDD 文件自动选择合适的驱动程序或过滤器。 - **状态监控**:PDD 文件可能包含打印机支持的功能、纸张大小、分辨率等信息。 --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值