CodeQL 文档

用户控制数据的反序列化

ID: py/unsafe-deserialization
Kind: path-problem
Security severity: 9.8
Severity: error
Precision: high
Tags:
   - external/cwe/cwe-502
   - security
   - serialization
Query suites:
   - python-code-scanning.qls
   - python-security-extended.qls
   - python-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

使用任何允许构建任意可序列化对象的反序列化框架来反序列化不受信任的数据很容易被利用,在许多情况下,攻击者可以执行任意代码。即使在反序列化对象返回给反序列化方法的调用者之前,也可能已经执行了很多代码,包括静态初始化器、构造函数和终结器。自动反序列化字段意味着攻击者可以精心构造一个嵌套的对象组合,这些对象在执行的初始化代码上可能产生不可预知的影响,例如执行任意代码。

有许多不同的序列化框架。此查询目前支持 Pickle、Marshal 和 Yaml。

建议

尽可能避免反序列化不受信任的数据。如果体系结构允许,请使用其他格式而不是序列化对象,例如 JSON。

如果需要使用 YAML,请使用 yaml.safe_load 函数。

示例

以下示例直接对来自传入 HTTP 请求的值调用 pickle.loads。Pickle 然后从不受信任的数据创建新值,因此本质上是不安全的。


from django.conf.urls import url
import pickle

def unsafe(pickled):
    return pickle.loads(pickled)

urlpatterns = [
    url(r'^(?P<object>.*)$', unsafe)
]

将代码改为使用 json.loads 而不是 pickle.loads 会消除漏洞。


from django.conf.urls import url
import json

def safe(pickled):
    return json.loads(pickled)

urlpatterns = [
    url(r'^(?P<object>.*)$', safe)
]

参考

  • ©2025GitHub, Inc.
  • 条款
  • 隐私