3. Redis 安全威胁模型:常见攻击向量与数据泄露风险
Redis 作为高性能内存数据存储系统,在生产环境中常处于网络可达状态,其安全威胁模型涵盖外部攻击、内部滥用及配置缺陷三大维度。本章系统梳理 Redis 面临的常见攻击向量、数据泄露路径及内部威胁场景,帮助架构师建立完整的威胁认知框架。
3.1 攻击向量全景图
Redis 攻击向量可归纳为四类:未授权访问、SSRF 利用、命令注入 和 配置弱项。下图展示了各攻击向量的入口、利用方式及潜在后果。
3.2 未授权访问攻击
未授权访问是 Redis 最常见的安全漏洞。当 Redis 实例绑定到 0.0.0.0 且未设置 requirepass 时,任何网络可达的攻击者均可直接连接并执行任意命令。
3.2.1 攻击场景与利用方式
| 攻击阶段 | 操作命令 | 说明 |
|---|---|---|
| 探测 | PING |
确认 Redis 存活且未授权 |
| 信息收集 | INFO |
获取版本、OS、配置等敏感信息 |
| 数据窃取 | KEYS * / GET |
遍历并读取所有缓存键值 |
| 持久化后门 | CONFIG SET dir /root/.ssh/CONFIG SET dbfilename authorized_keysSAVE |
写入 SSH 公钥实现远程登录 |
| 计划任务 | CONFIG SET dir /var/spool/cron/CONFIG SET dbfilename rootSAVE |
写入 crontab 反弹 Shell |
⚠️ 真实案例警示: 2018 年某云厂商 Redis 因默认绑定 0.0.0.0 且未设密码,导致大量实例被攻击者写入 crontab 挖矿程序。攻击者仅需 3 条命令即可完成入侵:
CONFIG SET dir /var/spool/cron/ → CONFIG SET dbfilename root → SAVE。
3.3 SSRF 利用与内网横向移动
SSRF(服务端请求伪造)是 Redis 在微服务架构中的高频攻击入口。攻击者通过控制 Web 应用发起对内网 Redis 的请求,绕过边界防火墙实施攻击。
3.3.1 SSRF 攻击 Redis 的典型链路
- 入口: Web 应用存在 SSRF 漏洞(如未校验 URL 协议和 IP 白名单)
- 探测: 攻击者构造
gopher://redis-host:6379/或http://redis-host:6379/请求 - 协议转换: 利用 gopher 协议发送 Redis 命令(如
*1%0d%0a$4%0d%0aINFO%0d%0a) - 横向移动: 通过
SLAVEOF命令将受害 Redis 设为攻击者控制实例的从库,同步数据 - 数据外泄: 攻击者从自己的 Redis 实例拉取同步过来的全量数据
🔍 关键检测指标: 在 Redis 日志中搜索
SLAVEOF、CONFIG SET、MODULE LOAD 等敏感命令的异常调用记录。建议开启 ACL LOG 审计日志,记录所有命令执行历史。
3.4 命令注入与 Lua 沙箱逃逸
Redis 支持 Lua 脚本(EVAL/EVALSHA)和模块加载(MODULE LOAD),这些功能若未加限制,可能被用于命令注入或沙箱逃逸。
3.4.1 常见注入向量
| 攻击向量 | 利用方式 | 风险等级 |
|---|---|---|
| Lua 沙箱逃逸 | 利用 redis.call('EVAL', ...) 嵌套调用,或通过 debug 库访问全局变量 |
高 |
| MODULE LOAD | 加载恶意 .so 模块,直接执行系统命令 | 极高 |
| 参数注入 | 在 SET key value 中构造换行符 \r\n 注入多条命令 |
中 |
| ACL 绕过 | 利用低权限用户执行 ACL SETUSER 提权 |
中 |
# Lua 沙箱逃逸示例(Redis 6.x 以下版本)
EVAL "local f = loadstring('return io.popen')() f('id')" 0
# MODULE LOAD 恶意模块
MODULE LOAD /tmp/evil.so
💡 防御建议: Redis 7.0+ 默认禁用
MODULE LOAD 命令;生产环境应使用 RENAME_COMMAND 重命名高危命令,或通过 ACL 限制 EVAL/MODULE 权限仅授予受信用户。
3.5 数据泄露风险
Redis 数据泄露不仅来自外部攻击,也源于内部配置不当和运维疏忽。以下表格归纳了主要泄露路径及防护措施。
| 泄露路径 | 风险描述 | 防护措施 |
|---|---|---|
| RDB/AOF 文件泄露 | 持久化文件被未授权读取,或备份存储至公共位置 | 文件权限 600;备份加密;存储于隔离存储桶 |
| 主从同步暴露 | 从库未设密码,或同步链路未加密 | 开启 replica-auth;使用 TLS 加密复制 |
| 内存快照转储 | 调试时 DEBUG SEGFAULT 生成 core dump 包含数据 |
禁用 DEBUG 命令;限制 core dump 权限 |
| 日志泄露 | 慢查询日志、审计日志包含明文键值 | 日志脱敏;限制日志访问权限 |
| 云服务元数据 | Redis 配置中误写入云 AK/SK 或数据库连接串 | 使用外部密钥管理服务;定期扫描配置 |
3.6 内部威胁与权限滥用
内部威胁往往比外部攻击更难防范,因为内部人员已具备合法访问权限。Redis 内部威胁主要来自:
- 权限过度授予: 开发人员使用默认用户(default)或拥有
ALL COMMANDS权限 - 共享账号: 多个团队共用同一 Redis 密码,无法追溯操作者
- 数据窥探: 运维人员通过
KEYS */MONITOR查看业务敏感数据 - 误操作:
FLUSHALL/DEL等命令导致生产数据丢失
3.7 威胁模型总结与防御优先级
基于攻击频率和危害程度,Redis 安全威胁的防御优先级如下:
- 第一优先级: 消除未授权访问(绑定内网 IP + 强密码 + ACL)
- 第二优先级: 限制高危命令(RENAME_COMMAND / ACL 命令分类)
- 第三优先级: 加密传输(TLS)与持久化文件保护
- 第四优先级: 审计与监控(ACL LOG + 慢查询 + 异常告警)
📌 架构师检查清单:
✅
✅
✅ ACL 是否已按用户角色细分权限?
✅ 高危命令是否已重命名或禁用?
✅ 持久化文件权限是否为 600?
✅ 主从复制是否启用 TLS?
✅ ACL LOG 是否开启并接入告警?
✅
bind 是否仅限内网 IP?✅
requirepass 是否已设置且符合密码复杂度?✅ ACL 是否已按用户角色细分权限?
✅ 高危命令是否已重命名或禁用?
✅ 持久化文件权限是否为 600?
✅ 主从复制是否启用 TLS?
✅ ACL LOG 是否开启并接入告警?