前回は脆弱性やPoCコードに関する情報収集について解説した。今回はそれらの情報を基に、脆弱性を悪用する攻撃を防ぐ方法を解説する。利用するのは、無料で使えるOSS(オープンソースソフトウエア)のWAF(Web Application Firewall)である「ModSecurity」だ。ハードルは高くない。まずは試してみよう。

シグネチャーを作成する

 ModSecurityの最新版は2018年1月にリリースされた3系だが、ここでは枯れたバージョンでありパッケージで容易に導入できる2系を使う。

 まずは、攻撃を遮断するルールとなるシグネチャーの作成方法を解説する。ModSecurityは通信の内容とシグネチャーを照合することで攻撃を検知し防御する。

 様々な攻撃に対応したシグネチャーがインターネットで公開されている。それらはとても有用だが、ここでは理解を深めるために自分でシグネチャーを作成する方法を紹介しよう。

 なおModSecurityは多数の機能を備えており、記事ではとても説明しきれない。より詳しい内容はリファレンスマニュアルを参照してほしい。

・ModSecurityリファレンスマニュアル
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual-(v2.x)

「変数」「オペレーター」「アクション」

 ModSecurityでは、シグネチャーは以下のように記述する。

SecRule [変数] [オペレーター] [アクション]

 ModSecurityでは複数の変数が定義されている。それぞれの変数には、外部から送られてきたリクエスト(要求)のデータが格納される。代表的な変数は以下の通り。

ModSecurityの代表的な変数
変数名概要
REQUEST_URIクライアントからリクエストされたURIが格納される
REQUEST_HEADERSHost、Content-Type、Cookieなどリクエストに含まれるヘッダーが格納される
REQUEST_METHODGET、POST、などリクエストのメソッドが格納される
REQUEST_BODYリクエストのボディーが格納される
REMOTE_ADDR接続元のIPアドレスが格納される
ARGS_GETクエリーストリングが格納される

 オペレーターにはパターンマッチングのルールを記述する。変数と組み合わせて使用する。例えば「REQUEST_METHOD @contains "GET"」とすると、「HTTPリクエストのメソッドが“GET”という文字列を含む場合」という意味になる。

 アクションには、オペレーターによる判定が真だった場合の処理を記述する。具体的には「通信をブロックする」「ログに記録する(ロギングする)」「メッセージを出力する」などがある。

 シグネチャーを識別するための「シグネチャーID」もアクションに記述する。アクションの記述には様々なパターンが考えられるが、ここでは以下のアクションを主に使用する。

id:‘4000001',deny,auditlog,phase:2,msg:'Detected by my rule

 これは、オペレーターによる判定が真の場合に「リクエストボディーを処理するタイミングで(phase:2)」「通信を拒否してレスポンスコード403を返し(deny)」「ModSecurityの監査ログにメッセージを記録する(auditlog,msg)」ことを意味する。

シグネチャー作成のポイント

 シグネチャーの作成にはいくつかポイントがある。

ポイント1:脆弱性を突く文字列を見極める

 攻撃者が送信するリクエストの中には、攻撃者が実行したいコマンドが含まれる。そのコマンドは攻撃のたびに変わるので、マッチングに使う文字列にしても意味がない。

 例えば「リクエストに『wget』という文字列が含まれていたらブロックする」というシグネチャーでは、wget以外のコマンドを使った攻撃は防げない。

 コマンドが変わっても変わらない箇所、つまり脆弱性を突くために必要な文字列を見極める必要がある。

ポイント2:攻撃にしか使われない文字列を指定する

 サービスの正規の通信内容に含まれる文字列をシグネチャーで指定すると、問題のない通信まで遮断してしまう。

 このため該当のサービスで提供している仕様を把握して、「攻撃にしか使われない文字列」をシグネチャーに使用することが重要だ。

ポイント3:対象URLへのアクセスそのものを遮断する

 「攻撃にしか使われない文字列」がない脆弱性については、システムの可用性を一時的に犠牲にしてでも、脆弱性の影響を受けるURLへのアクセスそのものを遮断するという判断があり得る。

 例えば「CVE-2017-10271」や「CVE-2019-2725」といった、WebLogicにおけるリモートコード実行の脆弱性に対応する場合だ。この脆弱性では、正規のXMLの一部を攻撃者が実行したい内容に書き換えることで攻撃が成立する。「リクエスト中にこの文字列があれば攻撃だろう」と判断できる文字列が存在しない。

この先は日経クロステック Active会員の登録が必要です

日経クロステック Activeは、IT/製造/建設各分野にかかわる企業向け製品・サービスについて、選択や導入を支援する情報サイトです。製品・サービス情報、導入事例などのコンテンツを多数掲載しています。初めてご覧になる際には、会員登録(無料)をお願いいたします。