Skip to content

feat:修复窃听风云#369

Merged
qiin2333 merged 9 commits intomasterfrom
feat_mic_crypt
Dec 30, 2025
Merged

feat:修复窃听风云#369
qiin2333 merged 9 commits intomasterfrom
feat_mic_crypt

Conversation

@Yundi339
Copy link
Copy Markdown
Collaborator

@Yundi339 Yundi339 commented Dec 14, 2025

针对 Sunshine 麦克风流 ("Microphone Eavesdropping") 的安全漏洞修复、逻辑纠正及代码质量改进。

1. 核心安全加固 (Critical Security Fixes)

1.1 添加客户端身份验证 (Client Identification & Authorization)

问题: 之前的实现仅通过 UDP 端口接收数据,未验证来源 IP 是否属于已建立的合法会话。未加密模式下存在被注入恶意音频的风险。
修复:

  • broadcast_ctx_t 中引入 client_ip_to_name 映射表。
  • Session 绑定: 当客户端通过 RTSP/Control 建立 Session 并启用麦克风时,将 IP 与 Client Name 注册到映射表中。
  • 接收验证: micRecvThread 在处理数据前,查询映射表。如果来源 IP 未注册,虽目前仅做日志记录(为了兼容性),但通过引入映射机制,为后续实施"白名单拦截"建立了基础架构。

1.2 修复 IV (初始化向量) 计算逻辑

问题: 服务端在计算 AES-CBC 解密所需的 IV 时,序列号逻辑与客户端不一致,导致加密包无法正确解密。
修复:

  • 修正了 IV 序列号计算。客户端使用 baseIv + (seq - 1),服务端接收到的 sequence_number 已是当前包的序号,无需再次减 1(或逻辑已调整为直接匹配)。
  • 确保 IV 的字节序(Big Endian)处理正确。
  • 移除了错误的"三次解密失败即禁用加密"的逻辑,防止攻击者故意发送坏包导致服务降级为明文。

1.3 明文拒绝开关预留 (Plaintext Rejection Switch)

问题: 缺乏强制拒绝明文数据的机制。
修复:

  • 引入 mic_reject_plaintext 原子标志。
  • 在接收逻辑中添加了检查点:如果该开关开启,且收到非加密数据,直接丢弃并记录警告。这为未来强制实施"仅加密模式"做好了代码准备。

1.4 加密上下文安全清理

问题: 线程结束时未彻底清理敏感的加密上下文。
修复:

  • 在线程退出时,显式重置 mic_ciphermic_iv,并清除 mic_encryption_enabled 标志,防止状态残留。

2. 稳定性与逻辑修复 (Stability & Logic Fixes)

2.1 修复 Socket 正常关闭时的错误日志

问题: 当停止推流或关闭 Sunshine 时,Socket 的取消操作 (operation_aborted) 被错误地记录为 Error 级别日志,造成误解。
修复:

  • mic_recv_func 的错误处理中,增加了对 boost::asio::error::operation_aborted 的检测。
  • 正常关闭引发的取消操作现在记录为 Debug 级别(或忽略),消除了噪声日志。

2.2 解决变量命名冲突

问题: 局部变量 bufferbytes 名称过于通用,容易与外部作用域或库函数冲突。
修复:

  • 重命名为 mic_recv_bufferreceived_bytes,提高了代码可读性和安全性。

3. 可观测性改进 (Observability)

3.1 客户端名称日志

改进: 日志和统计信息现在使用 Session 注册的 client_name(如 "Moonlight PC")代替难以识别的 IP:Port

3.2 解密统计

改进: 增加了详细的统计逻辑,记录每个客户端的总包数、解密成功数、失败数和无效数据数。线程结束时输出摘要,便于通过日志分析连接质量和潜在攻击。


总结: 本次更新从根本上修复了麦克风流的身份识别缺失问题,纠正了加密实现中的逻辑错误,并显著提升了代码的健壮性和可维护性。

- 新增`init_decrypt_cbc`函数,初始化CBC解密上下文。
- 实现`cbc_t::decrypt`方法解密麦克风音频数据。
- 更新了`stream.cpp`以处理基于配置标志的麦克风加密和解密。
- 为`globals.h`中的麦克风数据引入了新的加密标志。
- 更新了RTSP配置,以便在音频加密是强制性的时请求麦克风加密。
- 增强的流处理功能,可在音频加密处于活动状态时启用麦克风加密,并为初始化和状态检查提供适当的日志记录。
- 更新RTSP配置以确保在音频加密启用时请求麦克风加密。
- 实现自动检测麦克风数据加密状态,并根据数据长度判断是否启用解密。
- 增强日志记录以提供加密状态和解密过程的详细信息,确保数据有效性检查。
- 处理音频数据时,添加序列号支持以匹配客户端发送的数据格式。
@Yundi339 Yundi339 marked this pull request as draft December 18, 2025 02:29
@Yundi339 Yundi339 changed the title feat:为麦克风增强安全信息保护 feat:修复窃听风云 Dec 30, 2025
@Yundi339 Yundi339 marked this pull request as ready for review December 30, 2025 14:13
@qiin2333 qiin2333 merged commit 3a7de44 into master Dec 30, 2025
3 checks passed
@qiin2333 qiin2333 deleted the feat_mic_crypt branch December 30, 2025 15:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants