真的 Spring Cloud Function SPEL RCE
网传比 Spring Cloud Function RCE 更为严重的 Spring RCE
Spring 零日漏洞真的存在?
临时修复方案
继 Log4j 2 之后,听闻 Java 再次遭到漏洞攻击,这一次,似乎情况也更为严重,因为受到影响的是 Java 平台的开源全栈应用程序框架和控制反转容器实现——Spring 家族,而且网传漏洞还不止一个。
一直以来,Spring 是编程开发的必选技术之一,此前一位名为 Bogdan N. 的全栈开发者甚至评价道:“学习 Java、学习 Spring 框架,你永远都不会失业。”
可想而知,如果 Spring 城门失火,Java 必定遭殃。不过,Spring RCE 漏洞在网络上炒了两天,虽然有不少安全圈人员纷纷发圈,但更多的还是表示了只是听闻,这也不禁让人质疑,是真有漏洞,还是虚惊一场?
接下来,本文将盘点一下这两天 Spring 的“大”漏洞。
真的 Spring Cloud Function SPEL RCE
3 月 26 日,据网络安全网站 Cyber Kendra 报道,Spring Cloud Function 官方测试用例曝光了 Spring Cloud Function SPEL(Spring Expression Language)表达式注入漏洞,黑客可利用该漏洞注入 SPEL 表达式来触发远程命令执行。
| 漏洞发现过程
https://github.com/spring-cloud/spring-cloud-function/commit/dc5128b80c6c04232a081458f637c81a64fa9b52
还使用了 isViaHeadervariable 作为标志,在解析 spring.cloud.function.routing-expression 之前判断的值取自 HTTP header。
spring.cloud.function.routing-expression 的参数存在于访问 Spring Cloud Function 的 HTTP 请求头中,其 SpEL 表达式可以通过 StandardEvaluationContext 注入并执行。这使得攻击者可以利用这个漏洞进行远程命令执行。
| Spring Cloud Function 的应用
当前,Spring Cloud Function 被许多科技巨头应用于产品中,包括 AWS Lambda、Azure、Google Cloud Functions、Apache OpenWhisk 以及许多 Serverless 服务提供商。
根据官方文档,Spring Cloud Function 是基于 Spring Boot 的函数计算框架,它可以:
通过函数促进业务逻辑的实现。
将业务逻辑的开发生命周期与任何特定的运行时目标分离,以便使用相同的代码可以作为 Web 端点、流处理器或任务运行。
支持跨 Serverless 提供商的统一编程模型,具备独立运行(本地或在 PaaS 中)的能力。
在 Serverless 上提供程序上启用 Spring Boot 功能(自动配置、依赖注入、指标)。
简而言之,Spring Cloud Function 通过抽象传输细节和基础设施,为开发者保留熟悉的开发工具和开发流程,让开发者专注于实现业务逻辑,从而提高开发效率。
| 影响
目前,Spring Cloud Function SPEL 漏洞已被归类为严重等级,CVSS(通用安全漏洞评分系统) 得分为 9.0(满分 10)。
不过,开发者也无须太过担心,因为只有 Spring Cloud Function 的某些版本特定配置(3.0.0.RELEASE <= Spring Cloud Function <= 3.2.2)的动态路由受到影响,受影响的版本发布时间在 2019 年 11 月 22 日至 2022 年 2 月 17 日。
https://github.com/spring-cloud/spring-cloud-function/commit/0e89ee27b2e76138c16bcba6f4bca906c4f3744f
https://github.com/spring-cloud/spring-cloud-function/tags
网传比 Spring Cloud Function RCE 更为严重的 Spring RCE
相比前者,3 月 29 日晚间,有不少网友爆料的 Spring RCE 漏洞,让开发者圈中人心惶惶。
来源:https://archive.ph/DIbrv
他们也将该漏洞称之为 Spring4Shell,猜测是由传递参数的不安全反序列化引起的。
Spring 零日漏洞真的存在?
其在文章中表示,该漏洞似乎影响了使用 @RequestMapping 注解和 POJO(Plain Old Java Object)参数的函数。
https://www.rapid7.com/blog/post/2022/03/30/spring4shell-zero-day-vulnerability-in-spring-framework/
处理请求的函数被称之为 vulnerable,而且还有一个 POJO 参数 HelloWorld。在这里,HelloWorld 被简化了,但如果需要,POJO 可能会变得非常复杂:
通过测试,Rapid7 发现在 OpenJDK 1.8.0_312 上的测试失败了,但 OpenJDK 11.0.14.1 有作用。
临时修复方案
不过,据外媒 BleepingComputer 报道,这个漏洞虽然会影响到 JDK 版本号在 9 及以上的、使用了 Spring 框架或衍生框架,但是也有特定的前提条件。
对于开发者、企业而言,当前也不用自乱阵脚,不过,为了避免一定的风险,可以做的就是先排查一下自己的 JDK 版本以使用 Spring 框架或衍生框架的情况,如果版本在 JDK 8 及以下,则不受漏洞的影响。
此外,根据 rapid 7、国内的北京大学计算中心等渠道给出的临时修复方案,大家也可以尝试一波:
①在应用中全局搜索 @InitBinder 注解,看看方法体内是否调用 dataBinder.setDisallowedFields 方法,如果发现此代码片段的引入,则在原来的黑名单中,添加 {"class.*", "Class. *", "*. class.*", "*.Class.*"}。注:如果此代码片段使用较多,需要每个地方都追加。
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;
@ControllerAdvice
@Order(10000)
public class GlobalControllerAdvice{
@InitBinder
public void setAllowedFields(webdataBinder dataBinder){
String[]abd=new string[]{"class.*","Class.*","*.class.*","*.Class.*"};
dataBinder.setDisallowedFields(abd);
}
}
最后,静待官方消息。
点个在看你最好看
网友评论已有0条评论, 我也要评论