Akamai が Log4j2 における別の DoS 攻撃を報告(CVE-2021-45105):知っておくべきこと
最近発見された Log4j2 の一連の脆弱性は、インターネットに衝撃を与えました。Akamai の継続的な調査の一環として、12 月 17 日に当社の岡本英輝が、別のサービス妨害(DoS)脆弱性を発見し、責任を持って報告しました。この脆弱性には CVE-2021-45105 が割り当てられました。
CVE-2021-45105 発見の経緯
当社で、CVE-2021-450466(一連の脆弱性の 2 番目)の分析を行っていた際、Log4j2 のプロパティに、Context Lookup (${ctx:FOOBAR})または Thread Context Map pattern(%X、%mdc、%MDC のいずれか)を使用したカスタムレイアウトが含まれている場合に、アプリケーションがユーザー入力をスレッドコンテキストに渡すと、不正なペイロードによって制御不能な再帰が発生する可能性があることが発見されました。これは、後にリモートコード実行(RCE)の脆弱性であることがわかりましたが、当初は DoS を発生させると報告されていました。
DoS を発生させるペイロードを特定しようとしたところ、サードパーティのセキュリティチームによって公開されたペイロードが見つかりました。このペイロードは確かに例外「java.lang.IllegalStateException: Infinite loop in IllegalStateException: Infinite loop in property interpolation」をスローしましたが、これは回復可能な例外です。これが CVE-2021-45046 のペイロードであるという確証はありませんが、Log4j2 コードの「防御策」によってこの例外がスローされたことには気付きました。
StrSubstitutor.java
private void checkCyclicSubstitution(final String varName, final List<String> priorVariables) {
if (!priorVariables.contains(varName)) {
return;
}
final StringBuilder buf = new StringBuilder(BUF_SIZE);
buf.append("Infinite loop in property interpolation of ");
buf.append(priorVariables.remove(0));
buf.append(": ");
appendWithSeparators(buf, priorVariables, "->");
throw new IllegalStateException(buf.toString());
}
つまり、Log4j2 の開発者は、Lookup プロセスで循環参照が発生する可能性のあることを認識していたのです。checkCyclicSubstitution() 関数に名前を付けていることから、アプリケーション開発者にこの例外のキャッチを期待していたと、私たちは考えています。これは、値の履歴を格納したアレイリストを調べるための関数です。私たちは、循環参照のチェックをバイパスする方法が存在する可能性を考え、最終的に、ペイロードを見つけ出し、特定のバージョンの JVM で java.lang.StackOverflowError を発生させることができました。また、CVE-2021-45046 が修正されている Log4j 2.16 でこの攻撃が発生することもわかりました。
この問題は Log4j2 のセキュリティチームに報告されました。セキュリティチームは CVE-2021-45105 を割り当てて、Log4j 2.17 で迅速に修正しました。
攻撃ベクトル
当社では、アプリケーションがスレッドコンテキストにユーザー入力を渡す場合、ログに記録されたコンテキストデータを 2 回評価すると、サーバーがクラッシュする可能性があることを発見しました。
ユーザーエージェント:${${ctx:ua}}
この脆弱性に直接関連していない他の攻撃ベクトルを指摘する報告も、Twitter と GitHub にいくつか存在します。これは、ほとんどの場合に、サーバーのクラッシュではなく回復可能な例外が発生するためです。該当するのは、次のバリアントです。
${ctx:loginId}
$${ctx:loginId}
${${::-${::-$${::-j}}}}
CVE-2021-45105 の緩和策
Kona Site Defender ですべてのルールセットを利用されているお客様は、現在の KRS/ASE Rule 3000014 および AAG Attack Group の「Command Injection」により、すでにこの脆弱性から保護されています。
Akamai は調査を継続し、情報が入手可能になった時点で最新情報を公開します。