详细描述:

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.filename = mkstr(str, len);

sftp_pkt_getstring(pktin, &str, &len);

/* pointer to arbitrary data from packet */

ret->names.longname = mkstr(str, len);

/* pointer to arbitrary data from packet */

ret->names.attrs = sftp_pkt_getattrs(pktin);

}

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

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

受影响系统:

PuTTY PuTTY 0.56

不受影响系统:

PuTTY PuTTY 0.57