使用存在 Heartbleed 漏洞的 OpenSSL 版本¶
ID: cpp/openssl-heartbleed
Kind: problem
Security severity: 7.5
Severity: error
Precision: very-high
Tags:
- security
- external/cwe/cwe-327
- external/cwe/cwe-788
Query suites:
- cpp-code-scanning.qls
- cpp-security-extended.qls
- cpp-security-and-quality.qls
早期版本的流行 OpenSSL 库在其“心跳”代码中存在缓冲区溢出漏洞。由于问题代码的位置,此漏洞通常被称为“Heartbleed”。
包含 OpenSSL 副本的软件应确保使用当前版本的库。如果使用的是旧版本,则它将容易受到与其连接的任何网络站点的攻击。
建议¶
升级到最新版本的 OpenSSL。此问题已在 1.0.1g 版本中修复。
示例¶
以下代码存在于早期版本的 OpenSSL 中。payload
变量是从请求复制回响应的字节数。对 memcpy
的调用执行此复制操作。问题是 payload
作为远程请求的一部分提供,并且没有代码检查它的大小。如果调用方提供了一个非常大的值,则 memcpy
调用将复制请求数据包之外的内存。
int
tls1_process_heartbeat(SSL *s)
{
unsigned char *p = &s->s3->rrec.data[0], *pl;
unsigned short hbtype;
unsigned int payload;
/* ... */
hbtype = *p++;
n2s(p, payload);
pl = p;
/* ... */
if (hbtype == TLS1_HB_REQUEST)
{
/* ... */
memcpy(bp, pl, payload); // BAD: overflow here
/* ... */
}
/* ... */
}
参考¶
常见漏洞与披露:CVE-2014-0160。
OpenSSL 新闻:OpenSSL 安全公告 [2014 年 4 月 7 日]。
常见弱点枚举:CWE-327。
常见弱点枚举:CWE-788。