OpenSSL SSL_Get_Shared_Ciphers单字节缓冲区溢出漏洞

2007-10-09T00:00:00
ID SSV:2276
Type seebug
Reporter Root
Modified 2007-10-09T00:00:00

Description

OpenSSL是一款开放源代码的SSL v2/v3和TLS v1协议实现。 OpenSSL包含的SSL_get_shared_ciphers()函数存在缓冲区溢出,远程攻击者可以利用漏洞以应用程序进程权限执行任意指令。 问题存在于如下代码中ssl/ssl_lib.c: p=buf; sk=s->session->ciphers; for (i=0; i<sk_SSL_CIPHER_num(sk); i++) { / Decrement for either the ':' or a '\0' / len--; [4] c=sk_SSL_CIPHER_value(sk,i); for (cp=c->name; cp; ) { if (len-- <= 0) [1] { p='\0'; [5] return(buf); } else (p++)= (cp++); [2] } *(p++)=':'; [3] } p[-1]='\0'; return(buf); 要触发单字节溢出,需使用密码串填充缓冲区,使得len == 1且cp指向当前密码字符串的最后一个字符,之后使用内部for()循环,会使[1]将len递减到0,这样使得当前密码串最后一个字节写入到缓冲区([2]),增加p后指向缓冲区的最后空闲字节。最后用“:”分隔符填充最后空闲字节,增加p指向缓冲区后一个字节。如果现在仍然有密码,会再次进入外部循环,在[4]将len减少到-1,在[1]再次执行检查。如果此次检查为真,最后终止的\0字节在返回前写入到缓冲区后一个字节([5])而导致溢出。

OpenSSL Project OpenSSL 0.9.8 e OpenSSL Project OpenSSL 0.9.8 d OpenSSL Project OpenSSL 0.9.7 m OpenSSL Project OpenSSL 0.9.7 l

目前没有解决方案提供: <a href="http://www.openssl.org/" target="_blank">http://www.openssl.org/</a>