[編集者注– NGINX Plus 用のNGINX ModSecurity WAFモジュールは、 2022 年 4 月 1 日をもって正式に販売終了となり、 2024 年 3 月 31 日をもってサポート終了となります。 詳細については、弊社ブログの「F5 NGINX ModSecurity WAF はサポート終了に移行しています<.htmla>」をご覧ください。
アプリケーション コードで使用されるライブラリには、多くのセキュリティ脆弱性が見つかります。 ライブラリ内のコードに修正を迅速に展開することが現実的でない場合は、影響を受けるライブラリをアップグレードできるまで、ModSecurity を使用してエクスプロイトを阻止し、影響を受けるコードに「仮想的にパッチを適用」できる場合があります。
Equifax の 1 億 4,300 万件のアカウントの侵害につながった Apache Struts アプリケーション ライブラリの脆弱性 ( CVE-2017-5638 ) は、事実上パッチを適用できるエクスプロイトの例です。 脆弱性の特徴は、 Content-Type
、 Content-Disposition
、またはContent-Length
HTTP ヘッダーに#cmd=
または#cmds=
文字列が存在することです。 (詳細は下記をご覧ください。)
ModSecurity を使用すると、影響を受ける HTTP ヘッダー内の悪意のある文字列を検索する単純なルールを使用して仮想パッチを作成できます。
SecRule REQUEST_HEADERS:Content-Type|REQUEST_HEADERS:Content-Length|REQUEST_HEADERS:Content-Disposition "@rx #cmds?=" "id:5638,auditlog,log,deny,status:403"
SecRule
を使用してルールを定義し、次の 3 つのパラメータを指定します。
REQUEST_HEADERS
変数を OR で結合した形式です。@rx
で指定される PERL 互換正規表現 (PCRE)。指定されたリクエスト ヘッダーで#cmd=
または#cmds=
を含む文字列を検索します。ModSecurity がアクティブ ブロッキング モードで構成されている場合、PCRE に一致するすべてのトラフィックがドロップされ、ルールがトリガーされます。
NGINX と ModSecurity を一緒に使い始める方法については、次の eBook をご覧ください。 ModSecurity 3.0 および NGINX: クイックスタートガイド
多くの場合、影響を受けるコードにパッチを適用し、再テストしてから本番環境にデプロイするよりも、ModSecurity でルールをデプロイする方が迅速です。
Apache Struts の脆弱性を例に考えてみましょう。Struts はアプリケーション ライブラリであり、オペレーティング システム パッケージではないため、企業の運用環境で Struts を更新するには時間がかかることがあります。 Struts の新しいバージョンへのアップグレードの一環として、Struts に依存する各アプリケーションを最新の Struts ライブラリを使用して再構築し、テストする必要があります。 大規模な組織では、数百のアプリケーションが存在し、それぞれに独自のバージョンの Struts アプリケーション ライブラリがあるため、すべてのアプリケーションが更新されるまで脆弱な状態になります。
ModSecurity カスタム ルールを導入すると、脆弱性のプレッシャーを感じることなく、本番ソフトウェアに慎重に、かつ適切なスケジュールでパッチを適用できるようになります。 影響を受けるソフトウェアがすべて更新されると、カスタム ルールを廃止できます。
Apache Struts CVE-2017-5638 は、リモート コマンド実行 (RCE) の脆弱性です。 このタイプの脆弱性により、攻撃者はターゲットシステム上で/bin/bash
やcmd.exe
などの任意のコマンドを実行できるようになります。 この機能により、攻撃者は Java アプリケーション サーバーと同じレベルのアクセスで、ファイル システムとネットワークを検索して機密データを探すことができます。 たとえば、Java アプリケーション サーバーがroot
として実行されている場合、攻撃者はターゲット システムに対してroot
権限を持ちます。
公式の CVEによると、この脆弱性は、攻撃者が不正なContent-Type
、 Content-Disposition
、またはContent-Length
HTTP ヘッダーを送信したときに発生します。 Apache Struts は、HTTP ヘッダーが予想される値のいずれとも一致しない場合に例外をスローします。 この問題は、例外処理コードがエスケープされていない無効なヘッダーを印刷しようとするため発生します。 (この文脈では、「エスケープされていない」とは、疑わしいコマンドの先頭に、通常コードを印刷するときに行われるような、実行を妨げる文字 (エスケープ文字) が付加されていないことを意味します。)
攻撃者は、 Content-Type
ヘッダーにObject Graph Navigation Library (OGNL) 式を挿入できます。 OGNL にはシステム コマンドを実行する機能があります。 エスケープされていない無効なヘッダーが印刷されると、OGNL 式が評価され、OGNL 式内のすべてのシステム コマンドが実行されます。
エクスプロイトは通常、以下のcurl
コマンドのバリエーションです。
curl -H "Content-Type:%{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))). ( #cmd= 'ls -ltr').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).( #cmds= (#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})) .(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}" www.example.com
重要な構文はコマンドの後半にあります。文字列#cmd=
と#cmds=
がそれぞれ 1 つずつあります (上記で強調表示)。 各文字列の後には実行するシステム コマンドが続きます。
推奨される解決策は、脆弱なソフトウェアにすぐにパッチを適用することです。 しかし、運用ソフトウェアにパッチを適用するには時間がかかり、急いで更新するとリスクが生じる可能性があります。 ModSecurity を使用して脆弱なソフトウェアの仮想パッチを作成すると、時間を稼ぐことができます。
仮想パッチを使用すると、 CVE-2017-5638などのセキュリティ脆弱性を悪用する可能性のあるトラフィックをブロックするカスタム ModSecurity ルールを作成できます。 そうすることで、サイトを攻撃から保護できます。 その後、その間に被害を受ける恐れなく、適切なスケジュールで本番サーバーにパッチを慎重に適用できます。
ModSecurity と NGINX ModSecurity WAF について詳しく知りたい場合は、電子書籍「ModSecurity 3.0 と NGINX」をダウンロードしてください。 クイックスタートガイド。
[NGINX Plus 用の NGINX ModSecurity WAF モジュールは、2022 年 4 月 1 日をもって正式に販売終了となり、 2024 年 3 月 31 日をもってサポート終了となります。 詳細については、弊社ブログの「F5 NGINX ModSecurity WAF はサポート終了に移行しています<.htmla>」をご覧ください。
「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"