CodeQL 文档

代码注入

ID: rb/code-injection
Kind: path-problem
Security severity: 9.3
Severity: error
Precision: high
Tags:
   - security
   - external/cwe/cwe-094
   - external/cwe/cwe-095
   - external/cwe/cwe-116
Query suites:
   - ruby-code-scanning.qls
   - ruby-security-extended.qls
   - ruby-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

在对用户输入(例如 HTTP 请求参数)进行清理之前,直接将其作为代码进行评估,会使攻击者能够执行任意代码。当用户输入传递给将用户输入解释为要评估的表达式的代码时,就会出现这种情况,例如使用 Kernel.evalKernel.send 等方法。

建议

避免在任何可能动态评估的表达式中包含用户输入。如果必须包含用户输入,请在包含之前使用特定于上下文的转义。确保为将要发生的评估类型使用正确的转义。

示例

以下示例显示了两个函数从请求中设置名称。第一个函数使用 eval 来执行 set_name 方法。这很危险,因为它可能允许恶意用户在服务器上执行任意代码。例如,用户可以提供值 "' + exec('rm -rf') + '" 来破坏服务器的文件系统。第二个函数直接调用 set_name 方法,因此它是安全的。

class UsersController < ActionController::Base
  # BAD - Allow user to define code to be run.
  def create_bad
    first_name = params[:first_name]
    eval("set_name(#{first_name})")
  end

  # GOOD - Call code directly
  def create_good
    first_name = params[:first_name]
    set_name(first_name)
  end

  def set_name(name)
    @name = name
  end
end

参考资料

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