radiusd-cistron是一款RADIUS协议实现。 Cistron-RADIUS服务器没有正确处理超大NAS号,远程攻击者可以利用这个漏洞破坏服务进程内存信息,可能以进程权限在系统上执行任意指令。 Cistron RADIUS当处理用户提供的数据时在调用sprintf()函数时没有正确使用\"\\%d\"格式符,攻击者如果传送一个有符号值作为NAS-Port端口数据,就可以导致覆盖服务器进程的内部内存数据,精心构建提交数据可能以RADIUS进程权限(一般是root)在系统上执行任意指令。 有漏洞代码如下: acct.c: static void make_wtmp(struct radutmp *ut, struct utmp *wt, int status) { char buf[32]; [...] #if UT_LINESIZE > 9 sprintf(buf, \"\\%03d:\\%.20s\", ut->nas_port, s); #else sprintf(buf, \"\\%02d\\%.20s\", ut->nas_port, s); #endif 在Linux上, UT_LINESIZE > 9. 如果ut->nas_port > 2^31,那么\\%03d就可会扩展成一个负数,因此为11个字符,加上冒号和20个字符,最后追加NULL值,就会扩展为33个字符,造成单字节溢出。
radiusd-cistron是一款RADIUS协议实现。 Cistron-RADIUS服务器没有正确处理超大NAS号,远程攻击者可以利用这个漏洞破坏服务进程内存信息,可能以进程权限在系统上执行任意指令。 Cistron RADIUS当处理用户提供的数据时在调用sprintf()函数时没有正确使用\"\\%d\"格式符,攻击者如果传送一个有符号值作为NAS-Port端口数据,就可以导致覆盖服务器进程的内部内存数据,精心构建提交数据可能以RADIUS进程权限(一般是root)在系统上执行任意指令。 有漏洞代码如下: acct.c: static void make_wtmp(struct radutmp *ut, struct utmp *wt, int status) { char buf[32]; [...] #if UT_LINESIZE > 9 sprintf(buf, \"\\%03d:\\%.20s\", ut->nas_port, s); #else sprintf(buf, \"\\%02d\\%.20s\", ut->nas_port, s); #endif 在Linux上, UT_LINESIZE > 9. 如果ut->nas_port > 2^31,那么\\%03d就可会扩展成一个负数,因此为11个字符,加上冒号和20个字符,最后追加NULL值,就会扩展为33个字符,造成单字节溢出。