安全研究
安全漏洞
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/
浏览次数:2761
严重程度:0(网友投票)
绿盟科技给您安全的保障