代码注入¶
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
在对用户输入(例如 HTTP 请求参数)进行清理之前,直接将其作为代码进行评估,会使攻击者能够执行任意代码。当用户输入传递给将用户输入解释为要评估的表达式的代码时,就会出现这种情况,例如使用 Kernel.eval
或 Kernel.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