MariaDB Dump 文件兼容性变更

MariaDB 和 MySQL 都已经存在很长时间了,在维护兼容性的同时解决出现的安全问题,这之间总是存在难以平衡的关系。在 MariaDB 最新的错误修复版本中,我们不得不稍微打破兼容性以提高安全性,但也有一些变通方法。我们认为应该解释一下背后的原因,以及如何让您尽可能轻松地应对。
问题所在
我们正在解决的问题(由于各种原因,我们必须非常迅速地处理)是,可以生成恶意的 MariaDB dump 文件,这些文件可能从 MariaDB 客户端执行 shell 命令。防止这项工作详细记录在 MDEV-21178 中,它本质上归结为一个新的“沙盒模式”,该模式用于在 MariaDB 客户端中禁用系统命令。
MariaDB 客户端现在有一个选项 --sandbox
或 MariaDB 客户端提示符命令 \-
。这会在会话的其余时间启用沙盒模式,直到断开连接。进入沙盒模式后,任何可能在 shell 上执行操作的命令都会被禁用。
问题的第二部分是对 mariadb-dump
的一个小补丁,该补丁在 dump 文件最顶部(以注释形式)添加一个命令,以触发沙盒模式。它看起来像这样:
/*!999999\- enable the sandbox mode */
MariaDB 和 MySQL 客户端会将此行精简为反斜杠和短划线,然后尝试执行带短划线的内部命令。问题就出在这里。
较旧版本的 MariaDB 客户端和所有版本的 MySQL 客户端都不理解此命令,它们会因此报错。兼容性问题就出在这里。
如果您从新的 MariaDB 客户端版本导入 dump 文件到尚未应用此修复的版本(所有受支持版本的最新版本都将获得此修复),或导入到任何版本的 MySQL,该行都会报错。其他导入到 MariaDB Server 的方法,例如使用编程语言的数据库连接器,将没有问题。
受影响的版本
此更改正在发生或已经发生在 MariaDB 10.5.25, 10.6.18, 10.11.8, 11.0.6, 11.1.5, 11.2.4 和 11.4.2 版本中。因此,如果您从这些版本中导出 dump 文件并尝试将其导入到不受支持的版本(例如 10.4)或较旧的错误修复版本(例如 10.5.24),您就会遇到此问题。
变通方法
幸运的是,您有很多方法可以避免此问题,特别是如果您希望从 MariaDB 导出并导入到较旧版本或 MySQL 中。它们是:
- 推荐:使用已应用此更改的 MariaDB Server 版本的安全客户端导入 dump 文件。
- 使用较旧的(不安全的)mariadb-dump 版本进行备份。
- 在备份时使用类似
mariadb-dump|tail +2
的命令移除该行。 - 在导入时使用类似
tail +2|mariadb
的命令移除该行。
通过这些信息,如果您遇到此问题,应该能够找到适合您环境的解决方案。
特色图片:由 Twm 提供的 compatibility,使用 CC BY-NC-ND 许可证。
您也可以在导入之前,对 dump 文件运行
sed -i ‘1{/999999.*sandbox/d}’ dump.sql
命令。感谢这篇文章。在导入时从 dump 文件中移除启用沙盒模式命令的变通方法对我有效,我使用了在管道之间插入的 tail 命令,并修改了 tail 的语法。
gunzip -c | tail -n +2 | mariadb
谢谢!!
我按照您写的,将 tail 命令添加到了 dump.sh 文件中。
问题解决了!!
破坏任何形式的跨兼容性到底是如何“修复”问题的?恶意用户只会不在他们的 dump 文件中包含 \-,或者会将其移除。我完全不明白为什么给每个非恶意 dump 文件添加一个命令除了破坏东西还能起到什么作用。
你好 No,
这只是修复的一部分。还有一个命令和参数可以无论该标志是否存在都启用沙盒模式。所以,如果您担心,可以通过那种方式强制启用它。您也可以使用不解析这些命令的其他客户端。
此修复是由于上游安全公告引起的,而上游并未妥善修复。一如既往,如果您不喜欢这个修复,欢迎贡献改进方案。
关于兼容性问题,后续将会有一个不会破坏兼容性的相同行为的更新。