GNU Tar/GNU Cpio远程缓冲区溢出漏洞

漏洞起因
边界条件错误
危险等级

 
影响系统
GNU tar 1.22
GNU cpio 2.10
 
不受影响系统
GNU tar 1.23
GNU cpio 2.11
 
危害
远程攻击者可以利用漏洞以应用程序权限执行任意指令。
 
攻击所需条件
攻击者必须访问GNU Tar/Cpio。
 
漏洞信息
GNU Tar可创建和解压tar文档,并进行各种存档文件管理。GNU cpio是一款创建和提取存档文件的工具。
GNU Tar/Cpio的RMT客户端实现存在堆缓冲区溢出,允许远程攻击者进行任意代码执行攻击。
受影响的函数为rmt_read__ in lib/rtapelib.c:
/* 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中。在循环中,函数从服务器中读取Status字节到缓冲区,但是没有对status是否小于或等于由参数给定的缓冲区长度进行检查,因此恶意的rmt 服务器可覆盖缓冲区之后的堆数据,成功利用漏洞可以以应用程序权限执行任意代码。
 
测试方法
 
厂商解决方案
GNU tar 1.23和GNU cpio 2.11已经修复此漏洞,建议用户下载使用:
http://www.gnu.org/software/cpio/cpio.html
http://www.gnu.org/software/tar/tar.html
 
漏洞提供者
Jakob Lell
 

发表评论?

0 条评论。

发表评论