GNU Tar和GNU Cpio远程堆溢出漏洞
发布日期:2010-03-10
更新日期:2010-03-11
受影响系统:GNU cpio 2.10
GNU tar 1.22
不受影响系统:GNU cpio 2.11
GNU tar 1.23
描述:
BUGTRAQ ID:
38628
CVE(CAN) ID:
CVE-2010-0624
GNU Tar和GNU Cpio都是流行的用于管理档案文件的程序。
GNU Tar/Cpio的rmt客户端实现中存在堆溢出漏洞,可能导致执行任意代码。以下是lib/rtapelib.c文件rmt_read__函数中有漏洞的代码段:
/* Read up to LENGTH bytes into BUFFER from remote tape connection HANDLE.
Return the number of bytes read on success, SAFE_READ_ERROR on error. */
size_t
rmt_read__ (int handle, char *buffer, size_t length)
{
char command_buffer[COMMAND_BUFFER_SIZE];
size_t status;
size_t rlen;
size_t counter;
sprintf (command_buffer, "R%lu\n", (unsigned long) length);
if (do_command (handle, command_buffer) == -1
|| (status = get_status (handle)) == SAFE_READ_ERROR)
return SAFE_READ_ERROR;
for (counter = 0; counter < status; counter += rlen, buffer += rlen)
{
rlen = safe_read (READ_SIDE (handle), buffer, status - counter);
if (rlen == SAFE_READ_ERROR || rlen == 0)
{
_rmt_shutdown (handle, EIO);
return SAFE_READ_ERROR;
}
}
return status;
}
函数首先使用sprintf()和do_command()向服务器写入所要读取的字节数,之后使用get_status()向status变量读入可用的字节数。在for循环中,函数从服务器将status字节读入到缓冲区,但没有检查status是否小于或等于length参数所指定的缓冲区长度,因此恶意rmt服务器可以覆盖缓冲区后堆上数据。
<*来源:Jakob Lell (
jakob@cs.tu-berlin.de)
链接:
http://marc.info/?l=bugtraq&m=126825951926671&w=2
https://www.redhat.com/support/errata/RHSA-2010-0145.html
https://www.redhat.com/support/errata/RHSA-2010-0144.html
https://www.redhat.com/support/errata/RHSA-2010-0143.html
https://www.redhat.com/support/errata/RHSA-2010-0142.html
https://www.redhat.com/support/errata/RHSA-2010-0141.html
*>
建议:
临时解决方法:
* 不要使用集成的rmt客户端。
* 在解压tar文件时检查文件名中不要包含有冒号,或使用--force-local选项。
厂商补丁:
GNU
---
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://www.gnu.org
RedHat
------
RedHat已经为此发布了一个安全公告(RHSA-2010:0141-01)以及相应补丁:
RHSA-2010:0141-01:Moderate: tar security update
链接:
https://www.redhat.com/support/errata/RHSA-2010-0141.html浏览次数:2496
严重程度:0(网友投票)