PuTTY SFTP客户端包解析整数溢出漏洞

2008-04-10 03:03:53来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

PuTTY SFTP客户端包解析整数溢出漏洞

发布日期:2005-02-20
更新日期:2005-02-23

受影响系统:
PuTTY PuTTY 0.56
不受影响系统:
PuTTY PuTTY 0.57
描述:
CVE(CAN) ID: CVE-2005-0467

PuTTY是一款免费的Telnet和SSH客户端实现,可使用在Win32平台下。

PuTTY存在多个整数溢出问题,远程攻击者可以利用这些漏洞以进程权限在系统上执行任意指令。

第一个漏洞是由于对用户提供的数据传递给memcpy函数时缺少充分验证。PuTTY sftp实现允许攻击者在包中指定值作为字符串存储长度,这可以从sftp.c函数中的sftp_pkt_getstring()函数中看到:

static void sftp_pkt_getstring(struct sftp_packet *pkt,
char **p, int *length)
{
*p = NULL;
if (pkt->length - pkt->savedpos < 4)
return;
/* length value is taken from user-supplied data */
*length = GET_32BIT(pkt->data pkt->savedpos);
pkt->savedpos = 4;
/* this check will be passed if length < 0 */
if (pkt->length - pkt->savedpos < *length)
return;
*p = pkt->data pkt->savedpos;
pkt->savedpos = *length;
}

这个函数从fxp_open_recv()中调用,传递返回字符串指针和字符串长度给mkstr()函数:

struct fxp_handle *fxp_open_recv(struct sftp_packet *pktin,
struct sftp_request *req)
{
...
/* sftp_pkt_getstring call with controlled len value */
sftp_pkt_getstring(pktin, &hstring, &len);
...
handle = snew(struct fxp_handle);
/* heap corruption will occur if len == -1 */
handle->hstring = mkstr(hstring, len);
handle->hlen = len;
sftp_pkt_free(pktin);
return handle;
...
}

如果长度为-1,当snewn()宏调用时会出现malloc(0):

static char *mkstr(char *s, int len)
{
/* malloc(0) if len == -1 */
char *p = snewn(len 1, char);
/* user controlled heap corruption */
memcpy(p, s, len);
p[len] = '\0';
return p;
}

最后的memcpy函数调用就可以发生堆破坏。

第二个漏洞存在于把用户提供的数据传递给malloc函数中,问题存在于fxp_readdir_recv()函数中:

struct fxp_names *fxp_readdir_recv(struct sftp_packet *pktin,
struct sftp_request *req) {
/* 32 bit value from packet */
ret->nnames = sftp_pkt_getuint32(pktin);
/*
* The integer overflow occurs when ret->nnames is referenced
* the snewn macro calls malloc() wrapper
* #define snewn(n, type) ((type *)smalloc((n)*sizeof(type)))
*/
ret->names = snewn(ret->nnames, struct fxp_name);
for (i = 0; i < ret->nnames; i ) {
char *str;
int len;
sftp_pkt_getstring(pktin, &str, &len);
/* pointer to arbitrary data from packet */
ret->names[i].filename = mkstr(str, len);
sftp_pkt_getstring(pktin, &str, &len);
/* pointer to arbitrary data from packet */
ret->names[i].longname = mkstr(str, len);
/* pointer to arbitrary data from packet */
ret->names[i].attrs = sftp_pkt_getattrs(pktin);
}

这个函数来自scp.c文件中的scp_get_sink_action()函数和sftp.c的sftp_cmd_ls(),攻击者可通过堆破坏而执行任意指令。

攻击者可以通过构建恶意服务器进行攻击来触发此漏洞。

<*来源:iDEFENSE Security Advisory (labs@idefense.com)
Ga Delalleau

链接:www.idefense.com/application/poi/display?id=201
http://security.gentoo.org/glsa/glsa-200502-28.xml
*>

建议:
临时解决方法:

如果您不能立刻安装补丁或者升级,NSFOCUS建议您采取以下措施以降低威胁:
* 使用备选的SSH客户端连接到不可信任的主机

厂商补丁:

PuTTY
-----
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载PuTTY 0.57版本:

http://www.chiark.greenend.org.uk/~sgtatham/putty/

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:phpBB Group phpBB2任意文件删除漏洞

下一篇:Squid Proxy WCCP recvfrom()远程缓冲区溢出漏洞