dot 快速的未来即将在您所在的城市举行活动。

加入我们参加 Redis 发布会

漏洞修复:Lua 和 MessagePack

Apple 漏洞研究小组在 2018 年 5 月提醒我们,Redis 中存在一个可能被利用的漏洞。我们非常重视此披露,并投入资源来妥善修复此问题。我们很高兴地告诉您,Salvatore Sanfilippo(开源 Redis 的创建者和首席开发人员)为开源用户创建了补丁,并联系了所有主要的 Redis 提供商。我们已将修复程序推送到我们所有的 Redis Enterprise 产品中:云、VPC 和软件。

此漏洞是什么?

背景:Redis 嵌入 Lua 用于数据库级脚本。Lua 脚本引擎包含一些与 Redis 用例相关的库。最初发现的漏洞与 MsgPack 库有关,MsgPack 库是 MessagePack 序列化格式的实现。MessagePack 与 JSON 类似,但更节省空间,因为它依赖于二进制编码来控制和(尽可能)值本身。

Lua 中提供了一个接受可变数量参数(可变参数)的函数,用于使用 MessagePack 格式“打包”消息。此可变参数函数背后的实现没有正确检查堆栈可用性。如果没有此检查,可以将大量参数传递给此函数,并导致溢出。由于 Redis 的性质,可能直接来自不受信任用户的这些数据将以这种方式被接受和处理。

此漏洞没有已知的“现实世界”攻击。由于此漏洞的性质,与任何溢出情况一样,理论上可以执行远程代码执行,但这必须针对非常特定的 Redis 版本,在非常特定的场景中。我们尚未获悉此行为的任何概念验证。更可能的是,此漏洞可以被利用来导致不稳定或 Redis 服务器崩溃。

是否有任何相关的漏洞?

在审查过程中,通常会审查代码库的其他部分以查找相关错误。在此过程中,Salvatore 在 OSS 社区的帮助下,在打包和解包其他结构的 Lua 实现中发现了类似的漏洞。还实施了修复程序以解决这些问题。

Apple 漏洞研究小组还提出了关于 Sentinel 远程配置作为安全风险的问题。我们不同意此发现,因为 Redis 明确地启用远程配置,前提是 Sentinel 不应由面向公众的地址访问。

此外,Redis Enterprise 不使用 Sentinel 来实现高可用性,而是使用其他内部机制,因此此发现不会影响 Redis Enterprise 用户。

我是否容易受到攻击?

2.8.18 之后的所有未修补版本的 Redis 都可能受到影响。要处于风险之中,您必须使用 Lua 并以非常特定的方式直接允许将不受限制的用户输入传递到脚本中。虽然我们认为以这种方式将这些功能结合使用的用户比例很小,但我们仍然建议所有用户应用补丁以防止对未修补系统未来的攻击载体。 

补丁如何工作?

该补丁添加了对堆栈可用性的正确检查,如果 Lua 脚本尝试打包过大的消息,则会返回错误。这保证了在运行时,这种特定攻击将不可能发生。

其他后续工作

我们检查了 Redis 的其他部分以查找类似的漏洞,到目前为止,尚未发现具有相同风险特征的任何其他漏洞。

如果我是一个 Redis Enterprise 用户(云/VPC/软件),我应该怎么办?

一般来说,只要您使用我们的访问控制(云安全组)和身份验证(SSL、密码)/访问控制(SIP)机制之一,您的 Redis 应该就是安全的。此外,如果您的应用程序不使用 Lua 脚本,您将不会遇到任何问题。即使您的应用程序使用 Lua,此漏洞也会在极端条件下发生,并且仅在您的应用程序使用大量参数调用 Lua 时才会发生。由于此漏洞自 Redis 中宣布 Lua 支持以来一直存在(在 2014 年),我们认为您可能之前没有遇到过此问题,除非您的应用程序发生了重大变化,否则此问题影响您 Redis 部署的可能性极低。此外,Redis Enterprise 附带内置的复制、自动故障转移和数据持久性机制,以确保在 Redis 故障情况下数据的可用性和持久性。

如果您在本地部署中使用 Redis Enterprise 软件,您可以从这里下载包含漏洞修复的最新 Redis Enterprise 版本。

最后但并非最不重要的是,请确保您的 Redis Enterprise 数据库通过密码和访问控制和身份验证机制得到保护。 

如果我是一个 Redis 开源用户,我应该怎么办?

我们建议开源用户首先确保任何 Redis 实例都没有不受限制地开放到互联网,然后升级到最新版本的 Redis(在撰写本文时,为 3.2.12、4.0.10 或 5.0-rc2),这些版本可以在redis.io 下载页面上找到。