Joomla 安全打击小组希望分享有关在 Joomla 3.8.8 中修复的会话删除竞争条件漏洞的更多详细信息。
简介
JSST 已获悉关于后端“随机注销失败”的偶尔问题。JSST 进行了一项调查并确认了它。问题在于找到合适的补丁,但让我们从头开始。
从用户的角度来看的问题
当用户登录后端并立即注销时,可能会发生在某些非常罕见的情况下,用户的会话在几秒钟后再次变得活跃。这意味着,即使登录屏幕正确显示,向用户提供“一切正常”的有力视觉反馈,简单的页面刷新就足以再次登录用户。
从技术上讲,用户的会话在销毁后不久会像僵尸一样复活。从用户的角度来看,就像注销从未发生过一样。
幕后发生了什么
此时幕后发生了什么?
此时您需要了解两件事
- 在后端控制面板上,有两个关于扩展和 Joomla 更新的 AJAX 检查
- 这两个 AJAX 请求使用您的会话运行,并在完成之后将会话数据写回会话处理程序。
那么这里发生了什么?
当您登录后端时,会使用您的会话信息启动多个 AJAX 请求。当您注销站点时,Joomla 会重置给定会话 ID 的会话数据,注销用户,然后将其重定向到请求新会话的登录表单。
注销时,如果某些 AJAX 请求仍在活动(例如核心和扩展更新的检查),则 Cookie 未正确销毁,浏览器会保留会话 ID,并且 Joomla 会使用与之前相同的会话信息创建新的会话。
当 AJAX 进程在您注销后结束时,这些进程会将其会话数据写入回会话数据存储中,覆盖您在访问登录页面时刚刚创建的空数据集。当用户刷新页面时,他们会再次登录。
在正常情况下,AJAX 请求只需几秒钟即可完成并向您显示结果,但是,根据网络连接,它们可能需要更长时间并产生此类问题。
以下插图应该使您更清楚地了解正在发生的事情
现实世界中的场景
好吧,这如何成为安全问题?
考虑一下您用来登录 Joomla 网站并编辑文章的公共(或其他人的)计算机。完成后,您返回控制面板然后注销,这将带您回到 Joomla 网站的登录屏幕。现在可能发生的是,您离开该地方,而其他人来到机器上,在浏览器中点击刷新并使用您的权限登录到您的后端。因此,他们获得了对您网站的未经授权的访问权限,并且可以执行您在网站上可以执行的任何操作。
我们的解决方案
我们的解决方案基本上是确保当您注销时,不仅会话从存储引擎中删除,而且浏览器会话 Cookie 也被清除。
竞争条件仍然存在,但是这种方法使其几乎无害,因为潜在的活动会话现在无法再访问,因为使用该会话所需的有关会话 ID 的知识已丢失。
对某些会话处理程序的影响
这里我们有两种可能的情况
- 情况 A:处理程序区分“更新”和“添加”任务
某些处理程序(数据库、memcache(d)、redis 和 wincache)有专门的命令来添加新的或更新现有的会话。在这种情况下,长时间运行的 AJAX 进程将尝试**更新**用户会话,这将失败,因为相关会话已在注销时被删除。 - 情况 B:处理程序不区分
其他处理程序盲目地创建或覆盖会话(XCache、APC(u))。在这种情况下,它们将创建一个包含“注销前”数据副本的孤立会话,没有人会使用它,并且很快就会过期。
我们必须强调,在第二种情况下,尽管注销实际上有效并阻止了其他人使用相同的浏览器重新登录,但用户认为他们的会话已被销毁,但服务器上可能仍然存在影子会话。
这**不会**使用户面临比常规后端活动更大的风险,因为需要有关会话 ID 的知识才能使用影子会话。