パターンマッチングの限界
Oracle Database Firewall以外でも、SQLをブロックすることができる機能をもっている製品がある。ただこれらの製品はSQLを判別するのにパターンマッチングを使用している。このパターンマッチングは、検知の正確性という点は、大きな欠点がある。
パターンマッチングは、正規表現などで特定の文字列を見つけることだが、SQLインジェクションでは、よくTRUEとなる条件やUNIONを使ったSQLが使われることが多い。
例えば、TRUEが成り立つ条件として、簡単に思いつくのは1=1だが、20000=(1000+19000), 'dog'='dog', LEFT('catastrophe', 3)='cat', SIN(45) = COS(45) , CAST(123) as STR <> 123、これらもすべてTRUEとなる条件である。uni/* */on, char(117,110,105,111,110)、これらはUNIONの文字を別な表記で表している。このように、パターンマッチングで検知させるすべての文字列を漏れなく網羅することは不可能に近い。つまり、これは検知の精度が低下し、フォールスポジティブやフォールスネガティブが増加することを意味しているのである。
SQL文法を理解した正確な検知
そもそもSQLには、約400のキーワードや厳格な文法のルール(ISO/IEC 9075)が定義されている。Oracle Database Firewallは、パターンマッチングではなくそれらの定義されているSQL文法を理解した上での検知を行っている。
上記のSQLを見てみると、UPDATEやWHEREというキーワード、スキーマ、データ、演算子といくつかのカテゴリに分離することができる。この例では、DATAの中に文字列としてselect や演算子等が含まれているが、これらは文法上のDATAに入っておりSQLインジェクションとして成立するSQLにはなりえない。パターンマッチングだと誤検知してしまう可能性があるSQLでも、Oracle Database Firewallは、Oracle Database, SQL Server, DB2といったそれぞれのデータベースごとの高精度のSQL文法解析エンジンを搭載しており、正確にSQL文法構造を理解し、検知することを可能なのである。
Oracle Database FirewallによるSQLブロック
では実際にOracle Database FirewallによってSQLインジェクションのSQLをブロックするとどうなるのか見ていきたい。実際に良く使用されるUnion Selectで組み立てたSQLを実行する。詳しい解説は控えるが、これはOracle DatabaseのサンプルスキーマであるSHユーザーのPRODUCTS表を検索しているSQLに、user_tables表が検索するSQLを注入したものである。
SELECT null,null,null,null,null,prod_name FROM PRODUCTS WHERE 1=2 union select null,table_name,null,null,null,null from user_tables
Oracle Database Firewallのポリシーの設定は、ホワイトリスト方式。これはデフォルトブロックを意味しており、Passの登録されていないSQLはすべてブロックされる。当然上記のSQLインジェクションのSQLは許可されていないのでBlockされる。
右側にAction codeとあるが、緑色がPassしたSQL、赤色がBlockしたSQLである。SQLが実行された時間、クライアント情報、ユーザー名、データベースの情報等、ログとして必要な情報はすべて記録される。Blockした情報をリアルタイムアラートとしてメール送信することや、ネットワーク機器の監視サーバがある場合にそのサーバへのsyslog配信など随時、管理者へ情報発信をすることができる。