Comments
Description
Transcript
このページの PDF
ISEC セキュア・プログラミング講座 IPA IPA 2-2. スクリプトに埋め込まれたDBパスワード 第 2 章 セキュアデータベースプログラミング [2-2.] スクリプトに埋め込まれた DB パスワード DBアプリケーションをスクリプト言語で記述することは良く行われることであ るが,DBアカウントのパスワードをスクリプト内に埋め込んでいると,スクリ プトのソースコードが漏洩したときに大きな問題になる。 ● ● ● スクリプトは漏洩するものと覚悟しよう ASP や CGI などのサーバサイドスクリプトのソースファイルが漏洩するという脆弱性はたびたび報告されて きた。その主な原因は次のようなものであり,すべてサーバ管理者やプログラム開発者のミスによるもので ある。 (1)Web サーバの設定ミス (2)Web サーバソフトウェアの脆弱性 (3)CGI プログラムの脆弱性 Web サーバの設定ミス Webサーバの設定ミスでは拡張子マッピングの設定ミスが代表的な例だ。.cgiなどの拡張子をスクリプトとし て割り当てていない場合,Web サーバはスクリプトファイルの内容(ソースコード)をそのままテキストと してブラウザへ送信してしまう。Web サーバソフトウェアのバージョンアップやサーバハードウェアの交換 など,運用における設定ミスが多い。 Web サーバソフトウェアの脆弱性 Web サーバソフトウェアの脆弱性では Internet Information Services(IIS)の脆弱性が有名だ。ファイルの内容 を漏洩してしまう脆弱性を少し拾い上げてみた。最近になってもやはりさまざまな原因でファイルの内容が 漏洩している。 ・1997 年 Microsoft IIS Appended Dot Script Source Disclosure Vulnerability ・2000 年 Microsoft IIS 4.0/5.0 Source Fragment Disclosure Vulnerability ・2000 年 Microsoft IIS 5.0 "Translate: f" Source Disclosure Vulnerability ・2001 年 [IIS]URL の最後に特定の文字が存在するとページ内容が表示される ・2001 年 Microsoft IIS File Fragment Disclosure Vulnerability ・2001 年 Microsoft IIS Unicode .asp Source Code Disclosure Vulnerability IIS に限らず Apache でも同様な脆弱性が報告されている。 ・1999 年 NCSA/Apache httpd ScriptAlias Source Retrieval Vulnerability ・2000 年 Apache Rewrite Module Arbitrary File Disclosure Vulnerability ・2000 年 Apache Web Server with Php 3 File Disclosure Vulnerability ・2002 年 Apache Win32 PHP.EXE Remote File Disclosure Vulnerability -1- Copyright Copyright © 2002 IPA, All Rights Reserved. ISEC セキュア・プログラミング講座 IPA IPA 2-2. スクリプトに埋め込まれたDBパスワード CGI プログラムの脆弱性 CGI プログラムの脆弱性では入力値チェックの不備によるものが多い。ブラウザから受信したパラメタを チェックせずに,ファイルパスとして Perl の open 文に渡してしまうなどである。"../../etc/passwd" などが与え られるとパスワードファイルの内容が漏洩する。『4-1. ファイルオープン時のパスにご用心』でも解説してい るので参考にしていただきたい。 このように,スクリプトファイルの内容(ソースコード)は何らかの問題により漏洩してしまうものだと認 識したほうがよい。 データベースパスワードはスクリプト内に埋め込んではいけない データベースアクセスを行う簡単な ASP スクリプトを作成してみた。画面1のテーブルが Web サーバ上の データベースに格納されており,スクリプトファイル testdb.asp(リスト1)により画面2のように Web ブラ ウザからテーブルを参照できる。 ここで使用している Web サーバは IIS 5.0 で Windows 2000 Professional に添付のものであ る。実行例1はIISの次の脆弱性を悪用してみ た結果である。 ・2000 年 Microsoft IIS 5.0 "Translate: f" Source Disclosure Vulnerability 実行例1の上段の枠は攻撃例である。telnetコ マンドから簡単に実行できる。下段の枠では スクリプトファイルtestdb.aspの内容がそのま ま取得できていることを確認できる。本来な らばスクリプトファイルの内容ではなく,そ の実行結果の HTML が出力されなければなら ない。スクリプトファイルの内容が漏洩する と,ファイル中に埋め込まれたデータベース 接続情報であるDSN (データソース名) ,USER (データベースユーザ名) ,PASSWORD(デー タベースパスワード)が漏洩してしまう。 データベースアカウントやパスワードは,攻 撃者にとって侵入の手がかりとなる重要な情 報だ。このようにスクリプトファイル中に データベースパスワードなどの重要な情報を 埋め込んではならない。 リスト1 サンプルスクリプトファイル,testdb.asp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <%@ LANGUAGE="VBSCRIPT" %> <HTML> <HEAD><TITLE> テーブル表示 </TITLE></HEAD> <BODY> <% DSN = "IPA" USER = "user" PASSWORD = "password" Dim db Dim statement Set db=Server.CreateObject("ADODB.Connection") db.Open DSN, USER, PASSWORD statement = "SELECT HINMEI, KAKAKU FROM SHOUHIN" set rs = db.execute(statement) %> <TABLE border="0" cellspacing="1" bgcolor="black"> <% rs.MoveFirst Do until rs.eof %> <TR bgcolor="white"> <TD ><%=rs(0).Value%></TD> <TD><%=rs(1).Value%></TD> </TR> <% rs.MoveNext loop %> </TABLE> <% rs.Close db.Close %> </BODY> </HTML> 画面2 testdb.asp による出力例 画面1 SHOUHIN テーブル -2- Copyright Copyright © 2002 IPA, All Rights Reserved. ISEC セキュア・プログラミング講座 IPA IPA 2-2. スクリプトに埋め込まれたDBパスワード 実行例1 IIS 5.0 の脆弱性を利用して ASP ファイルの内容を取得した例 重要な情報は Web 公開ディレクトリ階層の外に配置しよう Webサーバの設定ミスやWebサーバソフトウェアの脆弱性では,Web公開ディレクトリ下に置かれたファイ ルの内容が漏洩することが多い。これまでの経験則から,Web 公開ディレクトリ階層の外に置かれたファイ ルのほうが漏洩する可能性は低いと言える (注1)。重要な情報はWeb公開ディレクトリ階層の外にファイルを 準備し,そのファイル中に入れておくことで,情報漏洩の危険性を緩和することができる。 (注1・あくまで程度の問題である。CGI プログラムなどに重度の脆弱性がある場合,システム全体のファイル がアクセス可能になってしまうこともある。 ) Unix ホスト上の Perl アプリケーションがデータベースに接続するサンプルを紹介する。データベースへ接続 するための情報はWeb公開ディレクトリ階層の外,/etc/my_db_info.datファイルへ配置する。リスト2に/etc/ my_db_info.dat ファイルの内容を示す。 リスト2 データベース接続情報,/etc/my_db_info.dat 1 2 3 $db_DSN = "DBI:mysql:ipa"; $db_USER = "user"; $db_PASSWORD = "password"; リスト3がmy_db_info.datを読み込みデータベース接続するスクリプトファイルである。5行目のrequire文に より /etc/my_db_info.dat ファイルを読み込んでいる。これによりデータベース接続情報が変数 $db_DSN, $db_USER,$db_PASSWORD に設定される。8 行目の connect()関数でこれらのデータベース接続情報に基づ き,データベースに接続している。 -3- Copyright Copyright © 2002 IPA, All Rights Reserved. ISEC セキュア・プログラミング講座 IPA IPA 2-2. スクリプトに埋め込まれたDBパスワード リスト3 データベース接続情報を含まないスクリプトファイル 1 2 3 4 5 6 7 8 #!/usr/local/bin/perl use DBI; # データベース接続情報(DSN, USER, PASSWORD)を取得 require "/etc/my_db_info.dat"; # データベースへ接続する $dbh = DBI->connect($db_DSN, $db_USER, $db_PASSWORD) or die; Web 公開ディレクトリ階層の外に用意したファイルにデータベース接続情報などの重要な情報を配置するこ とにより,リスト3のスクリプトファイルにはこれらの情報を埋め込む必要がなくなった。万一何らかの問 題によりこのスクリプトファイルの内容が漏洩しても,重要な情報が漏洩することはない。スクリプトファ イル内にこれらの情報が含まれている場合に比べ大幅に安全である。しかしWeb公開ディレクトリ階層の外 にあるファイルへアクセスできてしまうなんらかの脆弱性があった場合にはやはり,情報漏洩してしまうこ とに留意していただきたい。 WindowsNT/2000 ならレジストリに配置しよう WebサーバのOSがWindowsNT/2000である場合,重要な情報をレジストリに配置することができる。ファイ ルに比べレジストリを扱うためには特別な処理が必要である。そのためWebサーバの設定ミスやWebサーバ の脆弱性などから情報が漏れることは考えにくい。CGI プログラムの脆弱性からも Web 公開ディレクトリ階 層の外に配置したファイルに比べ漏洩する可能性は低い。 画面1,画面2,実行例1で紹介したサンプルASPスクリプトを書き直してみる。データベース接続情報の DSN(データソース名) ,USER(データベースユーザ名) ,PASSWORD(データベースパスワード)を画面 3 のようにレジストリに配置してみた。それぞれのレジストリパスは以下のとおりである。 ・HKLM¥SOFTWARE¥IPA¥db_DSN ・HKLM¥SOFTWARE¥IPA¥db_USER ・HKLM¥SOFTWARE¥IPA¥db_PASSWORD 画面3 データベースパスワードなどをレジストリに配置 (HKEY_LOCAL_MACHINE¥SOFTWARE¥IPA¥) 修正した ASP スクリプトをリスト4に示す。6 ∼ 9 行目でレジストリから読み出しを行っている。6 行目でレ ジストリアクセス用の WshShell オブジェクトを生成し,7 ∼ 9 行目で WshShell オブジェクトを経由して各レ ジストリ値を取得している。WshShell オブジェクトは Windows Script Host(WSH)という Windows 管理ツー -4- Copyright Copyright © 2002 IPA, All Rights Reserved. ISEC セキュア・プログラミング講座 IPA IPA 2-2. スクリプトに埋め込まれたDBパスワード ルの一部で,WshShell オブジェクトを使用すると,外部プログラムの実行やレジストリ内容の操作,システ ムフォルダへのアクセスなどが可能だ。6∼9行目の手順はレジストリから値を読み込むのによく利用される 手順である。Windows Script Host については参考文献『Windows Script Host』,WshShell については参考文献 『WshShell オブジェクト』を参照していただきたい。 リスト4 レジストリからデータベース接続情報を取得するように改善(reg_testdb.asp) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 <%@ LANGUAGE="VBSCRIPT" %> <HTML> <HEAD><TITLE> テーブル表示 </TITLE></HEAD> <BODY> <% Set WSHObj = Server.CreateObject("WScript.Shell") DSN = WSHObj.RegRead("HKLM\Software\IPA\db_DSN") USER = WSHObj.RegRead("HKLM\Software\IPA\db_USER") PASSWORD = WSHObj.RegRead("HKLM\Software\IPA\db_PASSWORD") Dim db Dim statement Set db=Server.CreateObject("ADODB.Connection") db.Open DSN, USER, PASSWORD statement = "SELECT HINMEI, KAKAKU FROM SHOUHIN" Set rs = db.execute(statement) %> DNS=<%=DSN%><BR> USER=<%=USER%><BR> PASSWORD=<%=PASSWORD%><BR> <TABLE border="0" cellspacing="1" bgcolor="black"> <% rs.MoveFirst Do until rs.eof %> <TR bgcolor="white"> <TD><%=rs(0).Value%></TD> <TD><%=rs(1).Value%></TD> </TR> <% rs.MoveNext loop %> </TABLE> <% rs.Close db.Close %> </BODY> </HTML> レジストリから ← DSN を取得 ← USER を取得 ← PASSWORD を取得 レジストリへデータベース接続情報などの重要な情報を配置することにより,リスト4にはこれらの情報を 埋め込む必要がなくなった。万一何らかの問題によりこのASPファイルの内容が漏洩しても,重要な情報が 漏洩することはない。ただしレジストリパスは ASP ファイルに含まれており,これは漏洩してしまう。ASP ファイル内にデータベースパスワードがある場合に比べれば大幅に安全であるが,絶対に安全というわけで はないことに留意すべきである。 まとめ ASP や CGI などのサーバサイドスクリプトのソースファイルはさまざまな要因により漏洩してしまうものと 認識したほうがよい。そのためスクリプトファイル中にデータベースパスワードなどの重要な情報を含めて はならない。Web 公開ディレクトリ階層の外にファイルを準備し,そのファイル中に重要なパラメタを配置 し,これをスクリプトファイルから読み込むとよい。またWindowsの場合にはレジストリを利用する方法が ある。 -5- Copyright Copyright © 2002 IPA, All Rights Reserved. ISEC セキュア・プログラミング講座 IPA IPA 2-2. スクリプトに埋め込まれたDBパスワード 関連記事 『4-1. ファイルオープン時のパスにご用心』 参考文献 『[IIS]URL の最後に特定の文字が存在するとページ内容が表示される』 ,2001 年 http://www.microsoft.com/japan/support/kb/articles/JP233/3/35.asp 『Windows Script Host』 http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/script56/ wsoriWindowsScriptHost.htm 『WshShell オブジェクト』 http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/script56/ wsobjwshshell.htm 『セキュア Web プログラミング ASP 編 Part 1』, 『同 Part 2』佐名木智貴,2001 年 http://www.trusnet.com/secinfo/docs/webprog1/index.htm, http://www.trusnet.com/secinfo/docs/webprog2/index.html 『Microsoft IIS Appended Dot Script Source Disclosure Vulnerabilit』 (英文),1997 年 http://www.securityfocus.com/bid/2074 『Microsoft IIS 4.0/5.0 Source Fragment Disclosure Vulnerability』(英文),2000 年 http://www.securityfocus.com/bid/1488 『Microsoft IIS 5.0 "Translate: f" Source Disclosure Vulnerability』(英文),2000 年 http://www.securityfocus.com/bid/1578 『Microsoft IIS File Fragment Disclosure Vulnerability』(英文),2001 年 http://www.securityfocus.com/bid/2313 『Microsoft IIS Unicode .asp Source Code Disclosure Vulnerability』(英文),2001 年 http://www.securityfocus.com/bid/2909 『NCSA/Apache httpd ScriptAlias Source Retrieval Vulnerability』(英文),1999 年 http://www.securityfocus.com/bid/2300 『Apache Rewrite Module Arbitrary File Disclosure Vulnerability』(英文),2000 年 http://www.securityfocus.com/bid/1728 『Apache Web Server with Php 3 File Disclosure Vulnerability』(英文),2000 年 http://www.securityfocus.com/bid/2060 『Apache Win32 PHP.EXE Remote File Disclosure Vulnerability』(英文),2002 年 http://www.securityfocus.com/bid/3786 -6- Copyright Copyright © 2002 IPA, All Rights Reserved.