导语:该漏洞是由于对发送到Controller终端的“JSON”参数中提交的JSON key进行了不正确的验证。成功利用此漏洞可能导致以根用户的权限执行远程代码。
在趋势科技最近发布的漏洞报告中,研究团队的Guy Lederfein和Dusan Stevanovic详细介绍了Sophos防火墙最近打过补丁的代码注入漏洞。该漏洞是由于对发送到Controller终端的“JSON”参数中提交的JSON key进行了不正确的验证。成功利用此漏洞可能导致以根用户的权限执行远程代码。以下是关于CVE-2022-3236的介绍。
Sophos最近修复了Sophos Firewall v19.0 MR1(19.0.1)及以前版本中的代码注入漏洞。此漏洞是由于对发送到Controller终端的“JSON”参数中提交的JSON key进行了不正确的验证。未经身份验证的远程攻击者可以通过向受影响的服务器发送精心编写的请求来利用此漏洞。成功利用此漏洞可能导致使用根用户的权限进行远程代码执行。
漏洞利用
Sophos Firewall是一种网络安全解决方案,它可以部署在专门构建的设备、云网络(AWS/Azure)、虚拟设备或x86 Intel硬件上的软件设备上。防火墙应用支持多种网络安全特性,包括应用感知路由、TLS检测、深层包检测、远程接入VPN、日志、报表等。Sophos Firewall公开了一个web管理控制台,用于通过TCP端口4444上的HTTPS管理设备的配置。此外,Sophos Firewall公开了一个用户门户,用于更新用户的详细信息或通过TCP端口443上的HTTPS下载身份验证客户端。
HTTP是RFC 7230-7237和其他RFC中描述的请求/响应协议。客户端向服务器发送请求,服务器又将响应发送回客户端。HTTP请求由请求行、各种标题、空行和可选消息正文组成:
其中CRLF表示新行序列回车(CR),后跟换行(LF)。根据使用的方法和Content-Type标头,参数可以在RequestURI或消息正文中作为名称-值对从客户端传递到服务器。例如,使用GET方法传递一个名为“param”、值为“1”的参数的简单HTTP请求可能如下所示:
使用POST方法的相应HTTP请求可能如下所示:
JavaScript对象表示法(JSON)是一种数据交换格式,用于创建设备可解析、人类可读的输出。JSON对象具有以下语法:
1.对象用花括号{}括起来。
2.对象由逗号(“,”)字符分隔的零个或多个项目组成。
3.项目由秘钥和值组成。秘钥的值由冒号(“:”)字符分隔。
4.秘钥必须是用引号括起来的字符串。
5.值必须是有效的类型。JSON定义了7种值类型:字符串、数字、对象、数组、true、false和null。
6.数组是用方括号[]括起来的对象。
7.数组由零个或多个字符串、数字、JSON对象、数组、布尔值或由逗号(“,”)字符分隔的空类型对象组成。
JSON对象示例如下: {“name”:”bob”, “age”:30}。
由Sophos Firewall公开的web管理和用户门户web界面都运行在Apache httpd服务器后面的Jetty服务器上。通过这些接口发出的配置和诊断请求通过请求提交给Controller servlet。这个servlet基于模式HTTP请求参数检索适当的EventBean对象。例如,如果模式HTTP请求参数设置为151或451,则分别调用WebAdminAuth或UserPortalAuth类来处理请求。在每个类中,都会调用CSCClient类的generateAndSendAjaxEvent()方法。
该方法解析json HTTP请求参数,并修改解析对象中的特定字段。然后调用send()方法,该方法反过来调用_send(),后者根据相关EventBean对象的模式添加模式JSON参数。然后,它将创建的JSON对象作为字符串(包括适当的标头)通过TCP或UDP端口299发送到本地CSC服务器。
当CSC服务器接收到Jetty服务器提交的JSON对象时,它会验证通过Perl脚本CyberAPIArch.pm中的validateJSON()方法提交的JSON对象。如果JSON对象包含一个名为_discriminator的项,则调用getValidationHash()方法。该方法遍历_discriminator Perl哈希的每个秘钥,表示字段名。每个字段名都与一个描述字段值和对象名之间映射的JSON对象相关联。解析收到的JSON对象时解析的一些Perl对象(natrule、securitypolicy、hotspot等)包含一个带有_discriminator项的模板,其中包含字段值及其关联对象之间特定字段名的映射。该方法遍历字段值,以检查提交的JSON对象是否包含具有引用名称和值的字段。如果是,它将检索关联的对象名,并尝试使用eval函数将其解析为一个对象。
Sophos防火墙存在代码注入漏洞,此漏洞是由于对发送到Controller终端的“JSON”参数中提交的JSON key进行了不正确的验证。可以在HTTP请求中设置_discriminator项,经过一些修改后,这个JSON对象被发送到CSC服务器。但是,_discriminator项目集是未经修改发送的。一旦使用Perl脚本CyberAPIArch.pm的validateJSON() 方法被调用时,它将检测这个项并调用getValidationHash()。Perl方法遍历$hashObj哈希对象,该对象包含一个名为_discriminator的项,其值是一个嵌套的哈希,其中的值项设置为发送的原始请求中的_discriminator项的值。
此值项被视为包含映射到对象名称的字段值的嵌套哈希。因此,如果最初提交的JSON对象包含一个名为value的项,其值设置为这个嵌套哈希中的一个值,则将使用eval函数解析关联的对象名称。由于原始请求中的_discriminator项可以设置为带有值和对象名称之间的任意映射的JSON对象,因此可以提交恶意对象并将其连接到eval函数中,从而导致代码注入。
Sophos尝试使用RequestCheckFilter Java对象对请求参数(包括JSON对象)执行输入验证。该过滤器检测带有非ASCII可打印字符的请求参数和JSON key。但是,仍然可以提交包含ASCII可打印字符的任意请求参数和JSON key,包括_discriminator项。
未经身份验证的远程攻击者可以通过向目标服务器发送精心编写的请求来利用此漏洞。成功利用此漏洞可能导致在服务器上运行任意Perl命令,从而导致以root用户的权限执行远程代码。
源代码
下面的代码片段摘自Sophos Firewall 19.0.1版本,并由趋势科技添加了额外的注释。
来自反编译的Java类cyberoam.sessionmanagement.RequestCheckFilter:
来自Perl脚本CyberAPIArch.pm:
检测攻击
为了检测试图利用该漏洞的攻击,检测设备必须监视并解析端口443/TCP和4444/TCP上的流量。请注意,流量是用SSL/TLS加密的。在继续进行下一步骤之前,检测设备必须对流量进行解密。
基于被监视的TCP端口,检测设备必须对包含以下字符串的Request- URI的HTTP GET和POST请求进行检测:
对Webadmin Controller终端(TCP端口4444)的请求可以使用多部分/表单数据编码。
Multipart/form-data 由多个部分组成,每个部分都包含一个Content Disposition标头。每个部分由一串字符分隔。分隔部分的字符串由Content-Type标题行上的boundary关键字定义,它被设置为" multipart/form-data "。Content-Disposition标头包含一个名称参数,描述要返回的表单元素。每个部分中可能会出现额外的标题行。每一行由一个新的行序列分隔。标头文件以两个连续的新行结束。下面是表单元素的数据,如果对象被分离并存储在一个单独的文件中,则filename参数提供要使用的建议文件名。下面是一个文件项的Content-Disposition标头示例,其中boundary关键字是" TMSR ":
如果发现对上述终端的请求,检测设备必须根据Content-Type标头中描述的编码解析其参数,并搜索json参数。如果发现,检测设备必须使用以下任何合适的方法检查json参数值。
方法1:如果检测设备能够解析JSON,它必须将JSON参数解析为JSON对象。检测设备必须解析密钥为字符串“_discriminator”的任何项(可能嵌套)。如果被发现,应该认为该流量是恶意的,因为利用该漏洞的攻击很可能正在进行中。
方法2:如果检测设备不具备解析JSON的能力,则必须将JSON参数作为字符串进行检查,并检查其是否包含字符串“_discriminator”。如果被发现,应该认为该流量是恶意的,因为利用该漏洞的攻击很可能正在进行中。
需要注意的其他事项:
1.参数名称和值可能是URL编码的,必须在应用上述检测之前进行解码;
2.URI和参数名称(“json”)和值(“_discriminator”)的字符串匹配必须以区分大小写的方式执行;
3.HTTP标头名称(即“Content-Type”)和值(即“multipart/form data”)的字符串匹配必须以不区分大小写的方式执行。
本文翻译自:https://www.zerodayinitiative.com/blog/2022/10/19/cve-2022-3236-sophos-firewall-user-portal-and-web-admin-code-injection如若转载,请注明原文地址