2021-12安全发布/常见问题解答
MediaWiki中发现了一系列漏洞。这些漏洞导致攻击者可以通过私人wiki泄露页面内容并绕过编辑权限。
此次wiki泄漏的主要载体是在$wgWhitelistRead
中列出的页面上使用易受攻击的操作,因此可被公开访问。
默认情况下,MediaWiki现在仅在$wgWhitelistRead
中的页面上公开“查看”的操作权限。
这些问题在1.35.5、1.36.3和1.37.1版本中得到修复,压缩包和补丁的链接请参阅公告。
有哪些问题?
- CVE-2021-44858: “撤消”功能 (
action=edit&undo=##&undoafter=###
) 允许攻击者查看任意版本的修订内容,无论他们是否有权限这样做。在mcrundo和mcrrestore的操作(action=mcrundo
和action=mcrrestore
)中也发现了这一点。 - CVE-2021-45038:“回退”功能(
action=rollback
)能通过传递一个特殊构建的参数,使攻击者能够查看任意页面的内容,无论他们是否是否有权限这样做。 - CVE-2021-44857:“mcrundo”和“mcrrestore”功能(
action=mcrundo
、action=mcrrestore
)没有正确检查编辑权限,允许攻击者获得任意版本的页面内容并保存到他们制定的页面中。这将会影响到公共wiki站点和私有wiki站点的公共页面。
我没时间打补丁,我如何去禁止这些功能?
把这些添加到您的LocalSettings.php:
$wgActions['mcrundo'] = false;
$wgActions['mcrrestore'] = false;
如果您的wiki站点是私用的(需要登录才能查看页面),您也需要设置以下配置:
$wgWhitelistRead = [];
$wgWhitelistReadRegexp = [];
它应该完全禁用易受攻击的代码。这些更改也适用于没有可用补丁而易受攻击的已结束技术支持的MediaWiki版本。
如果您使用 $wgWhitelistRead
允许注销的用户查看带有帮助文本的主页,请将这些信息迁移到MediaWiki:Loginreqpagetext中,这个消息页面会展示“需要登录”的错误信息。
我受到影响了吗?
- 如果您的wiki站点是公用的(任何人都能查看任何页面):是
- 如果您的wiki站点是私有的,而且在
$wgWhitelistRead
和$wgWhitelistReadRegexp
设置有页面:是
如果您使用了Lockdown 或者Whitelist Pages 类似的扩展来限制一些用户不能读取一些页面,这可能也会受影响。
哪些版本易受攻击?
自1.23.0版至1.34.x版的所有MediaWiki版本,以及修复前的1.35.x、1.36.x、1.37.x(參见顶部部分),都存在私有wiki阅读权限绕过的漏洞(CVE-2021-44858,CVE-2021-45038)。
自1.32.0版至1.34.x版,以及修复前的1.35.x版、1.36.x版、1.37.x版的所有MediaWiki版本(參见顶部部分),都存在编辑权限绕过的问题(CVE-2021-44857)。
此问题是如何解决的?如何保证不会复发?
除了“查看”之外的所有操作现在都需要明确的“阅读”用户权限。 这类似于 Action 和 REST API 中使用的权限检查。如果在这些操作中发现更多漏洞,它们至少不会被私有wiki站点上的登出用户利用。
$wgWhitelistRead
设置的页面可用的操作能被新的Action::needsReadRight()
方法所覆盖。
如何查看是否有人在我的wiki站点上利用了它?
检查访问日志有没出现 action=mcrundo
、action=mcrrestore
,除非您启用了multi-content revisions的插件,否则这些参数是没用的。
此外,检查action=edit&undo=###&undoafter=###
的请求,检查里面的版本ID对应的来源页面和被编辑页面是不是相同。
对于“回退”功能缺陷,检查action=rollback&from=...
请求,from
参数的内容是不是一个模板嵌入的wikicode(例如:from={{:private page}}
)。
这些错误不会导致任何数据丢失,因此攻击者可能采取的任何写入操作都将像所有其他编辑一样,记录在页面历史记录中。
鸣谢
该问题由Dylsss发现,非常感谢他识别并报告问题。 如果您发现MediaWiki的程序缺陷,请查看报告安全缺陷的处理流程。