CodeQL 文档

使用存在 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

点击查看 CodeQL 代码库中的查询

早期版本的流行 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
            /* ... */
            }
 
 
    /* ... */
 
    }

参考

  • ©GitHub 公司
  • 条款
  • 隐私