用户控制数据的反序列化¶
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
使用任何允许构建任意可序列化对象的反序列化框架来反序列化不受信任的数据很容易被利用,在许多情况下,攻击者可以执行任意代码。即使在反序列化对象返回给反序列化方法的调用者之前,也可能已经执行了很多代码,包括静态初始化器、构造函数和终结器。自动反序列化字段意味着攻击者可以精心构造一个嵌套的对象组合,这些对象在执行的初始化代码上可能产生不可预知的影响,例如执行任意代码。
有许多不同的序列化框架。此查询目前支持 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)
]
参考¶
OWASP 漏洞描述:Deserialization of untrusted data.
OWASP 关于反序列化对象的指南:Deserialization Cheat Sheet.
Chris Frohoff 和 Gabriel Lawrence 的演讲: AppSecCali 2015: Marshalling Pickles - how deserializing objects will ruin your day
常见弱点枚举:CWE-502.