Apache Log4j問題をネットワーク観点で対策する(CVE-2021-44228)

Javaのログ出力ライブラリ「Apache Log4j」の脆弱性問題(CVE-2021-44228)が話題になっています。
業務で対応をされている方もいらっしゃるのではないでしょうか。(お疲れ様です・・)
アプリケーション観点での対策については各所で情報があがってきているので、今回はネットワークインフラ観点でできる対策について書いていこうと思います。
*動作検証は厳密に行っていなので参考程度に見ていただければと思います *設定イメージ解説にパロアルトネットワークス社の次世代ファイアウォール(以下PAと記載)を利用しています
 

Apache Log4j問題について

問題の詳細は下記サイト、ブログをご参照いただければと思います。
とても詳しく書かれています。
ここでは概要だけ記載します。
 
Apache Log4jに存在する RCE 脆弱性(CVE-2021-44228)についての検証レポート
2021年12月6日にApache Software Foundationにより修正されたLog4j に存在するリモートコード実行の脆弱性(CVE-2021-44228)についての検証を実施し、脆弱性の悪用が可能であることを確認しました。[1][2] (2022.2.16) 追加情報: 以下追加情報として、「Apache Log4jに関する解説 1.6版」を公開しましたのでご覧ください。 Log4j は、Apache Software Foundationが提供するロギング用ライブラリで、Java等のアプリケーションでログ出力を行う実装として幅広く利用されています。本脆弱性はLog4shellとも呼称され、Log4j に存在する JNDI(Java Naming and Directory Interface) Lookup機能に含まれる問題に起因します。 本脆弱性の悪用に成功した場合は攻撃者がリモートから任意のコードを実行できる可能性があり、 Apache Software FoundationによるとCVSSv3 スコアが最高値の10.0、SeverityはCriticalと評価されています。 また、概念実証(PoC)コードも数多く公開されており、攻撃の観測や被害事例も報告されていること、ライブラリ単体のみならず影響を受けるライブラリを含む製品が多数のベンダに渡って存在することから、今後の被害の拡大が懸念されます。[3] ※ JNDI Lookup機能とは: Java アプリケーションが DNS や LDAP 等のサービスを利用するための汎用的なライブラリで、出力される情報に特定の文字列が含まれる場合、変数として置換する機能です。 この機能を活用することで日付や環境情報などを動的に出力することができます。 図1. 本脆弱性を悪用した攻撃の例 攻撃者が用意したLDAPサーバにより、不正なJavaのClassファイルを用いて被害者に任意のコードを実行させる方法として、図1で示す3段階での手順の攻撃を確認しています。 RMI等を使った攻撃手法では、第2段階までで攻撃が成立することを確認しており、Step4が省略され、Step3の手順でレスポンスを受け取った際に任意のコードを含んだ不正なメソッドの呼び出しが行われます。 第1段階(攻撃試行) Step1. 標的となる脆弱なLog4jライブラリを使用するアプリケーションにおいて、JNDI Lookupを行うための不正なHTTPリクエストを送信する Step1の成立要件としては、脆弱なバージョンのLog4jであること、JNDI Lookup機能が有効となっていることが前提です。 第2段階(JNDIの不正操作) Step2. 攻撃者が指定したJNDI Lookupにより、攻撃者のLDAPサーバに接続を開始する Step3.

対象バージョン

Apache Log4j 2.0 〜 2.14.1

対策

恒久的な対策

脆弱性が修正された以下のバージョンにアップデートする。
Apache Log4j 2.15.0
 

暫定的な対策

恒久対策が難しい場合は、以下の対策を行う。
Log4j バージョン 2.10 およびそれ以降Log4j を実行する Java 仮想マシンを起動時に「log4j2.formatMsgNoLookups」という JVM フラグオプションを指定する環境変数「LOG4J_FORMAT_MSG_NO_LOOKUPS」を「true」に設定する
Log4j バージョン2.10 より前JndiLookup クラスをクラスパスから削除する

ネットワークで対策する

前述のとおり、アプリケーションレベルで対策を行うことが推奨されていますが、すぐに対応できないケースもあると思います。
・対応が必要なシステムを整理できていない(どのシステムが対象かわからない) ・動作検証をしっかりしてからでないと対応できない ・メンテナンスが許容される年末まで待ってとか・・
 
このような場合は、超暫定対処でネットワークレベルで対策が必要です。
今回はネットワークの中でも主にファイアウォール(UTM)での対策について書いていきます。

UTM機能で対策する

多くのファイアウォールではUTM機能が実装されています。
*ライセンスが追加で必要なものが多いです
 
ファイアウォール各ベンダーがLog4j問題(CVE-2021-44228)のシグネチャを配信しているので、UTM機能が利用できる場合は以下の対策が有効です。
下記方向の通信にUTM機能を有効(ON)にする。
【インターネット(Any)】→ 【サーバ】
【サーバ】→ 【インターネット(Any)】
 
PAでは”セキュリティポリシールール”の”プロファイル設定”から設定可能です。
上記方向のセキュリティポリシーの”脆弱性防御”にプロファイルを適用します。
 
PAでは下記のようにシグネチャが配信されています。
シグネチャ(脅威ID)を確認したところ、重大度がHightかCritical、デフォルトアクションが”リセット”になっていたので、デフォルトのプロファイルを適応すれば問題なさそうです。
次世代ファイアウォール(PA-Series、VM-Series、 CN-Series)または脅威防御セキュリティサブスクリプションを持つPrisma Accessは、以下の脅威IDでこの脆弱性に関連するセッションを自動的にブロックできます。91991, 91994, 91995, 92001 (Application and Threat content update 8502)
 
[2022-03-31 10:00 PDT更新] 脅威に関する情報: Apache Log4jに新たな脆弱性(CVE-2021-44228) 実際の悪用も確認
2021年12月9日、Apache Log4j 2に存在するリモートコード実行 (RCE) の 脆弱性 がすでに実際に悪用されていることが確認されました。公開されたPoC (proof of concept: 概念実証) コードは、その後の調査で、驚くほど簡単に悪用できることが判明しました。特別に細工されたリクエストを脆弱なシステムに送信することで、システムの構成によっては、攻撃者がそのシステムに悪意のあるペイロードをダウンロードして実行するよう指示することができます。この脆弱性が発見されたのが最近のことであるため、オンプレミスおよびクラウド環境の両方において、まだパッチが適用されていないサーバーが多数存在します。多くの深刻度の高いRCEエクスプロイトと同様に、これまでのところ、パッチが適用されていないシステムを探し出して悪用する目的で、CVE-2021-44228に対する大規模なスキャン活動がインターネット上で始まっています。すべてのシステムにおいて、Apache Log4j 2の最新バージョン (2.17.1) にアップグレードすることを強くお勧めします。このバージョンでは、12月14日に見つかった追加の脆弱性CVE-2021-45046、12月17日に見つかったCVE-2021-45105、12月28日に見つかったCVE-2021-44832も修正されています。 12月22日に本稿を更新し、パロアルトネットワークスNGFWの脅威防御シグネチャ「Apache Log4j Remote Code Execution Vulnerability」のヒット数分析から判明したLog4jのエクスプロイト試行の統計を掲載しました。エクスプロイトが成功した場合に試行されうる、大規模スキャン、脆弱なサーバーの発見、情報窃取、CobaltStrikeの配信、暗号通貨のマイニングなどのさまざまなアクティビティについて解説します。このほか、Log4j脆弱性に関連した最近のイベントを時系列で解説します。 12月28日、本稿を更新し、CVE-2021-44832に関する情報を掲載しました。CVE-2021-44832は、Log4j 2のインスタンスに影響を与えるリモートコード実行(RCE)の脆弱性で、これにより攻撃者がログ設定ファイルの変更権限を持ち、JDBC Appenderを使って悪意のある設定を行うことができる場合があります。このJDBC Appenderは、その後影響を受けるデバイス上でリモートコードを実行できるJDNI URIを参照します。 2.17.0 未満の Apache Log4j 2.x (2.16.0 は後述の新たな脆弱性を含む) 相当数のJavaベースアプリケーションがログユーティリティとしてlog4jを使用しており、このCVEの脆弱性があります。私たちの知る限りでは、少なくとも以下のソフトウェアに影響を及ぼす可能性があります。 Apache Struts Apache Solr Apache Druid Apache Flink ElasticSearch Flume Apache Dubbo Logstash Spring-Boot-starter-log4j2 パロアルトネットワークスのお客様は、 脅威防御セキュリティサブスクリプションをもつ 次世代ファイアウォール( PA-Series、 VM-Series、 CN-Series)または Prisma Accessで保護されています。また Cortex XDRは、Linuxエンドポイントではエクスプロイト保護により、Windows、Mac OS、Linux エンドポイントではBTP (Behavioral Threat Protection) によりお客様を保護しています。 Prisma Cloudは、Log4jの脆弱なインスタンスをもつ継続的インテグレーション(CI)、コンテナイメージ、およびホストシステムを検出できます。さらに Cortex XSOAR を利用すると、インシデント対応を自動化できます。 Apache log4j 2は、オープンソースのJavaベースのロギングフレームワークで、世界中多くのJavaアプリケーションで利用されています。オリジナルのlog4j 1.Xリリースと比べると、log4j 2は以前のリリースにおける問題に対処し、利用者にプラグインアーキテクチャを提供してきました。2015年8月5日、log4j 2が主流となり、旧バージョンのlog4jユーザーはすべてlog4j 2へのアップグレードが推奨されました。Apache log4j 2は、Apache ...
 
UTM機能を利用することにより、外部からの脆弱性を悪用した通信をブロックできます。
また、シグネチャの内容によりますが【サーバ】→ 【インターネット(Any)】方向にもUTM機能を適用することにより、攻撃者の初回アクセスがサーバに到達してしまった場合のその後通信をブロックできる可能性があります。
 
また、脆弱性防御以外にも、アンチスパイウェア、URLフィルタリングも併用して設定することで防御効果を高めることが可能です。(PAの場合)
※アンチスパイウェアでは攻撃に利用されているドメインの名前解決ブロック、URLフィルタリングでは同じく攻撃に利用されるURLへのアクセスをブロックすることが期待できます
 

注意点

この対策も完璧ではないため注意点もあります。
 
  • 通信が暗号化(HTTPS)されている場合は検知できない暗号化通信(HTTPS)の場合は、ファイアウォールで通信の内容を検査できないためブロックできません。ファイアウォールの前段、またはファイアウォール自身で複合化が必要です。
スポンサード

セキュリティポリシーで対策する

ファイアウォールでUTM機能を利用できない場合の対策、またUTM機能と併用する目的でセキュリティポリシーでの通信制御も有効です。

アローリスト方式

1.アクセス元を絞る
サーバーへのアクセス元を限定できる場合は絞ります。
一般公開サービスの場合は難しいですね。
 
2.サーバからの通信は必要なものだけに絞る
今回の脆弱性では、攻撃を受けるとサーバから攻撃者の用意したLDAP等のサーバへアクセスを行います。
 
そのため、【サーバ】→ 【インターネット(Any)】方向の通信は、以下のような必要なものだけに絞ります。
  • HTTP(S) *TCP 80,443
  • DNS *UDP 53
攻撃で利用されるのは以下のプロトコルが多いようです。
このプロトコルのインターネット宛通信をブロックすることで、攻撃を止めることが可能です。
  • LDAP
  • DNS
  • RMI
  • IIOP
 
お気づきの方もいると思いますが、攻撃に利用するプロトコルにDNSが含まれています。
攻撃対象のサーバ情報(各ソフトウェアのバージョン情報、ユーザー情報、パスワード等)をDNSプロトコルにのせて、外部DNSサーバにパラメータとして渡すことが可能なようです。
DNSも制限できれば問題ないですが、なかなか制限は難しいと思いますので、UTM機能との併用(*)が必要かと思います。
*攻撃者のドメインに対するDNSクエリをブロックする
 
3.サーバからの通信は必要なものだけに絞る with アプリケーション識別
「2.サーバからの通信は必要なものだけに絞る」の応用です。
一般的なファイアウォール(アプリケーションを識別できない)では、ポートベースでの通信制御になります。
*例:HTTPを許可する場合はTCP 80を許可する
 
この方法だと、許可したポートを使って攻撃者が通信をした場合にブロックできません。
*例:TCP 80を許可した場合、攻撃に利用するLDAP通信をTCP 80で行うことで通信可能になる
アプリケーション識別可能なファイアウォールでは、許可通信をアプリケーションで指定することで上記に対応可能です。
 
PAでは”セキュリティポリシールール”の”アプリケーション”から設定可能です。
 

ブロックリスト方式

ここまでは、許可するものを指定するアローリスト方式でしたが、ここからはブロックリスト方式での対策です。
許可するIPアドレス、プロトコルを絞れない場合に有効です。
また、アローリスト方式と併用するのがオススメです。
 
1.攻撃に利用されるプロトコルをブロックする
前述の通り、下記プロトコルが攻撃でよく利用されます。
このプロトコルをセキュリティポリシーでブロックします。
*RMI、IIOPのポート番号はまとまった情報がなく不明です(すみません)
  • LDAP *TCP 389,3268,3269,636, UDP 389,3268
  • DNS *TCP 53 , UDP 53
  • RMI
  • IIOP
 
2.攻撃に利用されるプロトコルをブロックする with  アプリケーション識別
「1.攻撃に利用されるプロトコルをブロックする」の応用です。
こちらも前述の通り、ポート番号のみの制御では別ポートを利用された場合にブロックできません。
アプリケーション識別を利用することで通信の内容を検査してアプリケーション判別してブロックすることが可能です。
*例:LDAPがTCP 80を使って通信していてもアプリケーション識別可能
 
以下をブロック対象のアプリケーションとして設定します。
  • ldap
  • rmi-iiop *RMI over IIOP
注意点としては、”サービス”の設定を「any」にすること。
デフォルトでは「application-default」が設定されているため、PAで定義されているデフォルトのポート番号しか検査されません。
 
例えばLDAPの場合、以下がデフォルトポートのためそれ以外のポートは検査されません。
ブロックするアプリケーションを設定する場合は、「any」とすることで他ポートを利用して通信を行っている場合も検査・制御可能になります。

番外編(外部DNSサーバに頼る)

外部のDNSサーバ(サービス)で、マルウェアサイトの名前解決をブロックしてくれるものもあるので、このようなサービスに頼るのもありかもしれません。
完全におまけ程度の対策ですが。
 
サーバに設定するDNSサーバ設定を、セキュリティ対策されている外部DNSサーバにすることで、攻撃に利用されているドメインの名前解決ブロックしてくれ・・・るといいなぁ。

おわりに

ネットワーク観点で Log4j脆弱性問題(CVE-2021-44228)の対策について書きました。
何をすれば完璧ということはないので、利用できるリソースやリスクを考慮しながら、多層(ライブラリアップデート + ネットワークでも対策等)で対策するのが良いと思います。
 
その他記事✏️