白帽故事 · 2026年1月31日

【CVE-2025-40551】:Solarwinds Web Help Desk又一处反序列化漏洞

Horizon3.ai 研究团队在 SolarWinds Web Help Desk (WHD) 中发现了一系列安全问题。这些问题包括:

  • 一个通过反序列化实现的无需身份验证的远程代码执行漏洞
  • 一组允许有限访问已认证功能的静态凭证
  • 一个针对受保护站点操作相关的安全保护绕过

这些漏洞易于利用,可使未经身份验证的攻击者在易受攻击的 SolarWinds Web Help Desk 实例上实现远程代码执行。SolarWinds 已声明这些问题在 Web Help Desk 2026.1 版本中已修复,我们鼓励所有用户尽快升级。

背景

SolarWinds Web Help Desk (WHD) 是一款服务台和 IT 服务管理平台,为支持团队提供工单、资产跟踪、服务水平协议管理和工作流自动化服务。其主要目的是集中和简化 IT 支持运维,被广泛部署于各种规模的组织中。

早在 2024 年 8 月,SolarWinds 就为 WHD 发布了一份安全公告,以解决 CVE-2024-28986。该漏洞源于 AjaxProxy 功能的反序列化问题,可能导致远程代码执行。几天之内,该漏洞就被添加到了 CISA 的已知被利用漏洞目录中。

几个月后,另一份公告 (CVE-2024-28988) 发布,称在之前的补丁中发现了绕过方法。随后,在 2025 年 9 月,又一份公告 (CVE-2025-26399) 发布,以涵盖另一个发现的补丁绕过。

时至今日,另一份公告已发布,以涵盖最新的绕过。

图示:一连串的补丁和绕过

嵌套梗:我们听说你喜欢补丁绕过,所以我们又在绕过上设置了绕过…

以下部分详细介绍了最新问题的完整利用链,描述了潜在的入侵迹象,并详述了披露时间线。

安全问题详情

静态凭证 (CVE-2025-40537)

当 WHD 首次初始化时,会创建一个用于演示目的的客户账户。此账户的用户名是 client,默认密码是 client

图片:显示静态凭证的配置对话框

尽管在某些生产环境中,此账户的访问权限看似有限,但研究团队遇到过该账户仍与默认的技术人员账户关联的情况。这允许任何使用此 “client” 用户账户登录的人切换到管理员账户。

安全保护绕过 (CVE-2025-40536)

WHD 包含一些请求过滤器,与其他 Java Web 应用程序类似,设计用于处理诸如验证认证头部、路由静态资源的请求、处理跨站请求伪造检查等安全功能。WHD 中实现的 CSRF 检查恰好包含了一些额外的功能。

当过滤发往 WebObjects (通过请求路径中的 “wo”) 的请求时,会调用 checkCsrfTokenWo() 函数。该函数不仅验证 CSRF 令牌的有效性,还根据白名单验证请求的查询参数。

图片:checkCsrfTokenWo 函数代码片段,显示参数白名单检查

上述白名单功能可以通过包含一个值为 “/ajax/” 的虚假 URI 参数来绕过。这允许访问某些受限制的功能。例如,“wopage” 参数可以用于直接加载 WebObject 组件页面。

为什么这一点很重要?这与 WHD 在后台的工作方式有关。WHD 使用 Java WebObjects,这是一个较旧且在某种程度上仍然常见的 Java Web 应用程序框架。在不深入探讨 WebObjects 框架本身细节的前提下,就利用本文讨论的漏洞而言,研究人员最关心的主要特性包括:

  • 任何给定网页上看到的内容都是一个组件或组件的一部分。
  • 组件只在有效会话创建并调用它们时才会被创建和访问。
  • 几乎所有内容在某种程度上都是有状态的。

通常情况下,当用户访问登录页面时,系统会为他们创建一个会话,其中只实例化了与登录页面本身相关的那些组件。当前组件会以一串数字和句点的形式出现在 URL 中(例如 “helpdesk/WebObjects/Helpdesk.woa/wo/6.7”)。一旦用户登录,其他组件将被创建,它们的标识符作为 “嵌套” 在当前会话中被附加到 URL(例如 “helpdesk/WebObjects/Helpdesk.woa/wo/6.7.43.0.0.0.2.1.1.0.1.4.17.5.0.1”)。这使得任何特定的 URL 都基于当前会话创建的组件而变得具有某种唯一性和动态性。

简而言之,这意味着要访问任何特定的组件,您首先需要知道需要访问的所有前置组件,以便目标组件被实例化。

事实证明,此漏洞允许访问的一些受限制的查询参数帮助研究团队简化了这个过程。特别是前面提到的 “wopage” 参数,它恰好可以根据组件名称动态地创建 WebObject 组件。

例如,在建立有效会话后(只需访问登录页面即可),未经身份验证的用户可以向以下端点提交 GET 请求:

/helpdesk/WebObjects/Helpdesk.woa/wo/test.wo/<wosid>/1.0?badparam=/ajax/&wopage=LoginPref

这足以在服务端创建一个 LoginPref WebObject 组件,该组件恰好会创建一个有效的 AjaxProxy 实例,这引出了下一个问题。

Java 反序列化 (CVE-2025-40551)

WHD 具有允许用户为各种功能上传文件的功能——UI 定制、工单附件等。这就是最初公告中提到的 AjaxProxy 的用武之地。查看 AjaxProxy 代码可以明显看出“反序列化”问题是什么。

图片:AjaxProxy 代码片段,显示 jabsorb 库调用

由此可以看出,在处理发往使用此功能的组件的请求时,会使用 jabsorb 库(一个轻量级 JSON-RPC 库)动态加载和执行各种组件操作,这些操作只是为组件类定义的不同方法。jabsorb 众所周知在不被适当限制的情况下存在多种代码执行问题,并且有许多公开可用的攻击链 (gadgets)。那么,研究人员如何能够访问到这个功能呢?

幸运的是,WebObject 组件的所有定义都在 Java 资源文件的某处。

图片:AjaxFlexibleFileUpload 组件引用

AjaxFlexibleFileUpload 组件似乎使用了 AjaxProxy,那么研究人员如何访问它呢?事实证明,LookAndFeelPref 组件和 LoginPref 组件都使用了它,这两个组件似乎是前述 “wopage” 查询参数可以直接访问的命名页面。

图片:显示 LookAndFeelPref 使用 Ajax 的代码
图片:显示 LoginPref 使用 Ajax 的代码

既然知道了如何访问此功能,研究人员尝试看看能否绕过任何限制。在之前修复此问题的尝试中,似乎添加了一个例程来对发往 JSONRPC 桥 (AjaxProxy) 的请求的 “params” 和 “fixups” 字段进行净化。

图片:sanitizeRequestJson 函数代码
图片:包含多个净化步骤的代码片段

此净化函数通过检查 URI 是否包含 “ajax” 来确定请求是否发往 AjaxProxy,但这并不充分。用于 ajax 组件的请求处理器与典型的 Web 对象请求处理器几乎相同,因此只需将请求 URI 从 “ajax” 更改为 “wo” 就足以绕过这个新的净化例程。

例如,发往 “/helpdesk/WebObjects/Helpdesk.woa/ajax/5.0.7.1.7.0.9.1.1” 的请求将会被移除 json 字段中的 “params” 和 “fixups”。将 URI 更改为 “/helpdesk/WebObjects/Helpdesk.woa/wo/5.0.7.1.7.0.9.1.1” 可实现相同的功能并绕过净化例程。

此外,现有的 checkSuspeciousPayload()(原文拼写错误)函数中使用的黑名单可以通过 isWhitelisted() 函数绕过。

图片:checkSuspeciousPayload 函数代码
图片:isWhitelisted 函数代码

通过在 json 有效载荷的早期包含每个白名单术语,请求可以完全绕过黑名单,从而允许与先前关于 AjaxProxy 功能的 CVE 相同的远程代码执行潜力。示例请求如下:

图片:恶意 JSON 请求载荷示例

虽然较新版本的 WHD 不包含之前包含导致 RCE 的攻击链的 C3P0 库,但类路径上存在其他可能允许攻击者执行恶意操作的类,例如伪造会话,甚至继续实现未经身份验证的 RCE。

组合利用链

端到端来看,为了将这些问题链接起来以实现 RCE,攻击者需要执行以下步骤:

  1. 建立有效的会话并提取关键值
  2. 创建一个 LoginPref 组件
  3. 设置 LoginPref 组件的状态以允许访问文件上传功能
  4. 使用 JSONRPC 桥在后台创建一些恶意的 Java 对象
  5. 触发这些恶意 Java 对象

图片:概括利用步骤的流程图

虽然研究人员有意省略了实现“即插即用”式 RCE 所需的一些细节,但以下 Nuclei 模板足以显示来自 WHD 主机的 JNDI 查找尝试。

(模板代码略)

入侵迹象

WHD 日志文件可在 <安装目录>/log/ 中找到(除非另有配置)。

要检查对默认 client 账户 (CVE-2025-40537) 的访问,whd-session 日志应包含类似以下条目:

INFO sessionLogger - eventType=[login], accountType=[client], username=[client], sessionID=[redacted], allActiveSessionCount=[1]

要检查对 JSONRPC 端点的攻击尝试,审计 whd 日志中关于 JSONRPC 错误或白名单载荷的记录是恶意活动的指标。

ERROR org.jabsorb.JSONRPCBridge - exception occured

以及

INFO whd.helpdesk.com.macsdesign.util - Whitelisted payload with matched keyword: java.. Payload= { "bypass":"java.parentpopupwonoselectionstringdummymdssubmitlinkmdsform__enterkeypressedmdsform__shiftkeypressedmdsform__altkeypressed_csrf", "id":1, "method":"wopage.variablevalueforname", "params":["malicious"] }

WHD 访问日志文件位于 <安装目录/logs/>(除非另有配置)。要检查对受限功能的访问尝试,目标为 “/Helpdesk.woa/wo/*” 且参数不属于以下白名单的请求是一个很好的起点。虽然其中一些参数确实在某些情况下被使用,但来自未知或意外 IP 地址的访问很可能表明潜在的恶意活动。此外,包含字符串 “/ajax/” 的请求参数(这可能表示白名单绕过尝试)对于此应用程序来说也有些不寻常。

(白名单参数列表略)

修复措施

这些问题已按照 Horizon3.ai 的漏洞披露政策进行了披露。更多信息,请参阅 SolarWinds 的安全公告。SolarWinds 已声明这些问题在 Web Help Desk 版本 2026.1 中已得到缓解。

NodeZero 平台已提供针对这些问题的检测。要了解 NodeZero 平台如何帮助您发现和修复环境中的此类关键漏洞,请访问 NodeZero 平台页面或通过申请演示与专家交流。

披露时间线

  • 2025年12月5日 – Horizon3.ai 向 SolarWinds PSIRT 披露
  • 2025年12月5日 – SolarWinds PSIRT 发送自动确认。
  • 2025年12月5日 – SolarWinds PSIRT 发送正式确认并要求更多信息。
  • 2025年12月5日 – Horizon3.ai 提供所要求的信息。
  • 2025年12月5日 – SolarWinds PSIRT 确认收到。
  • 2025年12月12日 – SolarWinds PSIRT 确认报告有效性并提供事件单号以便进一步沟通。
  • 2026年1月7日 – Horizon3.ai 请求状态更新。SolarWinds 提供状态更新。
  • 2026年1月21日 – SolarWinds PSIRT 提供状态更新并提供预览版本。Horizon3.ai 确认。
  • 2026年1月26日 – Horizon3.ai 确认收到预览版本并提供反馈。
  • 2026年1月27日 – Horizon3.ai 请求协调发布的日期。
  • 2026年1月28日 – SolarWinds PSIRT 发布补丁。