クラウド型脆弱性診断ツールVAddyのSQLインジェクション検査をアップデートしました。
今まではGETやPOST時のKey=Value形式のValue側だけを対象に、SQLインジェクションの検査を実施していました。今回のアップデートにより、Key=ValueのKey側も検査対象となり、より広範囲にSQLインジェクションを検出できるようになりました。
今回の検査追加の背景
最近のWebアプリケーション開発現場では当たり前のようにフレームワークが使われるようになってきました。フレームワークのORM(Object-rerational mapping)機能により、SQL文を文字列連結で書くことは減り、SQLインジェクションに繋がるようなケースは減ってきたかと思います。
しかし正しい使い方をしていないとSQLインジェクションの問題が発生する場合があります。例えばPHPで人気のフレームワークCakePHPでは、どのバージョンのORM機能であってもカラム名にあたる箇所はエスケープされず、ユーザデータをそのまま含めてはいけないとされています。
ORM とデータベースの抽象層では、ほとんどの SQL インジェクション問題を防止してはいますが、 不適切な用法により危険な値が入り込む余地も依然としてありえます。
条件配列を使用している場合、キー/左辺および単一の値の入力は、ユーザーデータを含んではいけません。
ユーザからのGET/POSTのデータを連想配列形式にして、SQLの条件式に自動変換する処理は便利なためよく行われていますが、DBカラム名の指定箇所は見落としがちです。
ORM機能を使っているから大丈夫と思っていたが使い方が間違っていて気付かないまま、そのようなアプリケーションがまだあるかもしれません。
見落としがちな、カラム名にあたるKey=ValueのKey側の値の処理もValueと同じように脆弱性診断の対象にすべきと私たちは考え、今回のリリースを行いました。
今回のリリースの影響
今回の機能追加によって、Key=Value形式のパラメータの箇所のSQLインジェクション検査のパターンが増えるため検査時間も増えます。URLパスの検査は対象外のため検査時間には影響ありません。
ほとんどのお客様は1分程度の増加に収まるかと思いますが、1回の検査がもともと1時間を超えるような場合には数分程度の増加が発生するかもしれません。