1. 漏洞描述

Redis是一个开源的基于内存亦可持久化的Key-Value数据库。2024年10月,官方披露 CVE-2024-31449 Redis Lua Script 溢出漏洞,经过身份验证的用户可以使用特制的Lua脚本来触发堆栈缓冲区溢出,并可能会导致远程代码执行。官方已发布更新修复,建议升级至最新版本。

目前受影响的Redis版本:

  • 2.6 ≤ Redis < 6.2.16
  • 7.0.0 ≤ Redis < 7.2.6
  • 7.4.0 ≤ Redis < 7.4.1

安全版本

  • 6.2.16
  • 7.2.6
  • 7.4.1

解决建议

  1. Redis 官方已发布更新修复,建议升级至最新版本。
  2. 利用安全组设置Redis仅对可信地址开放。
  3. 应用漏洞暂只支持获取 Redis 自身版本,若确定已为各发行版本安全修复版本,可予忽略。

2. 升级前信息收集

2.1. 查看旧redis版本信息

1# /usr/local/redis/bin/redis-server --version
2Redis server v=2.8.22 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=4c2b76a2ddab816

2.2. 查看目前redis的key

 1# 登录redis客户端
 2# /usr/local/redis/bin/redis-cli 
 3127.0.0.1:6379> AUTH  xxx
 4OK
 5127.0.0.1:6379> dbsize
 6(integer) 19
 7127.0.0.1:6379> keys *
 8 1) "sys_dict:sys_yes_no"
 9 2) "sys_config:sys.account.captchaEnabled"
10 3) "sys_dict:sys_job_group"
11 4) "sys_config:sys.index.skinName"
12 5) "sys_dict:sys_show_hide"
13 6) "sys_dict:sys_common_status"
14 7) "sys_dict:sys_job_status"
15 8) "sys_dict:cl_url_status"
16 9) "sys_dict:cl_school_type"
1710) "sys_config:sys.user.initPassword"
1811) "sys_config:sys.index.sideTheme"
1912) "sys_dict:cl_school_status"
2013) "sys_dict:sys_notice_type"
2114) "sys_dict:sys_normal_disable"
2215) "sys_config:sys.login.blackIPList"
2316) "sys_dict:sys_oper_type"
2417) "sys_dict:sys_user_sex"
2518) "sys_dict:sys_notice_status"
2619) "sys_config:sys.account.registerUser"

2.3. 备份数据

1# 备份命令
2127.0.0.1:6379> SAVE
3OK
4
5或
6BGSAVE

2.4. 查看备份文件地址

1# 通过命令找到备份的数据文件
2127.0.0.1:6379> config get dir
31) "dir"
42) "/data"
5127.0.0.1:6379> config get dbfilename
61) "dbfilename"
72) "dump.rdb"

2.5. 将旧Redis安装目录备份

1备份旧目录
2cp /usr/local/redis /usr/local/redisbak -r

3. 安装新版本Redis

3.1. 下载redis安装包

下载地址

这里本人下载的 6.2.21 版本

3.2. 安装redis

1# 下载
2wget https://download.redis.io/releases/redis-6.2.21.tar.gz
3# 解压
4tar -zxf redis-6.2.16.tar.gz
5# 切换到解压后的目录
6cd redis-6.2.21
7# 编译安装
8make PREFIX=/usr/local/redis install

配置文件修改为和旧版本一致,主要是数据存放目录和日志目录等

 1配置文件
 2bind * -::*
 3protected-mode no
 4port 6379
 5tcp-backlog 511
 6timeout 0
 7tcp-keepalive 300
 8daemonize no
 9pidfile /var/run/redis_6379.pid
10loglevel notice
11logfile /logs/redis.log
12databases 16
13always-show-logo yes
14set-proc-title yes
15proc-title-template "{title} {listen-addr} {server-mode}"
16locale-collate ""
17save 3600 1 300 100 60 10000
18stop-writes-on-bgsave-error yes
19rdbcompression yes
20rdbchecksum yes
21dbfilename dump.rdb
22rdb-del-sync-files no
23dir /data
24replica-serve-stale-data yes
25replica-read-only yes
26repl-diskless-sync yes
27repl-diskless-sync-delay 5
28repl-diskless-sync-max-replicas 0
29repl-diskless-load disabled
30repl-disable-tcp-nodelay no
31replica-priority 100
32acllog-max-len 128
33aclfile /etc/redis/users.acl
34lazyfree-lazy-eviction no
35lazyfree-lazy-expire no
36lazyfree-lazy-server-del no
37replica-lazy-flush no
38lazyfree-lazy-user-del no
39lazyfree-lazy-user-flush no
40oom-score-adj no
41oom-score-adj-values 0 200 800
42disable-thp yes
43appendonly yes
44appendfilename "appendonly.aof"
45appenddirname appendonly
46appendfsync everysec
47no-appendfsync-on-rewrite no
48auto-aof-rewrite-percentage 100
49auto-aof-rewrite-min-size 64mb
50aof-load-truncated yes
51aof-use-rdb-preamble yes
52aof-timestamp-enabled no
53slowlog-log-slower-than 10000
54slowlog-max-len 128
55latency-monitor-threshold 0
56notify-keyspace-events ""
57hash-max-listpack-entries 512
58hash-max-listpack-value 64
59list-max-listpack-size -2
60list-compress-depth 0
61set-max-intset-entries 512
62set-max-listpack-entries 128
63set-max-listpack-value 64
64zset-max-listpack-entries 128
65zset-max-listpack-value 64
66hll-sparse-max-bytes 3000
67stream-node-max-bytes 4096
68stream-node-max-entries 100
69activerehashing yes
70client-output-buffer-limit normal 0 0 0
71client-output-buffer-limit replica 256mb 64mb 60
72client-output-buffer-limit pubsub 32mb 8mb 60
73hz 10
74dynamic-hz yes
75aof-rewrite-incremental-fsync yes
76rdb-save-incremental-fsync yes
77jemalloc-bg-thread yes

3.3. 启动新的redis

1redis-server /usr/local/redis/etc/redis.conf

3.4. 验证

3.4.1. 查看新安装的redis版本

1redis-server --version
2Redis server v=6.2.21 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=12b91a981b4a57b016 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=12b91a981b4a57b0

3.4.2. 查看数据是否恢复

 1# 登录redis客户端
 2# /usr/local/redis/bin/redis-cli 
 3127.0.0.1:6379> AUTH  xxx
 4OK
 5127.0.0.1:6379> dbsize
 6(integer) 19
 7127.0.0.1:6379> keys *
 8 1) "sys_dict:sys_yes_no"
 9 2) "sys_config:sys.account.captchaEnabled"
10 3) "sys_dict:sys_job_group"
11 4) "sys_config:sys.index.skinName"
12 5) "sys_dict:sys_show_hide"
13 6) "sys_dict:sys_common_status"
14 7) "sys_dict:sys_job_status"
15 8) "sys_dict:cl_url_status"
16 9) "sys_dict:cl_school_type"
1710) "sys_config:sys.user.initPassword"
1811) "sys_config:sys.index.sideTheme"
1912) "sys_dict:cl_school_status"
2013) "sys_dict:sys_notice_type"

从数据可知数据和旧数据一致,说明数据恢复了