一緒に書く習慣をつけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して5日目です。クリックしてイベントの詳細をご覧ください。
脆弱性の説明
この春の抜け穴はどこにありますか?春の公式サイトに直接アクセスします。早くもブログモジュールで、春の公式説明を見ることができます。
2022年3月30日、SpringFrameworkはRCE0dayの脆弱性を公開し、National Information Security Vulnerability Sharing Platform(CNVD)にはSpring Frameworkのリモートコマンド実行の脆弱性(CNVD-2022-23942)が含まれています。 Spring Framework、この脆弱性は危険と評価されています。
この脆弱性により、Webシェルに書き込んでコマンドを実行できます。SpringフレームワークのJDK9バージョン(およびそれ以降)では、リモートの攻撃者は、特定の条件を満たすことに基づいてフレームワークのパラメーターバインディング関数を介してAccessLogValveオブジェクトと悪意のあるフィールド値を取得し、それによってパイプラインメカニズムをトリガーして任意のパスを書き込むことができます。下。このAccessLogValveオブジェクトが何であるかを知らない友人もいます。実際、私たちは皆、このオブジェクトを頻繁に使用しています。気づかなかった:
tomcatのserver.xmlファイルでは、AccessLogValveは、コンテナーアクセス要求を記録するために使用されるログ処理クラスです。バルブ、元の意味はバルブの意味であり、AccessLogValveはアクセスログを処理および生成することです。原則として、このオブジェクトのパラメータ値を動的に変更し、指定したファイル(jspファイルなど)をコンテナに書き込んでから、書き込んだファイルからシェルスクリプトコマンドを書き込んで実行します。
脆弱性の状態
-
サーブレットコンテナとしてのApacheTomcat。
-
JDK9以降のSpringMVCフレームワークを使用します。
-
Springフレームワークと派生フレームワークspring-beans-*。jarファイルまたはCachedIntrospectionResults.classが存在します
勢力圏
jdk
JDK9+
春
5.3.0から5.3.17
5.2.0から5.2.19
古いバージョン
再現してみてください
最初にそれが再現できるかどうかを確認してから、それを解決する方法について話しましょう。
- 環境を見てください
- 构建一个基于maven的web项目,框架用的spring-mvc,就是常规的工程没有什么特殊的。主要是要注意maven打包为war包。并独立部署外部tomcat中,不要直接在idea中进行部署启动。
主要注意协议对应spring的版本:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.10</version>
</dependency>
复制代码
定义一个简单的controller
@Controller
public class IndexController {
@RequestMapping("/test1")
@ResponseBody
public String index(User user) {
user = new User();
user.setAddress("123");
return user.getAddress();
}
}
复制代码
- 访问对应的路径,注意加上下面的参数。
说明一下以上的参数的含义
class.module.classLoader.resources.context.parent.pipeline.first.pattern=构建文件的内容
class.module.classLoader.resources.context.parent.pipeline.first.suffix=修改tomcat日志文件后缀
class.module.classLoader.resources.context.parent.pipeline.first.directory=写入文件所在的网站根目录
class.module.classLoader.resources.context.parent.pipeline.first.prefix=写入文件名称
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=文件日期格式(实际构造为空值即可)
复制代码
- 结果在root根目录就会生成你要写入的jsp文件。
这个文件在root目录下,当然就可以在外面直接进行访问。之后就可以通过这个文件进行写入各种shell命令。
自查漏洞
- 排查是否使用了Spring框架(包括但不限于以下方法)
(1) 排查项目中是否使用了Spring框架指定版本:
可遍历项目文件查找是否包含spring-beans-*.jar
(2) 排查war包中是否存在Spring框架:
检查war包内是否存在spring-beans-*.jar文件,若存在则表示使用spring开发框架;若不存在,则进一步确认是否存在CachedIntrospectionResults.class文件,若存在则表示使用Spring开发框架或衍生框架。
- 排查包含Spring框架的项目使用的JDK版本,如果JDK版本>=9则存在风险。
漏洞修复
spring官方建议最好通过升级spring版本来解决,不过也提供了其他集中修复的方法
- 将spring版本升级到5.3.18和5.2.20或者以上版本
- 升级tomcat
- 降低jdk版本
- 禁止请求时带指定参数
咱们说一下最后一种方案:需要增加controller拦截
@ControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE)
public class BinderControllerAdvice {
@InitBinder
public void setAllowedFields(WebDataBinder dataBinder) {
String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
dataBinder.setDisallowedFields(denylist);
}
}
复制代码
不过spring官方墙裂建议升级spring版本,因为目前版本还可能存在未知的问题。
推奨される対応は、SpringFramework5.3.18および5.2.20以降に更新することです。これを行った場合、回避策は必要ありません。ただし、アップグレードを迅速に行うことができない状況にある場合もあります。そのため、以下にいくつかの回避策を示します。
脆弱性ステータス
現在、Springの担当者はこの脆弱性を修正し、最新のSpring jarパッケージをプルして、上記の再現手順で結果をテストしています。
就職活動、仕事、技術的な乾物を共有するための「ITテクノロジースタック」に注目してください。