ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

飞桨安全公告 PDSA-2022-002 深度解读:`paddle.audio.functional.get_window` 代码注入漏洞(CVE-2022-46742)

2026/9/13 6:11:08 拓冰建站 浏览量
飞桨安全公告 PDSA-2022-002 深度解读:`paddle.audio.functional.get_window` 代码注入漏洞(CVE-2022-46742) 飞桨安全公告 PDSA-2022-002 深度解读paddle.audio.functional.get_window代码注入漏洞CVE-2022-46742【免费下载链接】PaddlePArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice 『飞桨』核心框架深度学习机器学习高性能单机、分布式训练和跨平台部署项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle本篇技术文章以飞桨PaddlePaddle官方安全公告 pdsa-2022-002_cn.md 为核心深入剖析 CVE-2022-46742 这一高危代码注入漏洞的成因、利用方式与官方修复方案。通过结合当前仓库中get_window的完整实现与测试用例读者可以理解在深度学习框架 API 中滥用eval处理用户输入为何会导致任意代码执行掌握修复后的安全实现模式并学会自查与升级到安全版本的方法。漏洞概览CVE 编号、影响范围与受影响版本根据飞桨安全公告 pdsa-2022-002_cn.md本漏洞的基本信息如下项目内容公告编号PDSA-2022-002CVE 编号CVE-2022-46742漏洞类型代码注入Code injection受影响接口paddle.audio.functional.get_window受影响版本2.4.0-rc0根据 security/README_cn.md 中的安全公告汇总表标注为 2.4.0-rc0修复版本飞桨 2.4 正式版本官方补丁 commit26c419ca386aeae3c461faf2b828d00b48e908eb漏洞发现者Tong Liu上海科技大学 / ShanghaiTech University该漏洞属于典型的任意代码执行Arbitrary Code Execution类安全问题攻击者若能向get_window接口传入精心构造的window参数即可在运行飞桨的进程中执行任意 Python 代码进而可能窃取数据、篡改模型或完全控制宿主环境。受影响 API 的功能定位get_window是做什么的get_window是飞桨音频paddle.audio子模块中用于生成窗函数window function的核心工具函数其职责与 SciPy 的scipy.signal.get_window对齐。在信号处理与语音任务中窗函数被广泛应用于短时傅里叶变换STFT、滤波器设计、频谱分析等场景用于抑制截断效应频谱泄漏。在当前仓库中该函数定义于 python/paddle/audio/functional/window.py并经由 python/paddle/audio/functional/init.py 导出为paddle.audio.functional.get_window。其公开签名修复后的当前版本为def get_window( window: _WindowLiteral | tuple[_WindowLiteral, float], win_length: int, fftbins: bool True, dtype: str | None float64, ) - Tensor:参数说明window窗函数类型既可以是字符串如hamming、hann、bartlett也可以是「类型名 参数」的元组如(gaussian, 7)、(kaiser, 14.0)、(exponential, None, 1)。支持的窗函数包括hamming、hann、gaussian、general_gaussian、exponential、triang、bohman、blackman、cosine、tukey、taylor、bartlett、kaiser、nuttall。win_length窗函数长度采样点数。fftbins为True时生成 periodic周期型窗常用于 FFT为False时生成 symmetric对称型窗常用于滤波器设计。默认True。dtype返回张量的数据类型默认float64若传None则回退为float32。典型用法示例来自 python/paddle/audio/functional/window.py 的 docstringimport paddle n_fft 512 cosine_window paddle.audio.functional.get_window(cosine, n_fft) std 7 gaussian_window paddle.audio.functional.get_window((gaussian, std), n_fft)此外get_window还被hamming_window、hann_window、kaiser_window、blackman_window、bartlett_window等高层 API同样定义在 python/paddle/audio/functional/window.py内部复用因此该漏洞的影响面不仅限于直接调用get_window的用户。漏洞根因分析对用户可控字符串执行eval公告中贴出了漏洞代码的核心片段这也是本次安全问题的直接根源def get_window( window: Union[str, Tuple[str, float]], win_length: int, fftbins: bool True, dtype: str float64, ) - Tensor: ... try: winfunc eval(_ winstr) except NameError as e: raise ValueError(Unknown window type.) from e从代码结构看漏洞成因可以拆解为三个环节winstr完全来自用户输入winstr由参数window解析而来字符串直接取值元组取第一个元素其内容由调用方完全掌控没有任何白名单校验。字符串拼接后交给eval_ winstr将用户输入拼接到下划线前缀之后整个拼接结果作为表达式交给 Python 内建函数eval执行。eval会完整解释并执行传入的表达式包括函数调用、属性访问与任意表达式构造。异常处理掩盖了注入迹象代码仅捕获NameError并将其转换为ValueError(Unknown window type.)。由于注入表达式可能抛出的并非NameError例如直接执行命令成功返回、或抛出其他类型的异常攻击者可以通过精心构造的表达式绕过这层看起来像参数校验的处理实现任意代码执行。这种用eval处理用户可控字符串的模式是 Python 安全审计中最高危的反模式之一eval/exec意味着将输入字符串当作代码运行任何形式的外部输入一旦进入该路径就等同于向攻击者开放了远程代码执行RCE的能力。利用场景与攻击影响在实际攻击场景中攻击者只需能控制传入get_window的window参数即可触发漏洞。典型入口包括从外部配置文件、命令行参数或网络请求中读取窗函数类型并直接透传给get_window的推理/训练脚本加载第三方模型或预训练权重时间接触发对窗函数参数的反序列化与调用在多租户、云端推理服务等场景中攻击者通过提交恶意输入影响服务进程。由于eval具备完整的表达式执行能力攻击者可以构造类似__import__(os).system(malicious_command)的表达式链在框架进程内执行系统命令、读写文件、发起网络通信最终实现宿主机的完全失陷。飞桨安全指南 SECURITY_cn.md 中明确指出飞桨的安全问题认定说明将输入非预期参数后造成内存破坏或非干净退出视为安全问题而本漏洞属于输入可控字符串即可直接执行代码其危害等级远高于一般的越界读写类问题。官方修复方案从eval到注册表查表公告指出该问题已在 commit26c419ca386aeae3c461faf2b828d00b48e908eb中修复并随飞桨 2.4 版本发布。修复的核心思路是彻底移除对eval的依赖改用注册表 查表分发的安全实现。在当前仓库源码 python/paddle/audio/functional/window.py 中可以看到修复后的完整实现。修复包含两个关键设计1. 用装饰器注册表替代字符串求值新增WindowFunctionRegister注册类与全局实例window_function_registerclass WindowFunctionRegister: def __init__(self): self._functions_dict {} def register(self, funcNone): def add_subfunction(func): name func.__name__ self._functions_dict[name] func return func return add_subfunction def get(self, name): return self._functions_dict[name] window_function_register WindowFunctionRegister()所有合法的窗函数实现_cat、_bartlett、_kaiser、_nuttall、_general_gaussian、_general_cosine、_general_hamming、_taylor、_hamming、_hann、_tukey、_gaussian、_exponential、_triang、_bohman、_blackman、_cosine等都以window_function_register.register()装饰器注册进字典。注册表中的键是固定、编译期确定的函数名与用户输入无关从根本上切断了字符串即代码的攻击面。2. 查表 KeyError白名单校验修复后的get_window主体节选try: winfunc window_function_register.get(_ winstr) except KeyError as e: raise ValueError(Unknown window type.) from e params (win_length, *args) kwargs {sym: sym} return winfunc(*params, dtypedtype, **kwargs)对比漏洞版本可以发现三处本质变化维度漏洞版本修复版本分发机制eval(_ winstr)动态执行表达式window_function_register.get(_ winstr)字典查表非法输入处理仅捕获NameError掩盖真实行为捕获KeyError并转换为ValueError可注入性任意表达式可执行只能命中注册表中预先定义的函数名同时修复版本还在入口处增强了输入校验当window为字符串且属于需要额外参数的gaussian、exponential、kaiser时直接抛出ValueError提示用户改用元组传参非字符串非元组的类型也会被拒绝。这些校验进一步收紧了 API 的输入面。值得注意的是修复后的实现依然保留了_ winstr的前缀拼接逻辑但由于winstr现在只作为字典键参与查找而非代码执行攻击者传入的任何恶意字符串最多只会触发KeyError不再具备任何代码执行能力。这正是以数据方式处理输入而非以代码方式处理输入的安全设计范例。安全验证测试用例如何佐证修复正确性当前仓库中的 test/legacy_test/test_get_window.py 为修复后的实现提供了充分的功能验证。该测试以 SciPy 的signal.get_window、signal.windows.gaussian、signal.windows.general_gaussian、signal.windows.exponential、signal.windows.kaiser为基准逐项比对飞桨paddle.audio.functional.get_window的输出验证参数化窗函数如(gaussian, 7)、(general_gaussian, 1, 7)、(exponential, None, 1)、(kaiser, 14.0)与多种窗类型hamming、hann、triang、bohman、blackman、cosine、tukey、taylor、bartlett、nuttall在atol0.0001, rtol0.0001精度下的数值一致性。从测试结构可以推断出修复后实现的正确性要点合法输入路径完整保留所有受支持的窗函数仍能通过查表正确分发并与 SciPy 参考实现数值一致说明移除eval没有破坏原有功能边界输入得到约束window类型白名单校验与KeyError转换逻辑确保未知窗名以受控的ValueError形式干净退出而非执行任意代码。这套对照 SciPy 的数值一致性测试也印证了飞桨在修复安全问题的同时对 API 行为兼容性的严格保障。升级与防护建议针对 PDSA-2022-002官方给出的修复载体是飞桨 2.4 版本。对开发者与运维人员建议按以下优先级落实防护立即升级将飞桨升级至包含补丁 commit26c419ca386aeae3c461faf2b828d00b48e908eb的 2.4 及以上版本。升级前请先核对当前版本号python -c import paddle; print(paddle.__version__)确认是否落在受影响版本区间。自查调用点全局搜索代码中所有对paddle.audio.functional.get_window以及内部复用它实现的高层窗函数 API的调用确认window参数是否可能来自不可信来源若无法立即升级应在调用前对window参数做严格的字符串白名单校验。加固运行环境遵循 SECURITY_cn.md 中的安全模型建议——在沙箱环境中运行来自不可信来源的模型与数据审慎对待任何会触发框架内部解析逻辑的外部输入。关注后续公告飞桨会定期发布安全公告完整的公告清单与受影响版本汇总见 security/README_cn.md相关历史公告存放于 security/advisory 目录建议纳入日常安全巡检范围。结语从漏洞公告到安全编码实践PDSA-2022-002CVE-2022-46742是一次教科书式的eval滥用案例一个面向用户的框架 API 将用户可控字符串直接交给eval求值导致了任意代码执行。飞桨官方的修复——以装饰器注册表查表取代动态求值——不仅是针对该漏洞的补丁更提供了一种可复用的安全设计模式任何按名称分发到函数的需求都应使用白名单查表映射表/注册表而不是把输入当作代码解释执行。对于飞桨用户而言本案例也提示框架 API 的参数校验边界、版本升级节奏与运行沙箱策略共同构成了深度学习框架安全使用的三道防线。详细的漏洞报告流程与安全模型说明可进一步参阅 SECURITY_cn.md。【免费下载链接】PaddlePArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice 『飞桨』核心框架深度学习机器学习高性能单机、分布式训练和跨平台部署项目地址: https://gitcode.com/GitHub_Trending/pa/Paddle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考