菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

首页科技正文

Allbet注册(www.aLLbetgame.us):Emissary 的SSRF破绽(CVE-2021-32639)发现历程

admin2021-11-2673漏洞

2021欧洲杯比分

www.22223388.com)实时更新发布最新最快最有效的2021欧洲杯比分资讯。

,

通过在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.evalAndWait()方式的地方。然则,evalAndWait()方式是:

没有对RubyConsole.eval()方式的现实挪用,Ruby剧本在该方式中被盘算,因此若是跟踪受熏染的请求参数,你将在该方式中竣事并到达受熏染的跟踪的末尾。用户控制的下令只被分配给stringToEval字段,这似乎就到此为止了。然而,若是你仔细考察,你还会看到这个方式正在挪用notifyAll()方式,这意味着这个方式将有用地激活被暂停的线程,该线程将依次运行以下表达式:

当rubyConsolePost方式被挪用时,RubyConsole.run()会以一个null stringToEval执行,然后进入wait状态。

当挪用 evalAndWait(commandString) 时,stringToEval 获取用户控制的剧本,然后恢复 RubyConsole.run() 方式,该方式将评估现在分配的 stringToEval。

因此,没有静态代码剖析工具可以有用跟踪的直接数据流。不外,通过使用CodeQL熏染步骤对Javawait/notify模式建模,我应该能够发现这个破绽。

在此代码模式中,你可以看到两种差异类型的块:挪用notify的同步块和挪用wait的同步块。当同步发生在统一个工具上时,我想将notify块中的写入与wait块上相同字段的读取毗邻起来。这意味着我需要一个分外的污点步骤来毗邻这些原本断开毗邻的节点,以便 CodeQL 的污点跟踪可以桥接这种逻辑断开毗邻:

启用这个分外的熏染步骤后,我乐成地讲述了这个破绽:

令人赞叹的是,这个查询不是由GitHub CodeQL工程师开发的,而是由几个CodeQL社区成员孝顺和改善的:

https://github.com/github/codeql/pull/2850;

https://github.com/github/codeql/pull/5349;

https://github.com/github/codeql/pull/5802;

这个社区孝顺的查询正在进入尺度查询集,并将很快提供应所有运行 GitHub 代码扫描的开源项目。

我还向 CodeQL 存储库孝顺了我的notify/wait模式熏染步骤,这可能很快就会为所有 CodeQL 用户启用同步字段之间的类似数据流剖析!

随便文件泄露 (CVE-2021-32093)

CodeQL 发现了默认设置下的随便文件泄露,因此我不会谈论此破绽的详细信息,由于它已经在 SonarSource文章中举行了形貌。

不平安的反序列化 (CVE-2021-32634)

CodeQL 默认查询还讲述了三个不平安的反序列化操作。

第一个位于 WorkSpaceClientEnqueueAction REST 终端:

可以通过对 /WorkSpaceClientEnqueue.action 的经由身份验证的 POST 请求接见此终端。正如你在源代码中所读到的,表单参数 WorkSpaceAdapterWORK_BUNDLE_OBJ (tpObj) 在第 52 行被解码和反序列化。

Allbet注册

欢迎进入Allbet注册(www.aLLbetgame.us),欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

幸运的是,这是一个身份验证后的破绽,由于SonarSource讲述修复了跨站请求伪造(CSRF)破绽,因此无法通过CSRF代表已登任命户行使该破绽。

CodeQL 还讲述了另外两个当前未在代码中执行的不平安反序列化操作。然而,它们可能会在未来的版本中启用。

第一个起源于MoveToAction类,它没有被Jersey服务器公然。

MoveToAction:

MoveToAdapter:

PayloadUtil:

第二个方式泉源于WorkSpaceAdapter类的inboundEnque方式。该破绽需要挪用inboundEnque(),但现在尚未执行该挪用。

WorkspaceAdapter:

WorkspaceAdapter:

WorkspaceAdapter:

服务器端请求伪造 (CVE-2021-32639)

在CodeQL中发现这个破绽得益于另一个社区的孝顺。讲述此破绽的查询最初是由@lucha-bc和@porcupineyhair孝顺的,而且已经被提升为任何CodeQL扫描使用的默认规则集。

该查询讲述了两个服务器端请求伪造 (SSRF) 破绽。第一个影响 RegisterPeerAction REST 终端。例如,以下请求将导致多个请求发送到位于 http://attacker:9999 的攻击者控制的服务器。

需要注重的主要一点是,一些伪造的请求是发送到 /emissary/Heartbeat.action 终端的未经身份验证的请求:

然则,也有经由身份验证的请求发送到攻击者控制的服务器上的 /emissary/RegisterPeer.action 终端:

SSRF 破绽通常用于接见内部服务器或扫描内部网络,但在这种情形下,我想到了差其余破绽行使场景。由于 SSRF 破绽导致 Emissary 使用的 Apache HTTP 客户端发送一个带有摘要身份验证标头的经由身份验证的请求,因此从理论上讲,我可以诱使客户端切换到基自己份验证,从而泄露服务器凭证。

要使用 Apache HTTP 客户端发送经由身份验证的请求,需要在凭证提供程序上设置凭证,然后设置 HTTP 客户端以使用该凭证提供程序:

可以看到凭证是从 Jetty 用户领域读取的,用于毗邻到需要凭证的任何主机和任何端口。这些凭证在凭证提供程序 (CRED_PROV) 中设置,该提供程序厥后被设置为主要 Emissary 客户端 (CLIENT) 的默认凭证提供程序。

设置没有指定应该使用什么身份验证方案,这让我信托身份验证方案是凭证服务器响应决议的。若是我礼貌地要求客户端使用基自己份验证,那么所有迹象都解释服务器凭证可能会以明文形式(base64 编码)发送。

为此,我设置了一个请求基自己份验证的 Web 服务器,然后使用 SSRF 破绽使 Emissary 服务器毗邻到我的恶意服务器。 Emissary HTTP客户端很喜悦地从摘要身份验证切换到基自己份验证,并将凭证发送给我。以下是我的服务器显示服务器凭证的输出:

同样,AddChildDirectoryAction 终端也容易受到 SSRF 的攻击。对 /AddChildDirectory.action 终端的 POST 请求将触发对攻击者控制的主机的分外请求:

除了修复 SSRF 破绽之外,NSA还通过只允许摘要身份验证方案来防止身份验证方式的混淆。

反射的跨站点剧本 (CVE-2021-32092)

CodeQL在自动查找SonarSource研究职员讲述的大多数破绽和几个新的要害破绽方面做得很好,然则它没有讲述SonarSource研究职员最初讲述的跨站剧本(XSS)破绽。我检查了查询集,发现没有针对这个特定XSS实例的查询。

然后我最先与 CodeQL 团队互助,对 JAX-RS 终端上的 XSS 破绽举行相当周全的剖析。这个 XSS 检测现在也包罗在主 CodeQL 存储库中!

在 REST 终端上准确检测 XSS 并不是一项简朴的义务,由于它们中的大多数将默以为 application/json 响应内容类型,这对 XSS 是平安的。因此,我需要 CodeQL 来检测用户控制的数据(无论是反射的照样持久的)在没有准确编码的 HTTP 响应中使用,而且还需要检测此类响应的内容类型已更改为任何 XSS 友好类型。这可以通过以下几种方式实现:

通过使用 ResponseBuilder.type() 显式设置响应内容类型;

通过使用 @Produces 注释来注释封锁方式;

通过使用 @Produces 注释来注释封锁类;

在与 CodeQL 团队一起举行这些查询改善时,我意识到我们对 Spring REST 终端的 XSS 查询也没有思量响应内容类型,这可能导致许多误报,例如,带有应用程序/json内容类型的响应被符号为可行使的。因此,我们还实现了所需的改善,以使Spring XSS查询到达JAX-RS现在拥有准确度。

本文翻译自:https://securitylab.github.com/research/NSA-emissary/

网友评论

1条评论