用户控制数据的反序列化¶
ID: js/unsafe-deserialization
Kind: path-problem
Security severity: 9.8
Severity: warning
Precision: high
Tags:
- security
- external/cwe/cwe-502
Query suites:
- javascript-code-scanning.qls
- javascript-security-extended.qls
- javascript-security-and-quality.qls
使用任何允许构建任意函数的反序列化框架反序列化不受信任的数据很容易被利用,并且在许多情况下,允许攻击者执行任意代码。
建议¶
尽可能避免反序列化不受信任的数据。如果架构允许,则使用不能表示函数的格式,如 JSON 或 XML。当使用 YAML 或其他支持函数序列化和反序列化的格式时,请确保解析器配置为禁用任意函数的反序列化。
示例¶
以下示例在来自 HTTP 请求(因此本质上是不安全的)的数据上调用流行的 js-yaml
包的 load
函数。
const app = require("express")(),
jsyaml = require("js-yaml");
app.get("load", function(req, res) {
let data = jsyaml.load(req.params.data);
// ...
});
使用 safeLoad
函数(它不会反序列化 YAML 编码的函数)可以消除漏洞。
const app = require("express")(),
jsyaml = require("js-yaml");
app.get("load", function(req, res) {
let data = jsyaml.safeLoad(req.params.data);
// ...
});
参考资料¶
OWASP 漏洞描述:不受信任数据的反序列化.
OWASP 关于反序列化对象的指南:反序列化速查表.
Neal Poole:通过 JS-YAML Node.js 模块中的 YAML 进行代码执行.
通用弱点枚举:CWE-502.