一、漏洞简介

1.1 漏洞背景

ares_inet_net_pton() 是 c-ares 提供的用于将 IP 地址字符串转换为网络地址结构的函数。该函数在处理特定格式的 IPv6 地址时存在缓冲区下溢漏洞。

1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)

项目 内容
漏洞编号 CVE-2020-7769
危害等级 HIGH / 8.6
漏洞类型 c-ares 缓冲区下溢
披露时间 2020-11-12
影响组件 gRPC
属性
CVE 编号 CVE-2020-7769
危害等级 中危 (Medium)
CVSS 评分 5.3 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N)
CWE 编号 CWE-787 (Out-of-bounds Write), CWE-125 (Out-of-bounds Read)
影响组件 c-ares
GHSA 编号 GHSA-x6mf-cxr9-8q6v

补充核验信息:公开时间:2020-11-12;NVD 评分:8.6(HIGH);CWE:CWE-88。

二、影响范围

2.1 受影响的版本

  • c-ares < 1.19.1

2.2 不受影响的版本

  • c-ares >= 1.19.1

2.3 触发条件(如特定模块、特定配置、特定运行环境等)

  1. 管理员通过 ares_set_sortlist() 配置了特定格式的 IPv6 地址
  2. 或者应用程序直接调用 ares_inet_net_pton() 处理恶意输入

三、漏洞详情与原理解析

3.1 漏洞触发机制

漏洞存在于 ares_inet_net_pton() 函数处理 IPv6 地址时的边界检查不足:

  1. 触发输入:特定格式的 IPv6 地址,如 "0::00:00:00/2"
  2. 缓冲区下溢:函数在计算地址偏移时未正确验证边界
  3. 内存访问:导致读取或写入缓冲区之前的内存区域

3.2 源码层面的根因分析(结合源码与补丁对比)

漏洞代码位置src/lib/ares_inet_net_pton.c

问题代码片段(简化版):

static int ares_inet_pton6(const char *src, unsigned char *dst) {
    // 处理 IPv6 地址
    // ...

    // 边界检查不足
    if (tp < colonp) {  // 可能 tp < dst,导致下溢
        // ...
    }
    // ...
}

修复补丁关键点

// 添加边界检查
if (colonp != NULL) {
    if (tp < colonp) {
        // 验证指针不会低于缓冲区起始位置
        if (tp < dst) {
            return 0;  // 返回错误
        }
        // 安全地移动内存
    }
}

四、漏洞复现(可选)

4.1 环境搭建

// test_cve_2020_7769.c
#include <ares.h>
#include <stdio.h>

int main() {
    struct in6_addr addr;
    const char *malicious = "0::00:00:00/2";

    int result = ares_inet_net_pton(AF_INET6, malicious, &addr, sizeof(addr));
    printf("Result: %d\n", result);

    return 0;
}

4.2 PoC 演示与测试过程

# 编译测试程序
gcc -o test_cve test_cve_2020_7769.c -lcares

# 使用 AddressSanitizer 检测
gcc -fsanitize=address -o test_cve_asan test_cve_2020_7769.c -lcares
./test_cve_asan

五、修复建议与缓解措施

5.1 官方版本升级建议

  • 升级 c-ares 至 >= 1.19.1

5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)

  1. 输入验证:在调用 ares_inet_net_pton() 前验证 IP 地址格式 c // 添加输入验证 if (strstr(ip_str, "::") != NULL && strstr(ip_str, "/") != NULL) { // 可能是恶意输入,进行更严格的验证 }

  2. 避免直接暴露:不要让用户直接控制传给 ares_set_sortlist() 的参数

六、参考信息 / 参考链接

6.1 官方安全通告

<hr />

6.2 其他技术参考资料

  • NVD:https://nvd.nist.gov/vuln/detail/CVE-2020-7769
  • CVE:https://www.cve.org/CVERecord?id=CVE-2020-7769
  • https://github.com/nodemailer/nodemailer/commit/ba31c64c910d884579875c52d57ac45acc47aa54
  • https://snyk.io/vuln/SNYK-JAVA-ORGWEBJARSNPM-1039742
  • https://snyk.io/vuln/SNYK-JS-NODEMAILER-1038834
  • https://github.com/nodemailer/nodemailer/blob/33b62e2ea6bc9215c99a9bb4bfba94e2fb27ebd0/lib/sendmail-transport/index.js%23L75
  • https://github.com/c-ares/c-ares/security/advisories/GHSA-x6mf-cxr9-8q6v
  • https://nvd.nist.gov/vuln/detail/CVE-2020-7769