FreeBSD OPIE实现__opiereadrec()函数单字节栈溢出漏洞

- AV AC AU C I A
发布: 2025-04-13
修订: 2025-04-13

BUGTRAQ ID: 40403 CVE ID: CVE-2010-1938 FreeBSD就是一种运行在Intel平台上、可以自由使用的开放源码Unix类系统。 FreeBSD所使用的OPIE认证系统中readrec.c文件的__opiereadrec()函数存在单字节栈溢出漏洞,在启用了栈保护的情况下,攻击者可以远程导致使用OPIE的服务进程崩溃。以下是有漏洞的代码段: "/src/contrib/opie/opie.h" /* Maximum length of a principal (read: user name) */ #define OPIE_PRINCIPAL_MAX 32 "./src/contrib/opie/libopie/readrec.c" int __opiereadrec FUNCTION((opie), struct opie *opie) { ... ... { char *c, principal[OPIE_PRINCIPAL_MAX]; int i; if (c = strchr(opie->opie_principal, ':')) *c = 0; [1] if (strlen(opie->opie_principal) > OPIE_PRINCIPAL_MAX) [2] (opie->opie_principal)[OPIE_PRINCIPAL_MAX] = 0; [3] strcpy(principal, opie->opie_principal); ... ... } ... ... ret: if (f) fclose(f); return rval; } [1]处函数检查受控变量opie->opie_principal的长度。如果长度大于OPIE_PRINCIPAL_MAX(32字节),程序就会在这个位置写入空字节。实际上字符串确实为32字节长。 漏洞出现在[3]。strcpy()将最多可为32字节的受控变量拷贝到了也为32字节长的principal缓冲区中,但由于strcpy()在拷贝了 32字节后还要向字符串末尾添加一个空字节,因此可以触发单字节溢出。越界发生在*(principal+32)位置。 FreeBSD 8.0...

0%
暂无可用Exp或PoC
当前有0条受影响产品信息