CodeQL 文档

从库输入构造的不安全代码

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

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

当库函数以可能不安全的方式动态构造代码时,重要的是要记录给库客户端,该函数应该只与受信任的输入一起使用。如果该函数没有记录为可能不安全,那么客户端可能会错误地使用包含不安全代码片段的输入,从而使客户端容易受到代码注入攻击。

建议

正确记录从未经清理的输入构造代码的库函数,或者避免在第一位构造代码。

示例

以下示例展示了使用 `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);
}

参考资料

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