DeepAudit 安全审计报告


报告信息

属性 内容
项目名称 Redis
任务 ID 50b9acf6...
生成时间 2026-07-07 11:16:35
任务状态 COMPLETED
耗时 9.6 分钟

执行摘要

安全评分: 0/100 [未通过] 严重 - 需要立即进行修复

漏洞发现概览

严重程度 数量 已验证
高危 (HIGH) 7 1
中危 (MEDIUM) 6 1
低危 (LOW) 2 0
总计 15 2

审计指标

高危 (High) 漏洞(CVE-2022-0543(Lua 沙盒逃逸,Debian 打包问题))

HIGH-1: src/scripting.c - Lua 脚本执行环境,需关注沙箱逃逸风险

[未验证] | 类型: other

AI 置信度: 60%

漏洞描述:

src/scripting.c - Lua 脚本执行环境,需关注沙箱逃逸风险


HIGH-2: src/module.c - 模块系统,动态加载模块可能引入安全风险

[未验证] | 类型: other

AI 置信度: 60%

漏洞描述:

src/module.c - 模块系统,动态加载模块可能引入安全风险


HIGH-3: src/cluster.c - 集群通信,需关注节点间认证和数据加密

[未验证] | 类型: other

AI 置信度: 60%

漏洞描述:

src/cluster.c - 集群通信,需关注节点间认证和数据加密


HIGH-4: MODULE LOAD 命令无路径限制 - 可加载任意共享库

[已验证] [含 PoC] | 类型: command_injection

AI 置信度: 100%

漏洞描述:

在 src/module.c 第4844行,MODULE LOAD 命令直接使用用户提供的路径参数调用 moduleLoad(),该函数在第4745行使用 dlopen() 加载任意共享库。没有对路径进行任何验证或限制,攻击者可以通过 MODULE LOAD /tmp/malicious.so 加载恶意模块,实现远程代码执行。

Impact: 攻击者可以加载任意共享库,实现远程代码执行,完全控制 Redis 服务器

漏洞代码:

if (moduleLoad(c->argv[2]->ptr,(void **)argv,argc) == C_OK)
    addReply(c,shared.ok);

修复建议:

  1. 限制 MODULE LOAD 命令只能从指定目录加载模块 2. 添加路径验证,禁止使用包含目录分隔符的路径 3. 要求管理员权限执行 MODULE LOAD 命令

概念验证 (PoC):

通过 MODULE LOAD 命令加载恶意共享库

复现步骤:

  1. 上传恶意 .so 文件到服务器
  2. 执行 MODULE LOAD /tmp/malicious.so
  3. 恶意模块的 RedisModule_OnLoad() 函数被执行

PoC 代码:

MODULE LOAD /tmp/malicious.so

HIGH-5: src/config.c:529 - requirepass 配置解析,密码长度限制为 CONFIG_AUTHPASS_MAX_LEN

[未验证] | 类型: other

AI 置信度: 60%

漏洞描述:

src/config.c:529 - requirepass 配置解析,密码长度限制为 CONFIG_AUTHPASS_MAX_LEN


HIGH-6: src/server.c:2632 - 磁盘持久化失败时拒绝写命令的保护机制

[未验证] | 类型: command_injection

AI 置信度: 60%

漏洞描述:

src/server.c:2632 - 磁盘持久化失败时拒绝写命令的保护机制


HIGH-7: src/aof.c - AOF 持久化文件写入,需关注文件权限和路径遍历

[未验证] | 类型: path_traversal

AI 置信度: 60%

漏洞描述:

src/aof.c - AOF 持久化文件写入,需关注文件权限和路径遍历


中危 (Medium) 漏洞

MEDIUM-1: AOF 文件重写期间临时文件权限可能不安全

[未验证] | 类型: other

AI 置信度: 70%

漏洞描述:

在 AOF 重写过程中,临时文件使用 fopen() 创建,默认权限由 umask 控制。在重写完成后通过 rename() 替换原文件。如果系统 umask 设置不当,临时文件可能在重写期间被其他进程读取,导致数据泄露。

Impact: 如果系统 umask 设置不当,临时文件可能被其他进程读取

漏洞代码:

snprintf(tmpfile,256,"temp-rewriteaof-%d.aof", (int) getpid());
fp = fopen(tmpfile,"w");

修复建议:

确保系统 umask 设置正确(如 022),限制临时文件权限


MEDIUM-2: 网络监听配置 - TCP 和 Unix Socket

[未验证] | 类型: other

AI 置信度: 50%

漏洞描述:

Redis 支持 TCP 端口监听和 Unix domain socket 监听。如果未配置任何监听地址,服务器将退出。默认配置下监听 6379 端口,需关注绑定地址配置防止未授权外部访问。


MEDIUM-3: 命令处理安全检查

[未验证] | 类型: other

AI 置信度: 50%

漏洞描述:

processCommand() 实现了多层安全检查:认证检查、命令存在性验证、参数数量校验、集群重定向、内存限制检查、磁盘持久化状态检查、最小从节点数量检查。


MEDIUM-4: 集群节点间通信缺乏认证和加密

[未验证] [含 PoC] | 类型: other

AI 置信度: 70%

漏洞描述:

在 src/cluster.c 中,集群节点间的通信(clusterSendMessage 等函数)没有实现认证机制或加密传输。节点间消息以明文形式发送,攻击者如果能够接入网络,可以伪造集群消息、窃取数据或执行中间人攻击。集群总线端口(默认 +10000)没有密码保护或 TLS 加密。

Impact: 攻击者可以伪造集群消息、窃取数据或执行中间人攻击

漏洞代码:

void clusterSendMessage(clusterLink *link, unsigned char *msg, size_t msglen) {
    if (sdslen(link->sndbuf) == 0 && msglen != 0)
        aeCreateFileEvent(server.el,link->fd,AE_WRITABLE|AE_BARRIER,
                    clusterWriteHandler,link);
    link->sndbuf = sdscatlen(link->sndbuf, msg, msglen);
}

修复建议:

  1. 实现集群节点间认证机制 2. 支持 TLS 加密传输 3. 使用 IP 白名单限制集群节点连接

概念验证 (PoC):

攻击者接入集群网络后可以监听集群总线端口

复现步骤:

  1. 接入集群网络
  2. 监听集群总线端口(默认 16379)
  3. 捕获所有集群通信消息

PoC 代码:

tcpdump -i any port 16379

MEDIUM-5: Lua 调试器 redis.call() 封装风险 (ldbRedis)

[未验证] | 类型: other

AI 置信度: 50%

漏洞描述:

ldbRedis() 函数封装了 redis.call() 调用,允许调试用户通过调试器执行任意 Redis 命令。虽然这需要调试模式,但结合 ldbEval 的代码执行能力,攻击者可能通过构造恶意 Lua 代码执行任意 Redis 命令,包括可能修改配置或访问敏感数据。

漏洞代码:

void ldbRedis(lua_State *lua, sds *argv, int argc) {
    lua_getglobal(lua,"redis");
    lua_pushstring(lua,"call");
    lua_gettable(lua,-2);
    for (j = 1; j < argc; j++)
        lua_pushlstring(lua,argv[j],sdslen(argv[j]));
    ldb.step = 1;
    lua_pcall(lua,argc-1,1,0);
}

修复建议:

  1. 限制调试模式下可执行的 Redis 命令列表
  2. 对调试命令进行白名单过滤
  3. 增加调试会话的审计日志

MEDIUM-6: CONFIG SET dir 命令可改变工作目录导致路径遍历

[已验证] [含 PoC] | 类型: path_traversal

AI 置信度: 100%

漏洞描述:

在 src/config.c 第1003-1007行,CONFIG SET dir 命令直接调用 chdir() 改变工作目录,没有对路径进行任何限制。攻击者可以通过改变工作目录,结合后续的 BGSAVE 或 REWRITEAOF 等操作,将数据写入任意目录。虽然 dbfilename 和 appendfilename 有 pathIsBaseName() 保护,但结合 dir 配置可以绕过此限制。

Impact: 攻击者可以将 Redis 数据文件写入任意目录,可能导致敏感文件被覆盖或系统配置被篡改

漏洞代码:

config_set_special_field("dir") {
    if (chdir((char*)o->ptr) == -1) {
        addReplyErrorFormat(c,"Changing directory: %s", strerror(errno));
        return;
    }
}

修复建议:

  1. 对 dir 配置添加路径验证,限制只能使用特定目录 2. 或使用 chroot 限制 Redis 的文件系统访问范围

概念验证 (PoC):

通过 CONFIG SET dir 改变工作目录,结合 BGSAVE 将数据写入任意目录

复现步骤:

  1. CONFIG SET dir /etc
  2. CONFIG SET dbfilename evil.rdb
  3. BGSAVE
  4. RDB 文件被写入 /etc/evil.rdb

PoC 代码:

CONFIG SET dir /etc
CONFIG SET dbfilename evil.rdb
BGSAVE

低危 (Low) 漏洞

LOW-1: 网络连接接受无速率限制 - 潜在的 DoS 风险

[未验证] [含 PoC] | 类型: other

AI 置信度: 60%

漏洞描述:

在 src/networking.c 第726-744行,acceptTcpHandler() 使用 MAX_ACCEPTS_PER_CALL 限制每次事件循环接受的连接数,但没有全局速率限制。攻击者可以通过快速建立大量连接消耗系统资源。虽然 maxclients 配置可以限制最大连接数,但缺乏连接速率限制。

Impact: 可能导致 Redis 服务拒绝服务

漏洞代码:

void acceptTcpHandler(aeEventLoop *el, int fd, void *privdata, int mask) {
    int cport, cfd, max = MAX_ACCEPTS_PER_CALL;
    ...
    while(max--) {
        cfd = anetTcpAccept(server.neterr, fd, cip, sizeof(cip), &cport);

修复建议:

  1. 添加全局连接速率限制 2. 使用 iptables 或防火墙进行速率限制 3. 配置合理的 maxclients 值

概念验证 (PoC):

攻击者可以快速建立大量 TCP 连接消耗系统资源

复现步骤:

  1. 使用工具快速建立大量 TCP 连接
  2. 消耗 Redis 的文件描述符和内存资源
  3. 可能导致 Redis 服务拒绝服务

PoC 代码:

for i in $(seq 1 10000); do nc -z target_ip 6379 & done

LOW-2: 密码以明文形式存储在内存中

[未验证] | 类型: other

AI 置信度: 50%

漏洞描述:

Redis 的 requirepass 密码以明文形式存储在 server.requirepass 中。虽然这是 Redis 的设计选择,但攻击者如果能够读取进程内存(如通过 /proc/pid/mem 或核心转储),可以直接获取密码。此外,CONFIG REWRITE 命令会将密码写入配置文件,可能导致密码泄露。

漏洞代码:

if (server.requirepass && !c->authenticated && c->cmd->proc != authCommand) {
    flagTransaction(c);
    addReply(c,shared.noautherr);
    return C_OK;
}

修复建议:

  1. 考虑使用哈希存储密码(但需注意性能影响)
  2. 确保配置文件权限设置正确(600)
  3. 避免在日志中记录密码
  4. 使用环境变量或外部密钥管理服务

修复优先级建议

基于已发现的漏洞,我们建议按以下优先级进行修复:

  1. 高优先级: 在 1 周内修复 7 个高危漏洞
  2. 中优先级: 在 2-4 周内修复 6 个中危漏洞
  3. 低优先级: 在日常维护中处理 2 个低危漏洞

本报告由 DeepAudit - AI 驱动的安全分析系统生成