OpenSSL是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是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])。