cve-2022-0543不是redis rce,而是java客户端lua沙箱逃逸:漏洞利用debian/ubuntu打包时遗留的package对象加载liblua函数,绕过沙箱限制,但无法执行os.execute等系统命令,实际影响为jvm反射误用导致dos与有限信息泄露。

不能。Redis 内置的 Lua 解释器是沙箱环境,io.open、os.execute、require 等涉及文件系统或外部进程的操作全部被禁用,任何尝试读取磁盘文件(包括配置文件)的 Lua 代码都会直接报错:attempt to call a nil value (field 'open') 或 Forbidden function called: io_open。
为什么 Redis 不允许 Lua 脚本读文件
这是硬性安全限制,不是配置可开关的选项:
- Redis 的 Lua 沙箱禁止所有 I/O 系统调用,防止脚本读取敏感文件(如
/etc/passwd、redis.conf)或写入任意路径 - 脚本执行必须是纯内存操作、确定性、可重入的,否则无法保证主从一致性和 AOF/RDB 重放安全
- 即使你把配置文件挂载进 Docker 容器,
redis-cli或EVAL里调用io.read依然失败
想在 Lua 脚本里用配置值,实际怎么做
只能靠“传入”而非“读取”:
- 把配置项作为
EVAL的KEYS或ARGV参数传进去,例如:EVAL "return ARGV[1] .. ':' .. redis.call('get', KEYS[1])" 1 mykey "timeout=30" - 在脚本开头用
redis.call('config', 'get', 'maxmemory')获取部分运行时配置(注意:仅限少数白名单命令,config get在默认配置下已被禁用,需显式开启CONFIG命令权限) - 把配置固化进脚本内容本身——比如把超时时间、前缀字符串直接写死在
EVAL的字符串里,或通过SCRIPT LOAD预加载带参数占位符的脚本
常见踩坑点:误以为挂载目录就能读
很多人在 Docker 里用 -v /host/conf:/conf 挂载了 redis.conf,然后在 Lua 里写 io.open('/conf/redis.conf') ——这必然失败。挂载只对宿主机进程有效,Redis 进程内部的 Lua 沙箱看不到这些文件系统路径。
真正能被 Lua 访问的,只有 Redis 自己的键空间和有限的内置命令返回值。任何绕过沙箱的尝试,要么报错,要么被 Redis 启动时直接拒绝加载(如果用了 lua-time-limit 或 notify-keyspace-events 等依赖机制,还可能引发服务异常)。











