• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Timk
V2EX  ›  程序员

[缺陷] BaiduNetdisk.exe 句柄泄漏, 8.8.3.101 最新版仍复现(已定位 YunLogic.dll)

  •  
  •   Timk · 2 days ago · 2110 views

    长话短说:百度网盘主进程 BaiduNetdisk.exe 有个句柄泄漏,以约 6 个/分钟的恒定速率泄漏 Process 类型句柄且从不释放。已逆向定位到具体模块和函数,三个版本(含当前最新的 8.8.3.101 )全部复现。

    现象

    项目 实测
    泄漏对象 Process 类型句柄,全部指向同一个 BaiduNetdiskUnite.exe 子进程
    速率 约 6 个/分钟 = 360/小时 ≈ 8600/天,恒定,从不回落
    累积 连续运行 96.7 小时累积 37021 个,占全系统句柄总数 16.2%
    后果 句柄表膨胀导致整机明显卡顿;结束该进程后立即恢复,一次性释放 61726 个

    自己验证(约 10 分钟)

    1. 启动百度网盘并登录,保持待机(不需要任何上传/下载任务
    2. 用微软官方 Sysinternals 的 handle64.exe(免安装,live.sysinternals.com 可取)
    3. 管理员命令行执行,记下 Process 那行的数字:
    handle64.exe -accepteula -s -p <BaiduNetdisk.exe 的 PID>
    

    隔 5 分钟再跑一次,会涨约 30 。

    1. 再看这些句柄指向谁:
    handle64.exe -accepteula -a -p <PID> | findstr Process
    

    结果全部是同一个 BaiduNetdiskUnite.exe(某个 PID)

    已定位到代码

    • 模块:YunLogic.dll
    • 最新版 8.8.3.101:函数 RVA 0xE6950 - 0xE6CF8
    • OpenProcess 调用点 RVA 0xE69AA,期望访问权限 SYNCHRONIZE (0x00100000)
    • 该函数唯一调用者 RVA 0xE9B10 - 0xE9BEE这条调用链内 CloseHandle 出现 0 次

    即:句柄被打开后,链路上没有任何关闭路径。请求的权限只有 SYNCHRONIZE 这一位,也印证了用途 —— 典型是"等这个进程退出"的存活判定循环。

    版本

    版本 Process 句柄速率
    8.5.5.103 +6.1 /分钟
    8.6.0.102 +6.3 /分钟
    8.8.3.101 (当前最新) +6.06 /分钟

    三个版本速率完全一致,升级无用

    为什么容易被漏掉

    这不是崩溃类问题 —— 进程全程正常运行、不产生 dump ,所以不会进任何崩溃统计,也容易被"请提供日志 / 请提供 dmp"挡回去。实际影响集中在 7×24 运行的机器(云桌面、NAS 、挂机),按 8600/天算一周累积约 6 万句柄。

    顺带一提

    已通过官方渠道提交过工单,也在客户端内置反馈里提了。发在这里是希望研发能看到 —— 模块名和函数地址都给了,有 PDB 的话应该几分钟就能定位。

    临时办法:重启百度网盘即可清空已泄漏句柄,一天一次基本无感。

    Supplement 1  ·  10h 4m ago

    Snipaste 2026 09 16 16 17 52 截止到目前为止 百度方没有任何回应

    Supplement 2  ·  7h 16m ago
    第 2 条附言:
    今日下午约 15:30 左右有百度官方人员电话联系我 告知 BUG 已修复
    8.8.6.102 ( 2026-09-18 更新)为上面定位的那个调用点补上了
    缺失的 CloseHandle 。复测证据见下方回复。
    16 replies    2026-09-18 15:44:00 +08:00
    a1428265354
        1
    a1428265354  
       2 days ago   ❤️ 1
    没人管 之前有人百度网盘 挖到可以提权 system 的都不管了
    woodfizky
        2
    woodfizky  
       2 days ago
    傻逼百度网盘,挡不住用的人多,感觉像网盘界的微信,嫌弃但是又扔不掉。
    jasonyang9
        3
    jasonyang9  
       2 days ago via Android
    @woodfizky 容器里跑个 openlist 得了
    413420
        4
    413420  
       2 days ago via iPhone
    百度什么时候能做个人
    BifrostNetwork
        5
    BifrostNetwork  
    PRO
       2 days ago
    卡卡的
    PrinceofInj
        6
    PrinceofInj  
       2 days ago via Android
    @woodfizky 能扔掉的,我遇到发百度盘的要么不下载,要么让别人换个方式发我。已经好多年不用百度盘了。
    neetz
        7
    neetz  
       2 days ago via iPhone
    用 clouddrive2 吧,支持挂载百度网盘的
    yyyyyyyhb
        8
    yyyyyyyhb  
       2 days ago
    还有内存泄露的 bug ,他们早就知道了,没人管
    belike ,“重启一下就好了”⬅️之前问内部人员的回复
    malusama
        9
    malusama  
       2 days ago
    百度的产品好像都没人管了。。
    idealhs
        10
    idealhs  
       2 days ago
    垃圾产品最好还是尽量远离
    googlefans
        11
    googlefans  
       2 days ago
    这个产品在黄了就真黄了
    这个产品用的人很多的
    yafoo
        12
    yafoo  
       1 day ago via Android
    阿里云盘也一样,啥都没做,占 cpu ,卸载就好了
    sir283
        13
    sir283  
       1 day ago via Android
    我都在手机上下载好,然后复制到电脑里,虽然麻烦,但是没办法
    yulon
        14
    yulon  
       1 day ago
    还好我沙盒里跑的。之前夸克不会有后台还不错,自从变成划词也被我塞进沙盒了。
    catazshadow
        15
    catazshadow  
       1 day ago via Android
    国产软件都只配在虚拟机里跑
    Timk
        16
    Timk  
    OP
       7h 15m ago
    复测结果:8.8.6.102 已修复。

    [动态]
    修复前 8.8.3.101 运行 77 分钟后 Process 句柄 ≈ 475 ,总句柄 ≈ 1310
    修复后 8.8.6.102 运行 77 分钟后 Process 句柄 = 18 ,总句柄 = 851

    18 个是稳定值( 15 个指向自身、3 个指向 BrowserEngine 子进程),不再随时间增长。

    [静态,字节级]
    YunLogic.dll 里那个 OpenProcess(SYNCHRONIZE) 调用点还在原地( RVA 0xE69AA ),
    但它所在的函数恰好长了 9 字节:

    0xE6950-0xE6CF8 -> 0xE6950-0xE6D01

    该函数内 CloseHandle 调用数:0 -> 1

    反汇编 call [OpenProcess] 之后的指令:

    RVA 0xE69AA FF 15 88 8A 10 00 call [OpenProcess]
    RVA 0xE69B0 48 85 C0 test rax, rax
    RVA 0xE69B3 74 E1 jz <失败则重试>
    RVA 0xE69B5 48 8B C8 mov rcx, rax <- 新增 3 字节
    RVA 0xE69B8 FF 15 E2 88 10 00 call [CloseHandle] <- 新增 6 字节
    RVA 0xE69BE 33 DB xor ebx, ebx

    3 + 6 = 9 字节,和函数增长量对得上。

    原来的逻辑:OpenProcess 拿到句柄、test/jz 判空,然后用完就扔,没关。
    现在补上了 mov rcx, rax / call [CloseHandle]。

    那个 jz 往回跳 -0x1F 是个重试循环(目标进程没起来就重试),
    所以每成功一次就漏一个句柄,6 次/分钟就是这么来的。

    [时间线]
    8.5.5.103 / 8.6.0.102 / 8.8.3.101 三个版本都漏; 9/16 更新到 8.8.3.101 时复测
    仍是 +6.06/分钟。9/18 更新到 8.8.6.102 才修掉。
    (只是陈述时间,不确定是否有关联。)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2827 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 14:59 · PVG 22:59 · LAX 07:59 · JFK 10:59
    ♥ Do have faith in what you're doing.