rwalld守护程序(rpc.rwalld)是一个处理网络wall请求的服务器。在接到rwall请求时,它调用本地的wall向一个时间共享系统中的所有终端发送信息。 它在处理rwall客户端发来的信息时存在一个格式串漏洞,可允许本地或者远程攻击者以rwall守护程序的权限(缺省是root权限)执行任意代码。 问题出在rwall_subr.c中的一段信息处理代码: /* * Make sure the wall programs exists, is executeable, and runs */ if (rval == -1 || (wall.st_mode & S_IXUSR) == 0 || (fp = popen(WALL_PROG, \"w\")) == NULL) { syslog(LOG_NOTICE, \"rwall message received but could not execute \\%s\", WALL_PROG); syslog(LOG_NOTICE, msg); 如果popen(WALL_PROG, \"w\")调用出错,程序会调用syslog()报告出错信息,由于错误的将客户端发来的信息(msg)作为格式串进行处理,客户端就可能利用这个漏洞重写内存内容,改变程序执行流程,并可能执行任意代码。 攻击者利用这个漏洞需要能够使得popen调用失败,结合一些其他的攻击手法,比如设法删除rwalld或改变rwalld的属性和内容、耗尽系统进程或者文件描述符表等等。远程利用这个漏洞比较困难,但还是可能的。
rwalld守护程序(rpc.rwalld)是一个处理网络wall请求的服务器。在接到rwall请求时,它调用本地的wall向一个时间共享系统中的所有终端发送信息。 它在处理rwall客户端发来的信息时存在一个格式串漏洞,可允许本地或者远程攻击者以rwall守护程序的权限(缺省是root权限)执行任意代码。 问题出在rwall_subr.c中的一段信息处理代码: /* * Make sure the wall programs exists, is executeable, and runs */ if (rval == -1 || (wall.st_mode & S_IXUSR) == 0 || (fp = popen(WALL_PROG, \"w\")) == NULL) { syslog(LOG_NOTICE, \"rwall message received but could not execute \\%s\", WALL_PROG); syslog(LOG_NOTICE, msg); 如果popen(WALL_PROG, \"w\")调用出错,程序会调用syslog()报告出错信息,由于错误的将客户端发来的信息(msg)作为格式串进行处理,客户端就可能利用这个漏洞重写内存内容,改变程序执行流程,并可能执行任意代码。 攻击者利用这个漏洞需要能够使得popen调用失败,结合一些其他的攻击手法,比如设法删除rwalld或改变rwalld的属性和内容、耗尽系统进程或者文件描述符表等等。远程利用这个漏洞比较困难,但还是可能的。