一、漏洞情况分析
Redis是一套开源的使用ANSIC编写、支持网络、可基于内存亦可持久化的日志型、键值存储数据库,并提供多种语言的API。Redis默认情况下会开启6379端口,在未开启认证的情况下,可导致任意用户在可以访问目标服务器的情况下未授权访问Redis,读取Redis的数据。该漏洞在较早前就已经被发现,而近期研究者给出了更为危险的利用方法。攻击者可利用Redis的相关方法,将自己的公钥写入目标服务器 /root/.ssh 文件夹的authotrized_keys文件中,进而可以直接登录目标服务器。CNVD对该漏洞的综合评级为“高危”。
二、漏洞影响范围
Redis 暴露在公网(即绑定在0.0.0.0:6379,目标IP公网可访问),并且没有开启相关认证和添加相关安全策略情况下可受影响而导致被利用。根据CNVD成员单位知道创宇公司提供的相关检测结果,存在无验证可直接利用 Redis 服务的目标全球有49099,其中中国有16477。其中已经被黑的比例分别是全球65%(3.1万),中国67.5%(1.1万)。
三、漏洞修复建议
目前,厂商尚未发布该漏洞的修复补丁。CNVD建议参考如下临时加固措施(注:CNVD成员单位绿盟科技公司提供了相关建议):
(一)网络加固
绑定127.0.0.1,redis默认是监听的127.0.0.1上,如果仅仅是本地通信,请确保监听在本地。这种方式缓解了redis的风险。在/etc/redis/redis.conf中配置如下:
bind127.0.0.1
(二)设置防火墙
如果需要其他机器访问,或者设置了slave模式,需添加相应的防火墙设置。命令如下:
iptables -A INPUT -sx.x.x.x -p tcp --dport 6379 -j ACCEPT
(三)添加认证
redis默认没有开启密码认证,打开/etc/redis/redis.conf配置文件, (requirepass 密码)可设置认证密码,保存redis.conf,重启redis(/etc/init.d/redis-serverrestart)之后,需要执行(auth 密码)。示例如下:
root@kali:~# redis-cli -h192.168.10.212
redis192.168.10.212:6379> keys *
(error) ERR operation notpermitted
redis192.168.10.212:6379> auth @nsF0cus!@#
OK
(四)设置单独账户
设置一个单独的redis账户:创建一个redis账户,通过该账户启动。示例如下:
setsid sudo -u redis/usr/bin/redis-server /etc/redis/redis.conf'
(五)重命名重要命令
由于redis没有做基本的权限分离,无管理账号和普通账号之分,导致攻击者登录后可执行任意操作,因此需要隐藏重要命令,例如:FLUSHDB, FLUSHALL, KEYS,PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME,DEBUG, EVAL`。
其中在redis2.8.1和RedisRedis3.x (< 3.0.2)存在有eval沙箱逃逸漏洞,攻击者利用漏洞可执行任意lua代码。设置方法如下,还编辑redis.conf文件:
rename-command CONFIG ""
rename-command flushall ""
rename-command flushdb ""
rename-command shutdown shutdown_dvwa
上述配置将config,flushdb,flushall设置为了空,即禁用该命令,我们也可以命名为一些攻击者难以猜测,我们自己却容易记住的的名字。保存之后,执行/etc/init.d/redis-server restart 重启生效。