説明

予約語の変更によるSQLインジェクション対策

【課題】急増するSQLインジェクション攻撃は、セキュリティを考慮したプログラム開発設計を怠ったWebアプリケーションが原因である。しかし、Webアプリケーション開発に特化したコンピュータ言語で、データベース問い合わせSQL言語を其の侭記述するのは仕方の無いことである。SQLインジェクション攻撃の対策方法を入手することも可能になってきたが、データベースマネージメントシステム(DBMS)が解釈する文字コード問題を迂回することによって、未知の問題等に対して100%安全な対策方法が見出せない。
【解決手段】SQLという問い合わせ方法は其の侭とし、SQLの予約語をシステム毎に変更すれば、攻撃ツールとして出回っているSQLインジェクション攻撃プログラムは無力化できる。セキュリティ対策の手法をデータベースマネージメントシステム側で提供するのである。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、例えば、インターネット等を利用したWebアプリケーション等の高度なサービスに於いて望まれるセキュリティを簡素化するものであり、特に、SQLインジェクションのクラック対策に効果的に作用する技術である。
【背景技術】
【0002】
今日、Webサーバを利用したインターネットのサービスは爆発的に膨れ上がり、静的なWebコンテンツからより管理しやすいデータベース等を利用した動的なWebコンテンツに切り換ってきている。これに伴って、これに対応したWebアプリケーション(CGI)も増えてきておりそこに内在するバグやセキュリティホールによる情報漏えい問題が深刻になっている。さらに、Webアプリケーションの作成に使われるプログラム言語の普及により人気のある言語には沢山の書籍が出版されているが、セキュリティを全く無視した入門書が多く、セキュリティに特化して詳しく書かれている書籍にいたっては皆無といった状態に陥っている。この書籍を参考にしたプログラマによって作り出されたWebアプリケーションが蔓延し、ソースコードが公開されているものに於いては、セキュリティ対策が後手に回ってしまうが、人気のプログラムはまだ対策されるだけましで、商用のプログラムや個別の物に於いては、プログラマがセキュリティ対策に於けるチェック等の工数が見積もれずにプログラムを完成させ顧客にソフトウエアを納品してしまう現状がある。
これらの現状でWebアプリケーションとデータベースを組合せた、Webサービスは特に深刻なSQLインジェクション攻撃が蔓延している状態となり、攻撃が成功したときの情報漏えい被害がデータベースを乗っ取られるのと同じ現状になってしまう為、静的なWebコンテンツやデータベースを使わない動的Webコンテンツと比べて被害が大きい。
【発明の開示】
【発明が解決しようとする課題】
【0003】
本発明は、上記の課題SQLインジェクション攻撃に対して、その根本的な問題を解決しセキュリティを確保するもので、また、既存のプログラム修正を最小限に抑えることを目的としている。SQLインジェクション攻撃の最大問題は、SQLの予約語が標準SQL規格として秘匿できない公の物であると共に、その利便性の良さの為Webアプリケーションに利用されるプログラミング言語から、直接SQL文をそのままデータベースサーバに投入してプログラム開発をしまうことである。
これらの問題において、一般にある解決策は、Webアプリケーションに対してブラウザからの入力(注入される文字列)をチェックして対策する方法か若しくは、Prepared Statement(プリペアードステートメント:準備済みSQL)と呼ばれる、SQLを予め準備させておいてブラウザの入力部分を全て文字列として強制的に注入させる事で対策するのが一般的である。
この対策は最初からプログラムを作成する場合には有効であるが必ずしも完璧とは呼べないし、既存の物を修正するには出回っているアプリケーションが多すぎて現実的ではない。
【実施例】
【0004】
図1は、本発明を示す概要図であり、本特許を採用したデータベースマネージメントシステム(DBMS)上で動作するようSQL構文を変更した例である。コードの一部が未対策1であると、通常ケース3では問題ないが、SQLインジェクション攻撃4を受けると、ORの後が常に真となりパスワードが異なっても認証されてしまう。しかし、対策後2の場合本来SQLの予約語であるORが、データベースマネージメントシステム側でSQLの予約語として解釈できない5ため、攻撃が成功しない。
(図1の中では、変更例1で上げていない
FROM → FROM_pgi29485
AND → AND_uifgkhi385932
を追加記述している。)
図2は、本発明の背景となるSQLインジェクション攻撃例の要因となるシステム構成を示す概要図である。図2に図示の如く、本発明の方法に係わるシステムは、Webサーバ6とそのWebサーバ6が利用するデータベース7とWebサーバ6にアクセスするクライアントPC8と、場合によってはWebサービスのレスポンス向上の為にWebサーバ6以外にWebアプリケーションのプログラムを実行するアプリケーションサーバ9が有る場合がある。また、Webサーバ6内にデータベース7を内蔵する場合もある。SQLインジェクションの攻撃は、主にインターネット上のクライアントPC8側から図1の用に行われる。
【0005】
データベースマネージメントシステムDBMSは、標準SQLのある程度の規格をサーポートしておりその予約語は共通である。SQLインジェクションはこの予約語を元に攻撃してくるので、この予約語を下記のパターンで変更し、攻撃する為の予約語が外部から推測できない事でセキュリティ耐性を上げることを目的としている。この時Webアプリケーションで利用され、クライアントPC8のブラウザから入力される文字に、当てはまる恐れのない(例、名前や固有名詞若しくは、自動で作成されるアカウントID)予約語として定義する。以下にSQLで使用される予約語の一部を例として上げる。
変更例1 SQL予約語にアンダーバーを設け意味不明の文字列を、
SELECT → SELECT_kgt2495kalsi
WHERE → WHERE_ktroaktuikxguf
OR → OR_lkgjparelig23
の様に全てのSQL予約語にアンダーバーを入力しハッシュ化した
文字を追加して、コマンドの推測ができない様にする。
可読性がある程度存在し、デバッグも比較的容易である。
変更例2 予約語の一部ないし全てを、
SELECT → SQL_kgt2495kalsi
WHERE → SQL_ktroaktuikxguf
OR → SQL_lkgjpareli3
の様にSQL予約語をSQLという文字 から始まる予約語に置換しアンダーバー以降の文字をハッシュ化した文字で定義する。可読性は低いがプログラムソースが入手されたとしても攻撃時解析に時間が掛かる。
変更例3 予約語の一部ないし全てを、
SELECT → SELECT_kgt2495kalsi
WHERE → WHERE_kgt2495kalsi
OR → OR_kgt2495kalsi
或いは
SELECT → kgt2495kalsi_SELECT
WHERE → kgt2495kalsi_WHERE
OR → kgt2495kalsi_OR
の様に全てのSQL予約語にアンダーバーを入力しハッシュ化した
共通の文字を追加して、コマンドの推測が出来ない様にする。また、
Webアプリケーションで利用するときには、このハッシュ化された
文字部分を最初に受け取るWebサーバ6プログラムで検索して削除する
ことで、安全性を更に高める。
例1,例2でも同様にハッシュ部分を検索し削除することは有効である。
【特許文献1】特開2006−120130号公報
【0006】
この実現には、既存のデータベースマネージメントシステム(DBMS)プログラムのソースコードの修正とリコンパイルが必要であり以下の方法が考えられる。
修正箇所はSQL予約語の部分と限定されており、データベースサーバ毎に独自に直接自動ないし手動で修正してリコンパイルを行う。
以下の方法はデータベースメーカが一度プログラムを修正してしまえばリコンパイルの必要が無い。
プログラムソースコードにデータベースを動作させるマシンの固有値を取り出してハッシュ値を作成しそれを予約語に追加する若しくは変更する。
データベースマネージメントシステム起動時に読み込む初期設定ファイル内に、予約語を独自の名前に切替えるように定義する。
【0007】
データベースマネージメントシステムプログラムの修正以外に、Webアプリケーションプログラムの修正も定義した予約語に合わせる必要がある。既に通常の予約語と修正前のデータベースで検証や稼動確認が済んでいるプログラムであれば、定義した予約語に合わせてWebアプリケーションプログラムのデータベースアクセス部分を修正するだけで、殆どのプログラムが動作するようになる。修正に関しては修正プログラムを作ることで一括変換も可能である。
1回の問い合わせでSQL文が解釈できる文字数は制限されている場合があるので、この点について予約語を予測不可能な物に修正すると文字数が増えてしまうので注意する必要が有る。
【0008】
データベースマネージメントシステムプログラムの修正後にも、修正前のSQL予約語も同じ実行環境で使用したい時がある。この時は、マルチユーザに対応したオペレーティングシステムのユーザ管理システムの支援を利用する。特定のユーザ権限でWebアプリケーションを起動後、個別SQL予約語でのみデータベースにアクセスさせる方法を設ける。これにより、システム開発ユーザは既存の予約語をそのまま利用でき、Webアプリケーションではセキュリティを考え独自のSQL予約語でプログラムが実行される様にする。
【特許文献2】特開2006−323614号公報
【0009】
万が一、Webアプリケーションプログラムが流出し解析されたとしても、データベースマネージメントシステムのプログラムの再コンパイル又は、初期設定ファイルの修正とWebアプリケーションのSQL部分の一括編集により直ぐに対策を打てる。
(Webアプリケーションプログラムの流出対策は別途必要である。)
【0010】
本特許を活用する目的でWebアプリケーションプログラムを新規に構築する場合、プログラムコード内のSQL部分に於いて変換ミスを無くす為に、変換予定文字列を予め取り決めて、開発することによりプログラムの再配布や修正に効率よく対応できるようにする。
【0011】
例として、SQLインジェクション対策がされたデータベースマネージメントシステム(DBMS)上でWebアプリケーションが正しく動作する為に、図1のSQL部分を簡単で確実に変換可能なようにする、プログラムコード記述方法として以下の考え方がある。
Webアプリケーション構築時のプログラムコードにSQL予約語を拡張子付きで記述していくことで、SQLの予約語であることをSQL予約語変換プログラムで容易に検索できるようにする。
通常のプログラムコードは、例えば以下の様になる。
query(“SELECT * FROM user WHERE UserID=‘$uid’ AND Password=‘$Passwd’“)
これを、プログラムコードからデータベース問い合わせコードと類推される部分のSQL予約語を変更するSQL予約語変換プログラム(支援ツール)で変換する方法と、そのSQL予約語変換プログラムの変換ミスを無くし実コードのメンテナンスを簡略化するために例として、
query(“SELECT%Suffix% * FROM%Suffix% user WHERE%Suffix% UserID=‘$uid’ AND%Suffix% Password=‘$Passwd’“)
という記述にしておけば、
query(“SELECT_kgt2495kalsi * FROM_pgi29485 user
WHERE_ktroaktuikxguf UserID=‘$uid’ AND_uifgkhi385932 Password=‘$Passwd’“)
というような変換が容易に行える。ブラウザからの入力値とWebアプリケーションのプログラムコードを完全に区別できれば、%Suffix%部分の変換をプログラム実行時に行うことも可能であるが性能面と、セキュリティ面を考慮する必要がある。
【図面の簡単な説明】
【0012】
【図1】本発明の概念(動作)図である。
【図2】本発明の背景を示す概念図である。
【符号の説明】
【0013】
1 アプリケーションのプログラムコードの一部対策前
2 アプリケーションプログラムコードの一部SQLインジェクション対策後
3 正常ケースユーザ名とパスワードの入力値
4 SQLインジェクション攻撃パターン例
5 SQL予約語を変更した対策済み
6 Webサーバ
7 データベースサーバ
8 クライアントPC
9 アプリケーションサーバ

【特許請求の範囲】
【請求項1】
データベースまたは、データベースマネージメントシステム(DBMS)においてサーバとクライアント間でデータの操作や定義を行うためのデータベース言語(SQL Structured Query Language:構造化問合せ言語)で使用される予約語の一部ないし全てをデータベースマネージメントシステム毎に変更することによって、Webアプリケーション等ネットワークでDBMSを使用するときに攻撃を受けるSQLインジェクション対策をおこなう解決方法。
【請求項2】
既存のSQLは標準化されており、そのSQLの歴史は長くプログラマやデータベースエンジニアも共通で解釈できる基盤ともなっている。しかし、攻撃方法もWebアプリケーションで利用されるデータベースに依存する事無く共通に使用できてしまうため、最近問題になっているSQLインジェクション対策が急務となっている。そこで、SQLの文法や構文を変えることなく、その予約語を個々のデータベースマネージメントシステム毎にデータベースマネージメントシステムプログラムの予約語部分を一部ないし全て変更して、コンパイルや起動時に読み込まれる初期設定ファイルのパラメータや、マシンの固有値を使って生成されるハッシュ値を追加して外部から予測不可能にしてしまう技術。
【請求項3】
Webアプリケーションで使用するプログラム関連ファイルに於いて、SQL文をそのまま記述している部分を、個々のシステムの個別予約語に自動変換するプログラムと今後開発されるWebアプリケーションに於いては、自動変換を更に容易にして変換ミスを無くし、Webアプリケーションで利用するプログラムの再配布を可能にする技術。また、本技術を応用し、Webアプリケーションのセキュリティホールやその他のシステムの脆弱性を使って攻撃される等、何ら可能方法で個別予約語情報が流出したとき、直ぐに変更し再設定を可能にする技術。

【図1】
image rotate

【図2】
image rotate