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>
暂无评论