导语:通过在Emissary项目上运行标准的CodeQL查询集,我发现了之前报告的任意文件泄露(CVE-2021-32093)。
通过在Emissary项目上运行标准的CodeQL查询集,我发现了之前报告的任意文件泄露(CVE-2021-32093),但也发现了新的漏洞:
不安全的反序列化漏洞 (CVE-2021-32634);
服务器端请求伪造漏洞(CVE-2021-32639);
原始代码注入CVE (CVE-2021-32096)是由社区贡献的CodeQL查询标记的;
到目前为止,还可以通过默认的CodeQL查询发现反映的跨站点脚本漏洞(CVE-2021-32092)。
代码注入 (CVE-2021-32096)
起初我尝试在Emissary 5.9.0代码库上使用CodeQL脚本注入查询时,却没有得到任何结果。
在阅读源代码获取漏洞细节后,我确信我的查询正确地建模了javax.script.ScriptEngine.eval()接收,并且该源代码已经由默认的CodeQL JAX-RS库建模。然而,我意识到从不受信任的数据到脚本注入接收器的流不是“直接的”流。你可以通过查看代码流的方式来理解其原因。
用户数据进入应用程序的 JAX-RS 终端是:
getOrCreateConsole(request) 将调用 RubyConsole.getConsole() ,它会转到:
此代码启动一个运行 RubyConsole.run() 方法的新线程(因为它实现了 Java Runnable 接口):
但是,由于此时 stringToEval 为 null,因此该方法几乎会立即使用 wait() 方法暂停线程。
稍后,在 rubyConsolePost 中,我们可以找到以下代码:
这里是不受信任数据(request.getParameter(CONSOLE_COMMAND_STRING))进入应用程序并流入RubyConsole.evalAndWai