整理|苏宓
出品|CSDN(ID:CSDNnews)
继Log4j2之后,听闻Java再次遭到漏洞攻击,这一次,似乎情况也更为严重,因为受到影响的是Java平台的开源全栈应用程序框架和控制反转容器实现——Spring家族,而且网传漏洞还不止一个。
一直以来,Spring是编程开发的必选技术之一,此前一位名为BogdanN.的全栈开发者甚至评价道:“学习Java、学习Spring框架,你永远都不会失业。”
可想而知,如果Spring城门失火,Java必定遭殃。不过,SpringRCE漏洞在网络上炒了两天,虽然有不少安全圈人员纷纷发圈,但更多的还是表示了只是听闻,这也不禁让人质疑,是真有漏洞,还是虚惊一场?
接下来,本文将盘点一下这两天Spring的“大”漏洞。

第一个:真的SpringCloudFunctionSPELRCE
3月26日,据网络安全网站CyberKra报道,SpringCloudFunction官方测试用例曝光了SpringCloudFunctionSPEL(SpringExpressionLanguage)表达式注入漏洞,黑客可利用该漏洞注入SPEL表达式来触发远程命令执行。

漏洞发现过程
起初,研究人员在分析SpringCloud函数的main分支()时,发现有开发者向其中添加了SimpleEvaluationContext类。还使用了isViaHeadervariable作为标志,在解析之前判断的值取自HTTPheader。
的参数存在于访问SpringCloudFunction的HTTP请求头中,其SpEL表达式可以通过StandardEvaluationContext注入并执行。这使得攻击者可以利用这个漏洞进行远程命令执行。
SpringCloudFunction的应用
当前,SpringCloudFunction被许多科技巨头应用于产品中,包括AWSLambda、Azure、GoogleCloudFunctions、ApacheOpenWhisk以及许多Serverless服务提供商。
根据官方文档,SpringCloudFunction是基于SpringBoot的函数计算框架,它可以:
通过函数促进业务逻辑的实现。
将业务逻辑的开发生命周期与任何特定的运行时目标分离,以便使用相同的代码可以作为Web端点、流处理器或任务运行。
支持跨Serverless提供商的统一编程模型,具备独立运行(本地或在PaaS中)的能力。
在Serverless上提供程序上启用SpringBoot功能(自动配置、依赖注入、指标)。
简而言之,SpringCloudFunction通过抽象传输细节和基础设施,为开发者保留熟悉的开发工具和开发流程,让开发者专注于实现业务逻辑,从而提高开发效率。
影响
目前,SpringCloudFunctionSPEL漏洞已被归类为严重等级,CVSS(通用安全漏洞评分系统)得分为9.0(满分10)。
不过,开发者也无须太过担心,因为只有SpringCloudFunction的某些版本特定配置(3.0.0.RELEASE=SpringCloudFunction=3.2.2)的动态路由受到影响,受影响的版本发布时间在2019年11月22日至2022年2月17日。
此外,官方也针对漏洞发布修复补丁:
以及发布了最新的3.1.7和3.2.3版本:

第二个:网传比SpringCloudFunctionRCE更为严重的SpringRCE
相比前者,3月29日晚间,有不少网友爆料的SpringRCE漏洞,让开发者圈中人心惶惶。
不过有些不同寻常的是,这个漏洞目前并没有像Log4j2事件那样引起的圈内诸多企业大厂的紧急行动,也不像SpringCloudFunctionSPEL漏洞那样有官方说明,甚至连国外披露漏洞的根源也是来自QQ和国内部分网络安全网站。

这也让不少网友猜测,该漏洞应该是国内某个安全机构、安全人员最先发现的。这不,有网友将该漏洞发布到了GitHub上(目前已删除,但有网友将该页面保存了下来):

根据网传的内容显示:
Spring框架出现的RCE0day漏洞影响的范围为JDK版本号在9及以上的、使用了Spring框架或衍生框架。

目前,随着该网传漏洞的暗流涌动,国外不少网络安全研究人员和安全公司也发布Twitter表示这一漏洞的存在:

他们也将该漏洞称之为Spring4Shell,猜测是由传递参数的不安全反序列化引起的。

Spring零日漏洞真的存在?
针对网传的内容,全球领先的安全风险信息解决方案提供商Rapid7通过《Spring4Shell:Zero-DayVulnerabilityinSpringFramework》一文也对外确认零日漏洞是真实存在的。

其在文章中表示,该漏洞似乎影响了使用@RequestMapping注解和POJO(PlainOldJavaObject)参数的函数。与此同时,Rapid7还通过SpringframeworkMVC进行了演示():


基于此,Rapid7表示,“如果我们编译该项目,并将其托管在Tomcat上,我们就可以用下面的curl命令来利用它。请注意,下面使用的有效载荷与研究人员创建的原始概念证明所使用的完全相同。”

这个有效载荷在TomcatROOT目录下投放了一个受密码保护的webshell,名为,它看起来像这样:

然后,攻击者可以调用命令。下面是一个执行whoami以获得albinolobster的例子:

通过测试,Rapid7发现在_312上的测试失败了,但有作用。

临时修复方案
目前由于Spring官方尚未发布最新说明,无法确定哪些应用程序使用了有漏洞的功能,这也导致但凡和Spring沾点关系的功能,开发者都要问上一句「是否涉及SpringCore的RCE0day漏洞」。


不过,据外媒BleepingComputer报道,这个漏洞虽然会影响到JDK版本号在9及以上的、使用了Spring框架或衍生框架,但是也有特定的前提条件。
同时,也有不少网友调侃道:
别慌,虽然现在Java已经到了Java18版本,但是很多企业仍然停留在Java8版本及以下。

不同的安全漏洞,也让Java工程师产生了严重的心理阴影:

对于开发者、企业而言,当前也不用自乱阵脚,不过,为了避免一定的风险,可以做的就是先排查一下自己的JDK版本以使用Spring框架或衍生框架的情况,如果版本在JDK8及以下,则不受漏洞的影响。
此外,根据rapid7、国内的北京大学计算中心等渠道给出的临时修复方案,大家也可以尝试一波:
在应用中全局搜索@InitBinder注解,看看方法体内是否调用方法,如果发现此代码片段的引入,则在原来的黑名单中,添加{"class.*","Class.*","*.class.*","*.Class.*"}。
注:如果此代码片段使用较多,需要每个地方都追加。
在应用系统的项目包下新建以下全局类,并保证这个类被Spring加载(推荐在Controller所在的包中添加)。完成类添加后需对项目进行重新编译打包和功能验证测试,并重新发布项目。
;;;;@ControllerAdvice@Order(10000)publicclassGlobalControllerAdvice{@InitBinderpublicvoidsetAllowedFields(webdataBinderdataBinder){String[]abd=newstring[]{"class.*","Class.*","*.class.*","*.Class.*"};(abd);}}最后,静待官方消息。
参考资料:

《新程序员001-004》全面上市,对话世界级大师,报道中国IT行业创新创造
成就一亿技术人