Dreamweaver使いが
知っておきたいセキュリティ
株式会社ビジネス・アーキテクツ 太田 良典
私の所属
• 株式会社ビジネス・アーキテクツ (bA) • 大規模企業サイトの構築を得意とする
4
仕事でやっていること
• マークアップデザインエンジニア – HTML や CSS の設計、ガイドライン • 弊社内では、変な HTML を書くと私に怒られるという 都市伝説がある – Webアクセシビリティ • 企業の「アクセシビリティ指針」策定 – ユーザビリティ • サイト設計 / UI 設計 /情報設計諸々こっそりやっていること
• 脆弱性の発見と届出
– 経済産業省の「情報セキュリティ早期警戒パート ナーシップ」の制度を利用していろいろ届出
6
届出の例
• それなりに報道された りしたケースも
届出件数
• 届出件数 : たぶん150件くらい – 国内の届出は約1000件なので、シェア約15% – ウェブアプリケーションの届出に絞るとシェア20% 超 • 第2回IPA賞 (情報セキュリティ部門) 受賞 – 理由 : 届出件数日本一 受賞したりしている時点で、もう「こっそり」でおねがい
• 情報を不正アクセスから守るためには、攻撃 側の手法を知る必要があります • そのため、この話の中にも攻撃手法の解説 が出てきますが、絶対に悪用しないでください • 不正アクセス行為は、法令によって処罰され ることがありますお話の流れ
• DreamweaverのPHPサンプル • 脆弱性とは?
• 脆弱性事例の紹介 • おわりに
14
16
サンプルフォームの問題
18
20
22
拡大
• <table> がそのままソース中に出力されている • これが table要素の開始タグとして解釈された
サンプルフォームの問題
26
28
そのときのソース
• 今度は <script …… と書き込まれている • script要素として解釈されてしまい、alert() がスクリ プトとして実行された • 任意のスクリプトを書き込むことが出来てしまうalert() が出るだけなら害はない?
• alert() が 10000回実行されたらどうか – ダイアログが出ているとブラウザを閉じることもで きない – 俗に言う「ブラクラ」 • 利用者の Cookie を読み取って別のサイトに 送ることもできる – Cookie にセッションID が含まれていた場合、漏 洩するとセッションハイジャックの危険があるサンプルフォームの問題
32
そのときのソース
• 今度は <iframe …… と書き込まれている • 属性によって、幅・高さ共に100%に設定 • すると……
34
結論
• Dreamweaver のチュートリアルで作られるサンプ ルフォームは、悪用される危険がある – サンプルフォームをそのまま公開する人はいないと思い ますが…… – 同じような作り方をしてしまうと危険 これはクロスサイトスクリプティング脆弱性
原因
• 入力された文字をそのまま出力している • 「<」が入力されてもそのまま出力 – 「<」はタグの開始区切り子として使用される文字 • 「<……」が入力されると、HTMLのマークアッ プとして解釈されてしまう38
対策
• HTML のマークアップとして解釈されるおそ れがある文字を出力しない • 3つの方法 – 文字を削除する – 文字を置き換える – エスケープする文字を削除する
• 「<」を削除してしまう方法 • 「<table>が……」→table>が…… • 利用者が意図した表示にならないことがある – コメントに < が含まれることはあり得る。 – たとえばプログラムの話題。「if (a <= 0)」と書くと、 「if(a = 0)」と表示されてしまう40
文字を置き換える
• 「<」を別な文字に置き換えてしまう方法 – たとえば全角の「<」 • 「<table>が……」→<table>が…… • いちおう表示されるが、やはり利用者が意図 した表示にならないことがある • かっこ悪い文字をエスケープする
• 文字参照を使用すると、「<」をマークと認識さ れないように表示することができる – 文字実体参照 < – 数値文字参照 < もしくは > – 文字実体参照を使用するのが一般的 • 利用者の入力したままが表示される42
修正対応
• 文字をエスケープするのが望ましい • PHP の場合、エスケープのための関数 htmlspecialchars() が用意されている • 以下を変換 – 「<」→< – 「>」→> – 「”」→" – 「&」→&修正箇所
46
修正後
ぜいじゃくせい
×きじゃくせい (危ではありません)
50 経済産業省告示第二百三十五号 「ソフトウエア等脆弱性関連情報取扱基準」 1.脆弱性 ソフトウエア等において、コンピュータウイル ス、コンピュータ不正アクセス等の攻撃により その機能や性能を損なう原因となり得る安全 性上の問題箇所。ウェブアプリケーションに あっては、ウェブサイト運営者がアクセス制御 機能により保護すべき情報等に誰もがアクセ スできるような、安全性が欠如している状態 を含む。
「脆弱性」まとめ
• 読みは「ぜいじゃくせい」 • 情報セキュリティの分野では、ソフトウェアな どのセキュリティ上の問題点を指す – 「セキュリティホール」も同義 • 「ソフトウェアの脆弱性」のほか、 「Webアプリケーションの脆弱性」というものも ある52
54
届出件数
56
脆弱性の印象と実際
• ニュース等で目にするのはソフトウェアの脆 弱性の方が多い • しかし、実際にはWebアプリケーションの脆 弱性の方がたくさん発見されている事例1 : TBCのケース
62
アクセスしてみると
• 書き込みにある URL
http://www.tbc.co.jp/cgi/
64
そして
• 一覧を見ていくと、多数のCSV ファイルを発 見 • CSVファイルにアクセス制限などはなく、誰で もアクセスできた • さまざまなデータが格納されていた – アンケートのデータ – 求人応募のデータ etc.手法の解説
66
「フォースフル・ブラウジング」とは
• 無理やり(forceful) 閲覧 (browsing)。
• 閲覧されることを意図していないものを、強制 的に閲覧する手法
具体的な方法
• ブラウザのアドレスバーに URL を入れる 以上。
68
フォースフル・ブラウジングの原理
• ブラウザのアドレスバーに URL を入れれば、 その URL にアクセスできる – あたりまえですが…… • どこからもリンクされていない URL であって も、管理者がアクセスされることを想定してい ない URL であっても、自由にアクセスできる 「リンクされていないから見られないはず」 という判断は NG70
注意点
• 公開ディレクトリに重要なデータファイルを置 かないこと!! – 特に CGI プログラムの設計時に注意 • サーバ移行時の罠にも要注意 – 今までは見られなかったディレクトリが…… – cgi-bin にも置かないほうが良い事例2 : カカクコムのケース
76
事件の経緯(1)
• アンチウイルスソフト NOD32 のユーザがサ イトにアクセスすると、ウイルス警告が表示さ れた • サイトトップページがひそかに改竄され、ウイ ルスが仕込まれていたことが判明 • のちに、ユーザのメールアドレス約25000件 が漏洩していたことも判明事件の経緯(2)
• 中国からの留学生が逮捕され、カカクコムへの不正 アクセスを認める • ただし、この留学生は閉鎖の直接原因ではない – 閉鎖の原因となった攻撃の犯人は不明 • 以前から大量の不正アクセスが行われていた模様 – 「実際には単一の犯人ではなく、入れ替わり立ち代わり異 なる犯人による小規模のハッキングを受けてきたことが 明らかになってきた」 • 「備える心」が大事――カカクコムのインシデントから得られた教訓78
その後
• カカクコムは事件の詳細を 公表していない • 報道、インタビューその他 の情報によれば、 「SQLインジェクション」 によるものだったと言われ ている手法の解説
80
SQLインジェクションとは
• SQL = Structured Query Language
– データベースに問い合わせを行うための言語
• Injection = 注射、注入
• SQL文の中に悪意あるデータを「注入」するこ とで、SQL文の内容を改竄する手法
起きることの例
• 不正なログイン • 本来は取得できないはずのデータを取得 • データの消去 • データの改竄 • サーバ上で任意のコマンドを実行 – xp_cmdshell 拡張ストアドプロシージャ危険
SQL文の例
SELECT * FROM user
WHERE user=‘admin’ AND pass=‘root’
• SELECT * FROM user
– 「user」という名前のテーブルから全データを取得
• WHERE user=‘admin’ AND pass=‘root’
– user, pass の値が特定の条件を満たすものに絞り込む
84
ところで……
SELECT * FROM user WHERE
user=‘admin’ AND pass=‘root’
• ユーザがフォームから入力した値は、 「’」(単引用符、シングルクォート)
単引用符を入れてみると……
SELECT * FROM user
WHERE user=‘Let’s Note’ AND pass=‘’
• 入力されたのが引用符だったため、引用符の 対応関係がおかしくなっている
– ちなみに「’Let’’s Note’」とする必要があります
86
さらに……
SELECT * FROM user
WHERE user=‘’ OR 1==1--’ AND pass=‘’
• 「--」の後ろはコメントとみなされて無視される ため、以下の SQL 文と等価になる
SELECT * FROM user WHERE user=‘’ OR 1==1
その結果
SELECT * FROM user
WHERE user=‘’ OR 1==1 • これは、user=‘’ が成立するか、あるいは 1==1 が成立するレコードを取ってくる • 1==1 は常に成立するので、全てのレコード が取得できる
非常にまずい感じの誤動作
注意点
• プログラム中で SQL 文を組み立てたりしな いのがベスト – Prepared Statement によるバインドメカニズム を使用する • それが無理なら、確実にエスケープする – 「’」→「’’」 「¥」→「¥¥」 – DB に応じてさまざまな変換関数がある • たとえば mysql_real_escape_string()90
事例3 : Yahoo! メールのケース
ログイン後
• Web上でメールを読ん だり書いたりできる
• HTMLメールも表示で きる
事件1 : フィッシング
• 普通は、アドレスバーを 見たりすれば偽サイト を識別できる • しかし、本物サイト上で フィッシングを行う「巧 妙」な手口が出現96
事件2 : ウイルスメール
• Yahoo! メールを狙った ウイルスメールが発生
手法の解説
98
フィッシングの手口
• 攻撃者は、スクリプトを含む HTML メールを 送信 • メールを表示すると、攻撃者のスクリプトが実 行され、ページの内容がひそかに改竄される – iframe要素が挿入され、yahoo!メールの本物サ イトの中に攻撃者の用意したコンテンツが表示さ れた – ブラウザのアドレスバーの URL は本物のままウイルスメールの手口
• メールを開くと、やはりスクリプトが実行される • そして、自動的に他のユーザにメールを送信 してしまう • そのメールにもやはりスクリプトが……。増殖
100
何故スクリプトが動いた?
• 通常、HTMLメールに含まれるスクリプトは実 行されないようにする必要がある • Yahoo!メールでも、原則としてスクリプトは実 行されないような処理をしていた • しかし、その処理に欠陥があり、スクリプトが 実行されてしまったクロスサイトスクリプティングとは
• Cross Site Scripting / XSS
– 「CSS」と略すと Cascading Style Sheet と混同 されるので「XSS」と呼ぶ • ウェブサイト上に外部からスクリプトを挿入さ れ、そのスクリプトが動作してしまうこと – 攻撃者の用意したスクリプトが、ターゲットのドメ イン上で実行される – 広義には、スクリプトを含んでいない HTML の改
102
何がまずいのか
• 普通、スクリプトで別ドメインのコンテンツを操 作することはできない • XSS脆弱性があるとターゲットのドメイン上で スクリプトが動くので、さまざまな攻撃ができ てしまう – フィッシング – 不正な操作 (ウイルスメール送信) – Cookie読み出しによるセッションハイジャック104
注意点
• 外部から入力された値をそのまま HTML に 出力しないこと!
• 文字参照に変換すればだいたい OK
– 「<」→「<」 「>」→「>」 「”」→「"」 「&」→「&」
• PHP の場合、htmlspecialchars()
– addslashes() では駄目! (というか意味が無い)
特に難しい場合
• HTMLメールを「安全に」表示するのは非常 に難しい!! • スクリプトが動作するような記述は無数にあ るが、その全てを考慮する必要がある – イベントハンドラ、javascript: スキーム、url() • ブラウザの挙動まで考慮する必要がある – expression() 、全角の expression()106
108
知っておいてほしいこと
• Dreamweaver を使うと、PHP のアプリケー ションがとても簡単に作れる • しかし安全に動くものを作るとなると、 必ずしも簡単ではない • 脆弱性のあるアプリケーションを公開し、 悪用されると大変なことが起きる • 公開するアプリケーションは、 安全性に注意して実装するべきおすすめサイト (技術情報)
• 安全なウェブサイトの作り方 改訂第2版 – http://www.ipa.go.jp/security/vuln/websecurity. html • IPA ISEC セキュア・プログラミング講座 – http://www.ipa.go.jp/security/awareness/vend or/programming/ • SecurIT 産業技術総合研究所 グリッド研究 センター セキュアプログラミングチーム110
昨日の常識は今日の非常識
• 次々に発覚する脆弱性 • どんどん出現する新手法 • 時代の変遷、手法の変遷常に最新情報を追う必要がある
どうやって情報を集めるか
• 主に Webサイト – やはり Web サイトの方が情報が早い – Webのセキュリティに関しては、そもそも Web サ イトが一次情報源であることが多い • セキュリティ系、ITニュース系のサイトをこま めにチェックするのが吉112