从库输入构造的不安全代码¶
ID: js/unsafe-code-construction
Kind: path-problem
Security severity: 6.1
Severity: warning
Precision: medium
Tags:
- security
- external/cwe/cwe-094
- external/cwe/cwe-079
- external/cwe/cwe-116
Query suites:
- javascript-security-extended.qls
- javascript-security-and-quality.qls
当库函数以可能不安全的方式动态构造代码时,重要的是要记录给库客户端,该函数应该只与受信任的输入一起使用。如果该函数没有记录为可能不安全,那么客户端可能会错误地使用包含不安全代码片段的输入,从而使客户端容易受到代码注入攻击。
建议¶
正确记录从未经清理的输入构造代码的库函数,或者避免在第一位构造代码。
示例¶
以下示例展示了使用 `eval` 实现的两种方法:一个简单的反序列化例程和一个 getter 方法。如果这些方法使用不受信任的输入,那么攻击者可能能够在系统上执行任意代码。
export function unsafeDeserialize(value) {
return eval(`(${value})`);
}
export function unsafeGetter(obj, path) {
return eval(`obj.${path}`);
}
为了避免这个问题,要么正确记录该函数可能不安全,要么使用其他解决方案,例如 `JSON.parse` 或其他库(如以下示例所示),这些库不允许执行任意代码。
export function safeDeserialize(value) {
return JSON.parse(value);
}
const _ = require("lodash");
export function safeGetter(object, path) {
return _.get(object, path);
}