Socks5是一款由NEC分发的免费开放源代码的代理实现,可使用在Unix、Linux、Microsoft Windows操作系统下。 Socks5在处理用户名时存在漏洞,远程攻击者可以利用这个漏洞进行缓冲区溢出攻击。 在Socks5中的proxy.c中,由于对用户提交的用户名数据缺少正确的边界检查,远程攻击者可以提交超过132字节的用户名给Socks5处理,可导致产生缓冲区溢出,精心构建提交的用户名数据可能以Socks5进程的权限在系统上执行任意指令。 问题代码存在于proxy.c中: proxy.c: static int GetString(S5IOHandle fd, char *buf, double *timerm) { u_char len; buf[0] = \'\'\0\'\'; if (S5IORecv(fd, NULL, (char *)&len, 1, 0, UPWD_IOFLAGS, timerm) != 1) return -1; if (len == 0) return 0; if (S5IORecv(fd, NULL, buf, len, 0, UPWD_IOFLAGS, timerm) != len) return -1; buf[len] = \'\'\0\'\'; return len; } 其中目标用户名定义的缓冲区长度为128字节。
Socks5是一款由NEC分发的免费开放源代码的代理实现,可使用在Unix、Linux、Microsoft Windows操作系统下。 Socks5在处理用户名时存在漏洞,远程攻击者可以利用这个漏洞进行缓冲区溢出攻击。 在Socks5中的proxy.c中,由于对用户提交的用户名数据缺少正确的边界检查,远程攻击者可以提交超过132字节的用户名给Socks5处理,可导致产生缓冲区溢出,精心构建提交的用户名数据可能以Socks5进程的权限在系统上执行任意指令。 问题代码存在于proxy.c中: proxy.c: static int GetString(S5IOHandle fd, char *buf, double *timerm) { u_char len; buf[0] = \'\'\0\'\'; if (S5IORecv(fd, NULL, (char *)&len, 1, 0, UPWD_IOFLAGS, timerm) != 1) return -1; if (len == 0) return 0; if (S5IORecv(fd, NULL, buf, len, 0, UPWD_IOFLAGS, timerm) != len) return -1; buf[len] = \'\'\0\'\'; return len; } 其中目标用户名定义的缓冲区长度为128字节。