[S3] 今 日 こそわかる 安 全 なWebアプリの 作 り 方 2010 HASHコンサルティング 株 式 会 社 徳 丸 浩 Twitter id: @ockeghem Copyright 2008-2010 HASH Consulting Corp. 1
アジェンダ 本 日 の 構 成 脆 弱 性 の 分 類 Webアプリの 構 造 と 脆 弱 性 の 原 因 箇 所 入 力 では 何 をすればよいのか SQLインジェクション 対 策 の 考 え 方 と 実 際 原 理 の 話 (グローバル) 文 字 コードの 話 (グローバル&ローカル) ケータイWebアプリのセキュリティ(ローカル) 議 論 の 焦 点 Webアプリケーションのセキュリティ 施 策 の 考 え 方 グローバル v.s. ローカル 対 策 の 歴 史 とあるべき 姿 Copyright 2008-2010 HASH Consulting Corp. 2
徳 丸 浩 の 自 己 紹 介 経 歴 1985 年 京 セラ 株 式 会 社 入 社 1995 年 京 セラコミュニケーションシステム 株 式 会 社 (KCCS)に 出 向 転 籍 2008 年 KCCS 退 職 HASHコンサルティング 株 式 会 社 設 立 経 験 したこと 京 セラ 入 社 当 時 はCAD 計 算 幾 何 学 数 値 シミュレーションなどを 担 当 その 後 企 業 向 けパッケージソフトの 企 画 開 発 事 業 化 を 担 当 1999 年 から 携 帯 電 話 向 けインフラ プラットフォームの 企 画 開 発 を 担 当 Webアプリケーションのセキュリティ 問 題 に 直 面 研 究 社 内 展 開 寄 稿 などを 開 始 2004 年 にKCCS 社 内 ベンチャーとしてWebアプリケーションセキュリティ 事 業 を 立 ち 上 げ その 他 現 在 1990 年 にPascalコンパイラをCabezonを 開 発 オープンソースで 公 開 大 学 時 代 のPascal 演 習 がCabezonでした という 方 にお 目 にかかることも HASHコンサルティング 株 式 会 社 代 表 http://www.hash-c.co.jp/ 京 セラコミュニケーションシステム 株 式 会 社 技 術 顧 問 http://www.kccs.co.jp/security/ 独 立 行 政 法 人 情 報 処 理 推 進 機 構 非 常 勤 研 究 員 http://www.ipa.go.jp/security/ Copyright 2010 HASH Consulting Corp. 3
脆 弱 性 の 分 類 元 々セキュリティと 無 関 係 なバグが 脆 弱 性 となるもの SQLインジェクション クロスサイト スクリプティング OSコマンドインジェクション HTTPヘッダインジェクション セキュリティの 考 慮 不 足 ディレクトリ トラバーサル(アクセス 制 御 不 足 ) クロスサイト リクエストフォージェリ( 画 面 遷 移 のチェック 洩 れ) 認 証 の 不 備 認 可 の 不 備 狭 義 の 脆 弱 性 ではないもの HTTPSを 使 っていない ファイアウォールがない パスワードをデータベース 上 で 暗 号 化 していない Copyright 2008-2010 HASH Consulting Corp. 4
Webアプリの 構 造 と 脆 弱 性 の 原 因 箇 所 Copyright 2008-2010 HASH Consulting Corp. 5
対 策 の 考 え 方 の 変 遷 第 1 段 階 : 攻 撃 手 法 に 着 目 し 攻 撃 の 手 段 を 封 じるアプローチ キーワード:サニタイジング メタ 文 字 < や ; に 着 目 危 険 な 文 字 として 入 力 から 削 除 してしまう 第 2 段 階 : 脆 弱 性 が 生 まれる 根 本 原 因 に 注 目 し 原 因 をつぶす キーワード:サニタイズ 言 うなキャンペーン メタ 文 字 はエスケープするアプローチ メタ 文 字 に 頼 らない 記 述 ができればベスト Prepared Statement DOM シェルを 通 さない 外 部 コマンド 起 動 安 全 なウェブサイトの 作 り 方 にまとめられる 第 3 段 階 :ミドルウェアの 組 み 合 わせを 考 慮 した 現 実 的 な 書 き 方 キーワード: 安 全 なSQLの 呼 び 出 し 方 バインド 機 構 を 使 っていてもSQLインジェクション 脆 弱 性 が 混 入 する なぜ 脆 弱 性 が 混 入 するのか どうすれば 安 全 なのか Copyright 2008-2010 HASH Consulting Corp. 6
入 力 値 検 証 ではなにをすべきか? 入 力 値 検 証 はセキュリティのためにするのではない 入 力 値 検 証 は 要 件 に 従 うかどうかのチェック 電 話 番 号 例 :099-9999-9999 メールアドレス 例 : foo@eaxmple.jp 氏 名 例 : 鈴 木 一 朗 文 字 種 と 文 字 数 のチェックが 一 般 的 入 力 値 検 証 ではSQLインジェクションなどの 対 策 はできない union select a,b,c などを 常 にエラーにできるわけではない 現 実 問 題 O reilly O brien など アポストロフィつきの 名 前 は 珍 しくな い 入 力 値 検 証 は 保 険 的 対 策 としては 有 効 本 質 的 な 対 策 が 洩 れた 場 合 のセーフティネットとして( 運 が 良 ければ) 制 御 文 字 (メタ 文 字 ではない)による 攻 撃 への 防 御 文 字 コードの 問 題 への 対 策 ( 但 し 入 力 値 検 証 だけでは 不 十 分 ) Copyright 2008-2010 HASH Consulting Corp. 7
入 力 値 検 証 の 正 規 表 現 の 具 体 例 チェック 内 容 数 字 1 文 字 以 上,8 文 字 以 下 英 字 0 文 字 以 上,10 文 字 以 下 F または M 制 御 文 字 以 外 100 文 字 以 下 制 御 文 字 以 外 100 文 字 以 下 ただし, 改 行 とタブは 認 める 正 規 表 現 / A[0-9]{1,8} z/ / A[a-z]{0,10} z/i / A(F M) z/ / A P{Cc}{0,100} z/ / A[ t r n P{Cc}]{0,100} z/ 制 御 文 字 以 外 という 正 規 表 現 は P{Cc}と 書 ける PHPのmb_eregの 場 合 は [[:^cntrl:]] 文 字 列 の 先 頭 末 尾 は A と z で 指 定 すること ^と$は 行 の 先 頭 末 尾 $は 行 末 の 改 行 にマッチするので 特 に 注 意 M 文 字 以 上 N 文 字 以 下 は {M,N}で 指 定 ( 量 指 定 子 ) Copyright 2008-2010 HASH Consulting Corp. 8
入 力 値 検 査 をしなかった 場 合 の 問 題 アプリケーションの 処 理 が 進 んだ 後 でエラーになると データベー スの 不 整 合 などを 起 こしやすい 例 : 数 値 であるべき 項 目 に 英 字 や 記 号 が 入 っているケース 制 御 文 字 による 攻 撃 ヌルバイト 攻 撃 (ヌル 文 字 ) メールヘッダインジェクション( 改 行 ) HTTPヘッダインジェクション( 改 行 ) 入 力 値 で 対 策 するのはおかしいが 保 険 的 にやっておくとよい 壊 れた 文 字 コードによる 攻 撃 半 端 な 先 行 バイトによる 攻 撃 UTF-8の 非 最 短 形 式 文 字 コードの 不 正 は 処 理 を 継 続 するべきでないので 入 力 検 証 で 対 策 す る 合 理 性 がある Copyright 2008-2010 HASH Consulting Corp. 9
制 御 文 字 による 攻 撃 例 (ヌルバイト 攻 撃 ) XSS 脆 弱 なサンプル 攻 撃 例 :p=1%00<script>alert(document.cookie)</script> Copyright 2008-2010 HASH Consulting Corp. 10
インジェクション 系 脆 弱 性 対 策 は 出 力 時 のエスケープ SQLインジェクション Prepared Statement(メタ 文 字 を 不 要 にする) Quoteメソッドにエスケープ クロスサイト スクリプティング(XSS) HTMLメタ 文 字 のエスケープ JavaScriptの 動 的 生 成 を 避 ける OSコマンド インジェクション 外 部 コマンドの 呼 び 出 しを 避 ける シェル 経 由 で 外 部 コマンドを 呼 び 出 さない HTTPヘッダインジェクション HTTPヘッダ 生 成 に 高 レベルのAPIを 使 う 改 行 文 字 のチェックを 行 う メールヘッダインジェクション メール 生 成 にsendmailコマンドを 呼 ばず 高 水 準 のAPIを 使 う 改 行 文 字 のチェックを 行 う Copyright 2008-2010 HASH Consulting Corp. 11
正 しくないSQLインジェクション 対 策 の 今 昔 Copyright 2008-2010 HASH Consulting Corp. 12
正 しくない 例 1(2001 年 ) 正 しい これは 余 計 でもこれは 2001 年 の 記 事 だから 実 践! セキュアなWebプログラミング 日 経 オープンシステム2001 年 5 月 号 から 引 用 Copyright 2008-2010 HASH Consulting Corp. 13
正 しくない 例 2(2008 年 )??? これは 無 意 味 Billy Hoffman Bryan Sullivan 著 GIJOE 監 訳 渡 邉 了 介 訳 Ajaxセキュリティ 毎 日 コミュニケーションズ 2008 年 P113より 引 用 このような 方 法 では 効 果 が 薄 いだけではなく ケースバイケーズで 正 しい 方 法 を 考 えなければならない 点 が 問 題 脆 弱 性 対 策 は もっと 機 械 的 に 適 用 できるものでないと 実 用 的 でない Copyright 2008-2010 HASH Consulting Corp. 14
正 しくない 例 3(2008 年 ) 前 提 1 Webアプリケーションは 文 字 列 を 入 力 として 受 理 できる リレーショナル データベース 管 理 システムと 連 携 入 力 の 例 DECLARE%20@S%20NVARCHAR(4000)SET%20@S=hogehoge EXEC(@S) 文 字 列 として 入 力 特 殊 文 字 を 文 字 として 扱 うために を 挿 入 パーセントエンコー ドをデコードしてか らでないと 無 意 味 むやみに を 挿 入 しても ; は 削 除 セミコロンを 勝 手 入 力 値 チェックの 結 果 に 削 除 しないで! DECLARE %20@S %20NVARCHAR (4000 )SET %20@S =hogehoge EXEC (@S ) 前 提 2 SQLクエリーはアプリケーションで 生 成 SQL 構 文 に 用 いるような 文 字 列 はユーザーの 入 力 としてはありえない 意 味 不 明 入 力 の 例 ( 入 力 値 チェックの 結 果 ) DECLARE %20@S %20NVARCHAR (4000 )SET %20@S =hogehoge EXEC (@S ) SQL 構 文 に 用 いられる 代 表 的 な 文 字 列 をフィルタリングして 削 除 アットマーク(@)はデータベース 上 で 変 数 の 識 別 子 やスクリプト の 実 行 に 用 いられることがあるため 削 除 サニタイズ!! サニタイジングの 例 %20S %20 (4000 ) %20S =hogehoge (S ) 被 害 が 続 くSQLインジェクション 攻 撃,もう 一 度 対 策 を 見 直 そう より 引 用 http://itpro.nikkeibp.co.jp/article/column/20080514/301660/ Copyright 2008-2010 HASH Consulting Corp. 15
なぜ 誤 った 解 説 がなくならないのか 攻 撃 方 法 からの 発 想 攻 撃 に 使 用 する 文 字 文 字 列 を 削 除 改 変 するアプローチ いわゆる サニタイズ 脆 弱 性 が 混 入 する 根 本 原 因 からのアプローチではない 実 はアプリケーションなんか 書 いた 人 が 説 明 している? セキュリティのプロが 全 員 アプリケーションを 書 けるとは 限 らない そのサンプルコード 動 かしてみた? でもテスト 環 境 構 築 するだけでも 大 変 だしぃ コピペの 悪 弊 昔 の 間 違 った 解 説 が 延 命 されられる みんな 攻 撃 が 大 好 きだww Copyright 2008-2010 HASH Consulting Corp. 16
処 理 系 のバグ( 不 適 切 な 仕 様 )を 避 ける 目 的 も ( 過 去 の 話 題 ) 問 題 は このプログラムではユーザ 入 力 データをそのままSQL 文 の 中 に 入 れていることだ ここで 例 えば 下 記 のようなデータをフォームに 入 力 したとしよう shell("cmd /c echo aaa > c: test.txt") ( 注 : " " は 縦 棒 文 字 ) このプログラムは 以 下 のSQL 文 をJetデータベースエンジンに 投 げる select * from Customers where City=' shell("cmd /c echo aaa > c: test.txt") Jetは 縦 棒 文 字 ( )で 囲 まれた 部 分 をVBAスクリプトだと 解 釈 するので VBA Shell() 関 数 を 呼 び 出 す すなわち サーバ 上 で cmd /c echo aaa > c: test.txt が 実 行 されることになる このサンプルプログラムでは 単 純 に City= word という 検 索 条 件 だが City like %word% というような 検 索 条 件 であったとしても 入 力 文 字 列 を 巧 妙 に 工 夫 することによりJetに Shell 関 数 を 呼 び 出 させることは 可 能 である セキュリティ 勧 告 -NTサーバ 上 におけるJetセキュリティ 問 題 http://www.trusnet.com/advisories/jetshell/jetshell.txt より 引 用 昔 のJetデータベースエンジンでは 文 字 列 リテラル 中 のパイプ 記 号 に VBAスクリプトを 呼 び 出 す 機 能 があった しかも パイプ 記 号 をエスケープする 手 段 が 提 供 されていなかった 不 適 切 な 仕 様 だが 現 在 では 改 修 されている Copyright 2008-2010 HASH Consulting Corp. 17
参 考 なぜセミコロン ; を 削 除 したがるのか? 実 はセミコロンの 削 除 には 実 効 的 な 意 味 はあまりない セミコロン 削 除 の 意 図 は 複 文 実 行 の 防 止 と 思 われる SELECT * FROM XXX WERE ID= ;UPDATE XXX SET SQLインジェクションの 文 脈 で 複 文 が 実 行 できるのは MS SQL とPostgreSQL 現 実 にMS SQLは 複 文 を 使 った 改 ざん 事 件 が 多 発 しかし MS SQLは セミコロンなしでも 複 文 が 書 ける SELECT * FROM XXX WERE ID= UPDATE XXX SET でもよい すなわち セミコロンの 削 除 で 保 険 的 にせよ 意 味 があるのは PostgreSQLの 場 合 だけ 続 きはWebで http://www.tokumaru.org/d/20080502.html http://www.tokumaru.org/d/20080627.html Copyright 2008-2010 HASH Consulting Corp. 18
SQLインジェクション 対 策 の 考 え 方 Copyright 2008-2010 HASH Consulting Corp. 19
そもそもなぜSQLインジェクションが 発 生 するのか? 原 因 は リテラルとして 指 定 したパラメータが リテラルの 枠 をは み 出 し SQLの 一 部 として 解 釈 されること 文 字 列 リテラルの 場 合 シングルクォートで 囲 まれた(クォートされた) 範 囲 をはみ 出 す SELECT * FROM XXX WHERE A= OR A =A 数 値 リテラルの 場 合 はみ 出 した 部 分 数 値 でない 文 字 ( 空 白 英 字 記 号 など)を 使 う SELECT * FROM XXX WHERE A=1OR TRUE Copyright 2008-2010 HASH Consulting Corp. 20
エスケープは 檻 にしっかり 入 れるイメージ 檻 に 入 っている 分 には 中 身 の 危 険 性 を 気 にする 必 要 なはい 危 険 性 がなくても 檻 から 出 てしまうのはバグ select * from animals whre kind=' ' 危 険 な 文 字 文 字 列 ; ' @ declare union xp_cmdshell @... Copyright 2008-2010 HASH Consulting Corp. 21
SQLインジェクションは 檻 から 逃 げるイメージ パラメタがリテラルからはみ 出 し SQL 文 の 命 令 として 解 釈 される 状 態 select * from animals whre kind=' ' 危 険 な 文 字 文 字 列 ; ' @ declare union xp_cmdshell @... Copyright 2008-2010 HASH Consulting Corp. 22
SQLインジェクション 対 策 の 実 際 Copyright 2008-2010 HASH Consulting Corp. 23
SQLの 呼 び 出 し 方 SQLに 動 的 な 変 数 を 埋 め 込 む 方 法 には2 種 類 ある (1) 文 字 列 連 結 によるSQL 文 組 み 立 て $name =...; $sql = "SELECT * FROM employee WHERE name='". $name. "'"; $nameをエスケープしていないのでsqlインジェクション 脆 弱 性 あり (2)プレースホルダによるSQL 文 組 み 立 て PreparedStatement prep = onn.preparestatement( "SELECT * FROM employee WHERE name=?"); prep.setstring(1, 山 田 ); プレースホルダには2 種 類 ある( 静 的 動 的 ) Copyright 2008-2010 HASH Consulting Corp. 24
静 的 プレースホルダ 安 全 なSQLの 呼 び 出 し 方 より 引 用 http://www.ipa.go.jp/security/vuln/websecurity.html SQLとパラメータは 別 々にサーバーに 送 られる パラメータ 抜 きでSQLは 構 文 解 析 される パラメータは 後 から 割 り 当 てられる SQLインジェクション 脆 弱 性 の 可 能 性 が 原 理 的 になくなる Copyright 2008-2010 HASH Consulting Corp. 25
動 的 プレースホルダ 安 全 なSQLの 呼 び 出 し 方 より 引 用 http://www.ipa.go.jp/security/vuln/websecurity.html SQLとパラメータは 呼 び 出 し 側 で エスケープ 連 結 される データベースサーバー 側 は 組 み 立 てられた 文 字 列 をSQLとして 実 行 するだけ ライブラリにバグがなければ SQLインジェクション 脆 弱 性 は 発 生 しない Copyright 2008-2010 HASH Consulting Corp. 26
SQLの 組 み 立 て 方 とSQLインジェクションの 可 能 性 の 関 係 文 字 列 連 結 による 組 み 立 ては アプリケーション 開 発 者 の 無 知 や 不 注 意 によりSQLインジェクション 脆 弱 性 の 可 能 性 がある 動 的 プレースホルダは ライブラリのバグによりSQLインジェクシ ョン 脆 弱 性 の 可 能 性 がある( 詳 細 はデモで) 静 的 プレースホルダは 原 理 的 にSQLインジェクション 脆 弱 性 の 可 能 性 がない Copyright 2008-2010 HASH Consulting Corp. 27
文 字 列 連 結 によるSQL 組 み 立 てを 安 全 に 行 うには 文 字 列 連 結 によるSQL 組 み 立 て 時 のパラメータの 要 件 文 字 列 リテラルに 対 しては エスケープすべき 文 字 をエスケープすること 数 値 リテラルに 対 しては 数 値 以 外 の 文 字 を 混 入 させないこと 意 外 に 面 倒 データベースによってエスケープすべきメタ 文 字 が 異 なる オプションによってもエスケープすべきメタ 文 字 が 異 なる Perl PHP 等 ではquoteメソッドが 便 利 Perl DBI PHP Pear::MDB2 PDO quoteメソッドはデータベースの 種 類 や 設 定 に 応 じたエスケープを してくれる はず 例 外 (バグ? 仕 様?)もある Copyright 2008-2010 HASH Consulting Corp. 28
参 考 商 用 RDBMSの 文 字 列 リテラルの 定 義 Oracle:cは データベース キャラクタ セットの 任 意 の 要 素 です リテラル 内 の 一 重 引 用 符 ( )の 前 には エスケープ 文 字 を 付 ける 必 要 があります リテラル 内 で 一 重 引 用 符 を 表 すには 一 重 引 用 符 を2つ 使 用 します http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/b19201-02/sql_elements.html#41297 DB2:ストリング 区 切 り 文 字 で 始 まりストリング 区 切 り 文 字 で 終 わる 文 字 のシー ケンス この 場 合 のストリング 区 切 り 文 字 はアポストロフィ ( ) です 中 略 文 字 ストリング 内 で 1 つのストリング 区 切 り 文 字 を 表 したいときは ストリング 区 切 り 文 字 を 2 つ 連 続 して 使 用 します http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=/com.ibm.db2.luw.sql.ref.doc/doc/r0000731.html MS SQL: 単 一 引 用 符 で 囲 まれた 文 字 列 に 単 一 引 用 符 を 埋 め 込 む 場 合 は 単 一 引 用 符 を 2 つ 続 けて 並 べることで 1 つの 単 一 引 用 符 を 表 します http://technet.microsoft.com/ja-jp/library/ms179899.aspx Copyright 2008-2010 HASH Consulting Corp. 29
参 考 MySQLの 文 字 列 リテラルの 定 義 8.1.1. 文 字 列 一 部 のシーケンスは 個 々の 文 字 列 内 で 特 別 な 意 味 を 持 ちます これらのシーケンスは いず れも エスケープ 文 字 として 知 られるバックスラッシュ( )で 始 まります MySQLでは 次 のエ スケープシーケンスが 認 識 されます 文 字 列 に 引 用 符 を 含 める 方 法 は いくつかあります で 囲 んだ 文 字 列 内 で を 使 用 する 場 合 と 記 述 することができます 後 略 MySQL :: MySQL 5.1 リファレンスマニュアル :: 8.1.1 文 字 列 から 引 用 http://dev.mysql.com/doc/refman/5.1/ja/string-syntax.html Copyright 2008-2010 HASH Consulting Corp. 30
参 考 PostgreSQLの 文 字 列 リテラルの 定 義 4.1.2.1. 文 字 列 定 数 SQLにおける 文 字 列 定 数 は 単 一 引 用 符 ( )で 括 られた 任 意 の 文 字 の 並 びです 例 えば This is a string です 文 字 列 定 数 内 の 単 一 引 用 符 の 記 述 方 法 は 2つ 続 けて 単 一 引 用 符 を 記 述 することです 中 略 エスケープ 文 字 列 の 中 では バックスラッシュ 文 字 ( )によりC 言 語 のようなバック スラッシュシーケンスが 始 まります バックスラッシュと 続 く 文 字 の 組 み 合 わせが 特 別 なバイト 値 を 表 現 します bは 後 退 (バックスペース)を fは 改 頁 を nは 改 行 を rは 復 帰 (キャリッジリターン)を tはタブを 表 します また digitsという 形 式 もサポートし digitsは8 進 数 バイト 値 を 表 します xhexdigitsという 形 式 で は hexdigitsは16 進 数 バイト 値 を 表 します ( 作 成 するバイトの 並 びがサーバの 文 字 セット 符 号 化 方 式 として 有 効 かどうかはコード 作 成 者 の 責 任 です )ここに 示 した 以 外 のバックスラッシュの 後 の 文 字 はそのまま 解 釈 されます したがって バ ックスラッシュ 文 字 を 含 めるには 2つのバックスラッシュ( )を 記 述 してください また 通 常 の''という 方 法 以 外 に 'と 記 述 することで 単 一 引 用 符 をエスケープ 文 字 列 に 含 めることができます http://www.postgresql.jp/document/current/html/sql-syntax-lexical.html#sql-syntax-constants Copyright 2008-2010 HASH Consulting Corp. 31
文 字 列 リテラルのエスケープ どの 文 字 をエスケープするのか? SQL 製 品 の 文 字 列 リテラルのルールに 従 う ISO 標 準 では ' '' MySQLとPostgreSQLは ' '' NO_BACKSLASH_ESCAPES=onの 場 合 は ISO 標 準 と 同 じ 方 法 になる PostgreSQLの 場 合 は standard_conforming_stringsおよび backslash_quoteの 影 響 を 受 ける standard_conforming_strings=onの 場 合 は ISO 標 準 と 同 じ 方 法 になる backslash_quoteの 場 合 は ' ' というエスケープがエラーになる Oracle MS SQL IBM DB2 MySQL PostgreSQL 元 の 文 字 エスケープ 後 または ( を 推 奨 ) Copyright 2008-2010 HASH Consulting Corp. 32
MySQLとPostgreSQLで のエスケープが 必 要 な 理 由 SELECT * FROM XXX WHERE ID='$id' $id として 'or 1=1# が 入 力 されると 'or 1=1# エスケープ( のエスケープをしない 場 合 ) ''or 1=1# 元 のSQLに 適 用 すると SELECT * FROM XXX WHERE ID=' '' or 1=1#' すなわち SQLの 構 文 が 改 変 された( で 一 文 字 と 見 なされる) Copyright 2008-2010 HASH Consulting Corp. 33
数 値 型 パラメータの 対 処 一 部 で 数 値 パラメータについても エスケープしてクォートする ( 引 用 符 で 囲 む)ことを 推 奨 しているが 例 : select * from employee wehre age > '27' SQLは 型 付 けの 強 い 言 語 であり 数 値 をクォートすると 副 作 用 が 大 きい 文 字 列 から 数 値 への 暗 黙 の 型 変 換 が 発 生 文 字 列 から 数 値 の 変 換 は 処 理 系 依 存 であり 予 期 しない 結 果 を 生 む 暗 黙 の 型 変 換 の 奇 妙 な 結 果 の 例 (MySQL) create table dtest (d0 decimal(20, 0)); insert into dtest values(12345678901234567890); insert into dtest values(12345678901234570000); select * from dtest where d0 = '12345678901234567890'; +-----------------------+ d0 +-----------------------+ 123456789012345670000 +-----------------------+ Copyright 2008-2010 HASH Consulting Corp. 34
数 値 型 パラメータの 対 処 ( 続 き) なぜ 奇 妙 な 結 果 になるか? select * from dtest where d0 = '12345678901234567890 ; 数 値 例 d0と 文 字 列 リテラル 12345678901234567890 の 比 較 に 際 して 文 字 列 浮 動 小 数 点 型 への 変 換 が 発 生 する 次 のルールは 比 較 の 演 算 に 対 してどのように 変 換 が 行 われるかを 示 しています : * 中 略 * 他 のすべてのケースでは 引 数 は 浮 動 少 数 点 ( 実 ) 数 として 比 較 されます MySQL 5.1 リファレンスマニュアル :: 11 関 数 と 演 算 子 :: 11.1 演 算 子 :: 11.1.2 式 評 価 でのタイプ 変 換 より 引 用 http://dev.mysql.com/doc/refman/5.1/ja/type-conversion.html mysql> select '12345678901234567890'+0; +--------------------------+ '12345678901234567890'+0 +--------------------------+ 1.23456789012346e+019 +--------------------------+ 数 値 は 数 値 のまま 扱 うこと 浮 動 小 数 点 数 に 変 換 されている Copyright 2008-2010 HASH Consulting Corp. 35
quoteメソッドの 詳 細 PHPのPear::MDB2におけるquoteの 呼 び 出 し require_once MDB2.php ; //ライブラリのロード // DBへの 接 続 (PostgreSQLの 場 合 ) $db = MDB2::connect('pgsql://dbuser:password@hostname/dbname?charset=utf8'); // 文 字 列 型 を 指 定 して 文 字 列 リテラルのクォート 済 み 文 字 列 を 得 る ( 略 )$db->quote($s, 'text') ( 略 ) // 数 値 型 を 指 定 して 数 値 リテラルの 文 字 列 を 得 る ( 略 )$db->quote($n, 'decimal') ( 略 ) データ 型 指 定 戻 り 値 abc 'text' 'abc' (PHPの 文 字 列 型 の 値 クォートを 含 む) O'Reilly 'text' O''Reilly' (PHPの 文 字 列 型 の 値 クォートを 含 む) -123 'decimal' -123 (PHPの 文 字 列 型 の 値 ) 123abc 'decimal' 123 (PHPの 文 字 列 型 の 値 ) -123 'integer' -123 (PHPの 整 数 型 の 値 ) 123abc 'integer' 123 (PHPの 整 数 型 の 値 ) Copyright 2008-2010 HASH Consulting Corp. 36
quoteメソッドの 数 値 データの 処 理 結 果 Perl DBI/DBD PHPのPDO, Pear::MDB2でquoteの 処 理 内 容 を 調 査 1a をINTEGER 型 を 指 定 してquoteすると どうなるか? サンプルスクリプト: DBI: $dbh->quote("1a '", SQL_INTEGER) PDO: $dbh->quote("1a '", PDO::PARAM_INT) MDB2: $dbh->quote("1a '", 'integer') モジュール 名 結 果 DBI(DBD::mysql) 1a ' DBI(DBD::PgPP) '1a '' PDO '1a '' MDB2 1 (int 型 ) なにもしていない!( 脆 弱 性 ) 正 しい 結 果 quoteメソッドに 期 待 したが 現 状 SQLの 仕 様 通 り 動 作 するのはMDB2のみ プレースホルダの 利 用 を 推 奨 Copyright 2008-2010 HASH Consulting Corp. 37
文 字 コードの 問 題 1 5C 問 題 によるSQLインジェクション 5C 問 題 とは Shift_JIS 文 字 の2バイト 目 に0x5Cが 来 る 文 字 に 起 因 する 問 題 ソ 表 能 欺 申 暴 十 など 出 現 頻 度 の 高 い 文 字 が 多 い 0x5CがASCIIではバックスラッシュであり ISO-8859-1など1バイト 文 字 と 解 釈 された 場 合 日 本 語 の1バイトがバックスラッシュとして 取 り 扱 われる 一 貫 して1バイト 文 字 として 取 り 扱 われれば 脆 弱 性 にならないが 1バイト 文 字 として 取 り 扱 われる 場 合 と Shift_JISとして 取 り 扱 われる 場 合 が 混 在 すると 脆 弱 性 が 発 生 する Copyright 2008-2010 HASH Consulting Corp. 38
ソースコード( 要 点 のみ) <?php header('content-type: text/html; charset=shift_jis'); $key = @$_GET['name']; if (! mb_check_encoding($key, 'Shift_JIS')) { die(' 文 字 エンコーディングが 不 正 です'); } // MySQLに 接 続 (PDO) $dbh = new PDO('mysql:host=localhost;dbname=books', 'phpcon', 'pass1'); // Shift_JISを 指 定 $dbh->query("set NAMES sjis"); // プレースホルダによるSQLインジェクション 対 策 $sth = $dbh->prepare("select * FROM books WHERE author=?"); $sth->setfetchmode(pdo::fetch_num); // バインドとクエリ 実 行 $sth->execute(array($key));?> Copyright 2008-2010 HASH Consulting Corp. 39
5C 問 題 によるSQLインジェクションの 説 明 Copyright 2008-2010 HASH Consulting Corp. 40
対 策 文 字 エンコーディング 指 定 のできるデータベース 接 続 ライブ ラリを 選 定 し 文 字 エンコーディングを 正 しく 指 定 する $dbh = new PDO('mysql:host=xxxx;dbname=xxxx;charset=cp932', 'user', 'pass', array( PDO::MYSQL_ATTR_READ_DEFAULT_FILE => '/etc/mysql/my.cnf', PDO::MYSQL_ATTR_READ_DEFAULT_GROUP => 'client', )); # http://gist.github.com/459499 より 引 用 (by id:nihen) 静 的 プレースホルダを 使 うよう 指 定 する あるいはプログラミングする $dbh->setattribute(pdo::attr_emulate_prepares, false); 詳 しくは 安 全 なSQLの 呼 び 出 し 方 を 参 照 http://www.ipa.go.jp/security/vuln/websecurity.html Copyright 2008-2010 HASH Consulting Corp. 41
文 字 コードの 問 題 2 U+00A5によるSQLインジェクション Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/books?user=phpcon&passw ord=pass1"); String sql = "SELECT * FROM books where author=?"; // プレースホルダ 利 用 によるSQLインジェクション 対 策 PreparedStatement stmt = con.preparestatement(sql); //? の 場 所 に 値 を 埋 め 込 む(バインド) stmt.setstring(1, key); ResultSet rs = stmt.executequery(); // クエリの 実 行 Copyright 2008-2010 HASH Consulting Corp. 42
U+00A5によるSQLインジェクションの 原 理 IPA: 安 全 なSQLの 呼 び 出 し 方 (http://www.ipa.go.jp/security/vuln/websecurity.html)より 引 用 Copyright 2008-2010 HASH Consulting Corp. 43
U+00A5によるSQLインジェクションの 条 件 と 対 策 脆 弱 性 が 発 生 する 条 件 JDBCとしてMySQL Connector/J 5.1.7 以 前 を 使 用 MySQLとの 接 続 にShift_JISあるいはEUC-JPを 使 用 静 的 プレースホルダを 使 わず エスケープあるいは 動 的 プレースホルダ (クライアントサイドのバインド 機 構 )を 利 用 している 対 策 (どれか 一 つで 対 策 になるがすべて 実 施 を 推 奨 ) MySQL Connector/Jの 最 新 版 を 利 用 する MySQLとの 接 続 に 使 用 する 文 字 エンコーディングとしてUnicode(UTF-8) を 指 定 する ( 接 続 文 字 列 にcharacterEncoding=utf8を 指 定 する) 静 的 プレースホルダを 使 用 する ( 接 続 文 字 列 にuseServerPrepStmts=trueを 指 定 する) Copyright 2008-2010 HASH Consulting Corp. 44
簡 単 にできるテスト 以 下 の 文 字 を 入 力 登 録 して どのように 表 示 されるかを 調 べる (U+00A5) バックスラッシュに 変 換 されないか 骶 (U+9AB6) JIS X 0208にない 文 字 (U+20BB7) BMP 外 の 文 字 UTF-8では4バイトになる 尾 骶 骨 テストや つちよし テストで Unicodeがきちんと 通 るか 確 認 しよう Copyright 2008-2010 HASH Consulting Corp. 45
SQLインジェクション 対 策 入 力 値 文 字 エンコーディングの 検 証 and/or 文 字 エンコーディングの 変 換 要 件 に 従 った 入 力 値 の 検 証 ( 制 御 文 字 のチェックは 必 須 ) SQL 呼 び 出 し ともかくプレースホルダを 使 うこと 静 的 プレースホルダの 利 用 が 原 理 的 に 安 全 安 全 なSQLの 呼 び 出 し 方 をよく 読 む 文 字 コードの 選 定 アプリケーションを 通 してUnicodeを 使 う HTTPメッセージはUTF-8 アプリケーションの 内 部 はUTF-8かUTF-16 ケータイ 向 けサイトはHTTPメッセージの 文 字 エンコーディングをShift_JISに するが 内 部 はUTF-8とする EUC-JPという 選 択 もあり 得 るが 使 える 言 語 が 少 ない 円 記 号 U-00A5 バックスラッシュ(5C) の 変 換 に 注 意 尾 骶 骨 テストのすすめ Copyright 2008-2010 HASH Consulting Corp. 46
ケータイサイトのセキュリティ Copyright 2008-2010 HASH Consulting Corp. 47
ケータイWebアプリの 構 成 iモード EZweb Yahoo! ケータイ ワイヤレス 網 キャリア 基 地 局 ゲートウェイ コンテンツ 提 供 事 業 者 Webサーバ DBサーバ インターネット 端 末 (Hand Set) 言 語 変 換 認 証 SSL 暗 号 化 Cookie 保 持 DB Copyright 2008-2010 HASH Consulting Corp. 48
ケータイWebアプリの 特 徴 基 本 的 には PCサイトと 同 じようなWebアプリケーションである HTMLまたは 類 する 言 語 で 記 述 され HTTPを 通 じてインターネット アクセスされる. 昔 :CompactHTML HDML MML 今 :HTML/XHTML PCブラウザとの 違 い 大 半 の 端 末 でJavaScriptが 使 えない Cookieが 使 えない ことがある キャリアごとに 端 末 固 有 ID(uid EZ 番 号 )がある HTMLソースが 読 めない キャリアのゲートウェイ(Proxy) 経 由 でアクセスされる キャリアのゲートウェイ 経 由 でアクセスされる IPアドレスはゲートウェイが 持 つ ゲートウェイには コンテンツ 変 換 機 能 認 証 課 金 機 能 がある SSLが 利 用 できる( 最 初 期 以 外 ) しかし 端 末 の 世 代 により 動 作 が 少 し 異 なる Copyright 2008-2010 HASH Consulting Corp. 49
ケータイWebアプリの 脆 弱 性 とは Copyright 2008-2010 HASH Consulting Corp. 50
Cookieが 使 えない ことがある iモードでは 伝 統 的 にCookieが 使 えなかった EZweb Yahoo! ケータイではCookieが 利 用 できる(ものもある) が RFCに 忠 実 に 実 装 されているわけではない Expiresの 解 釈 実 装 がRFC(PCブラウザ)とは 異 なる 場 合 がある Yahoo! ケータイのガイドラインには 一 部 の3GC 型 端 末 では 期 限 が 指 定 されていないCookieを 一 時 型 として 扱 わないので 注 意 すること とある!? 結 局 ケータイコンテンツを 作 成 する 際 には Cookieを 使 わない で 実 装 することが 多 い URLにセッションIDを 埋 め 込 む 端 末 固 有 IDをセッション 識 別 に 利 用 する 着 メロなどでは セッション 管 理 機 能 を 利 用 しないで 全 部 引 き 回 す 場 合 も Cookieを 使 わないで ケータイ 固 有 のセッション 管 理 手 法 を 用 い ることから 脆 弱 性 が 生 まれる Copyright 2008-2010 HASH Consulting Corp. 51
参 考 EzwebのCookieの 挙 動 SSL 時 には 端 末 非 SSL 時 にはゲートウェイにCookie 格 納 と 明 記 されている SSLと 非 SSL 共 存 のサイトは 特 に 注 意 http://www.au.kddi.com/ezfactory/tec/spec/cookie.html から 引 用 Copyright 2008-2010 HASH Consulting Corp. 52
参 考 ソフトバンクのSSL 挙 動 ソフトバンクのSSLは 原 則 としてゲートウェイ 経 由 になる SSLの 場 合 でも 端 末 固 有 ID 付 与 や 絵 文 字 変 換 を 行 っている しかし リンクを 経 由 せずダイレクトに 接 続 した 場 合 は End to EndのSSLになる このため SSLの 場 合 と 非 SSLの 場 合 にドメインが 異 なることになり セッションID が 共 有 できないという 問 題 secure.softbank.ne.jp 経 由 のSSLは 廃 止 の 方 向 とのこと 産 総 研 の 高 木 浩 光 氏 とソフトバンク 宮 川 潤 一 CTOがtwitter 上 で 会 話 され 廃 止 の 方 向 性 が 決 定 される http://creation.mb.softbank.jp/web/web_ssl.htmlから 引 用 Copyright 2008-2010 HASH Consulting Corp. 53
54 Copyright 2008-2010 HASH Consulting Corp. http://togetter.com/li/29705 より 引 用
Copyright 2008-2010 HASH http://mb.softbank.jp/mb/information/details/101015.html Consulting Corp. より 55 引 用
基 本 的 には PCサイトと 同 じようなWebアプリケーションである 一 般 的 なWebアプリケーション 脆 弱 性 パターンは ケータイWeb アプリケーションでも 同 じように 成 立 する SQLインジェクション ディレクトリ トラバーサル OSコマンドインジェクション HTTPヘッダ インジェクション メールヘッダ インジェクション 他 者 権 限 の 利 用 CSRF セッションフィクセーション Copyright 2008-2010 HASH Consulting Corp. 56
大 半 の 端 末 でJavaScriptが 使 えない ケータイブラウザではJavaScriptがサポートされていない ドコモの2009 年 夏 モデルからはJavaScriptサポート ソフトバンクの2010 年 夏 モデルから 一 部 でJavaScript 正 式 サポート 狭 義 のCross-Site Scripting(XSS) 攻 撃 は 成 立 しなかったことになるが XSSを 広 義 (タグのエスケープ 漏 れ)にとらえると ケータイブラウ ザ 上 でも 悪 いこと できる 可 能 性 がある 画 面 の 改 ざん フィッシングへの 悪 用 その 他 の 特 殊 なタグ マイナーなタグの 挙 動 は キャリア 世 代 機 種 によって 微 妙 に 異 なる ある 端 末 で 悪 いこと が 起 こらなくても 安 心 はできない 今 後 ドコモ ソフトバンクの 新 機 種 はJavaScript 対 応 になるので JavaScriptを 前 提 にしたセキュリティ 施 策 が 必 要 Copyright 2008-2010 HASH Consulting Corp. 57
キャリアのゲートウェイ(Proxy) 経 由 でアクセスされる 一 般 に ケータイWebアプリは ゲートウェイがあるから 安 全 と 言 われることが 多 いが 現 実 には ゲートウェイとWebサーバー 間 はインターネットで 接 続 されるので 必 ずしも 安 全 ではない 安 全 な 例 (PCからアクセスできない) キャリアとWebサーバー 間 を 専 用 線 で 接 続 する( 最 近 はあまり 聞 かない) ファイヤーウォールなどで ゲートウェイ 以 外 からのアクセスを 拒 絶 する 安 全 でない 例 (PCからアクセスできる) アクセス 制 限 をしていない User-Agentによりアクセス 制 限 をしている PCで 簡 単 に 偽 装 できる いずれにせよ ケータイ 実 機 を 使 った 不 正 アクセスに 対 しては ゲートウェイは 無 力 Wi-Fi 経 由 の 利 用 が 多 いスマートフォンが 普 及 すると 今 後 は IPアドレス 制 限 が 掛 けにくくなる 可 能 性 Copyright 2008-2010 HASH Consulting Corp. 58
ケータイ 固 有 の 脆 弱 性 問 題 Copyright 2008-2010 HASH Consulting Corp. 59
かんたんログイン とは 端 末 固 有 IDのみを キーとして 認 証 する 端 末 固 有 IDあれこれ キャリア 名 称 HTTPヘッダ NTTドコモ FOMA 端 末 識 別 番 号 User-Agent iモードid X-DCMGUID Au EZ 番 号 X-UP-SUBNO ソフトバンク 端 末 シリアル 番 号 User-Agent ユーザーID X-JPHONE-UID Copyright 2008-2010 HASH Consulting Corp. 60
かんたんログイン 画 面 の 例 (1) Copyright 2008-2010 HASH Consulting Corp. 61
かんたんログイン 画 面 の 例 (2) Copyright 2008-2010 HASH Consulting Corp. 62
かんたんログイン 画 面 の 例 (3) Copyright 2008-2010 HASH Consulting Corp. 63
かんたんログイン がなりたつための 条 件 端 末 固 有 IDは 同 一 端 末 であれば すべてのサイトに 同 じ 値 が 送 出 される すなわち 端 末 固 有 IDは 秘 密 情 報 ではない 秘 密 情 報 でない 固 定 のIDで 認 証 するためには 端 末 固 有 IDは 書 き 換 えができないという 前 提 が 必 要 端 末 固 有 IDはHTTPヘッダに 乗 ってくる 値 なので 通 常 は 任 意 に 書 き 換 えができる 携 帯 電 話 を 使 っている 時 は 変 更 できないと 考 えられているが まとめると かんたんログインはケータイの 以 下 の 条 件 によって 支 えられている ケータイWebが 閉 じたネットワークで 利 用 される ケータイ 端 末 の 機 能 が 低 く HTTPヘッダを 書 き 換 える 機 能 がない Copyright 2008-2010 HASH Consulting Corp. 64
かんたんログイン 脆 弱 性 報 告 の 例 65
かんたんログイン 脆 弱 性 および 事 故 の 例 http://www.kuronekoyamato.co.jp/info/info_101025.html 66
iモードブラウザ2.0の 登 場 2009 年 5 月 19 日 づけNTTドコモ 社 の 報 道 発 表 より http://www.nttdocomo.co.jp/info/news_release/page/090519_00.html より 引 用 Copyright 2008-2010 HASH Consulting Corp. 67
ケータイJavaScriptで 端 末 固 有 IDを 書 き 換 える 条 件 以 下 の 三 条 件 がそろえば 端 末 固 有 IDの 書 き 換 え すなわち か んたんログイン なりすましができるが a. 携 帯 電 話 のJavaScriptでXMLHttpRequestオブジェクトが 利 用 できる b. XMLHttpRequestにてsetRequestHeaderメソッドが 利 用 できる c. setrequestheaderメソッドにてuseragentなどのリクエストヘッダが 書 き 換 えできる 10 月 末 のJavaScript 再 有 効 化 の 際 に setrequestheaderメソ ッドが 無 効 化 された 模 様 すなわち 上 記 b cが 成 立 しなくなった 元 々のNTTドコモのサイトではJavaスクリプトの 仕 様 書 に setrequestheaderもちゃんと 載 っていたのだが 現 時 点 では 削 除 されている XMLHttpRequest 自 体 にも 制 限 が 加 わり JavaScriptが 置 かれ たコンテンツのディレクトリかサブディレクトリのみがアクセス 可 能 参 照 : http://www.tokumaru.org/d/20090805.html#p01 Copyright 2008-2010 HASH Consulting Corp. 68
DNS Rebindingによるなりすまし 攻 撃 www.hash-c.co.jp 115.146.17.185 攻 撃 対 象 evil.example.jp 192.0.2.2 ワナ example.jpのdns evil 192.0.2.2 攻 撃 者 はワナを 準 備 して 誘 導 Copyright 2008-2010 HASH Consulting Corp. 69
DNS Rebindingによるなりすまし 攻 撃 www.hash-c.co.jp 115.146.17.185 攻 撃 対 象 evil.example.jp 192.0.2.2 ワナ example.jpのdns evil 192.0.2.2 ユーザが ワナを 閲 覧 Copyright 2008-2010 HASH Consulting Corp. 70
DNS Rebindingによるなりすまし 攻 撃 www.hash-c.co.jp 115.146.17.185 攻 撃 対 象 evil.example.jp 192.0.2.2 ワナ example.jpのdns evil 115.146.17.185 攻 撃 者 は DNSを 操 作 Copyright 2008-2010 HASH Consulting Corp. 71
DNS Rebindingによるなりすまし 攻 撃 www.hash-c.co.jp 115.146.17.185 攻 撃 対 象 evil.example.jp 192.0.2.2 ワナ example.jpのdns evil 115.146.17.185 ケータイJavaScript 10 秒 後 に evil.example.jp を 閲 覧 開 始 Copyright 2008-2010 HASH Consulting Corp. 72
DNS Rebindingによるなりすまし 攻 撃 www.hash-c.co.jp 115.146.17.185 攻 撃 対 象 evil.example.jp 192.0.2.2 ワナ example.jpのdns evil 115.146.17.185 evil.example.jpの IPアドレスを 要 求 Copyright 2008-2010 HASH Consulting Corp. 73
DNS Rebindingによるなりすまし 攻 撃 www.hash-c.co.jp 115.146.17.185 攻 撃 対 象 evil.example.jp 192.0.2.2 ワナ example.jpのdns evil 115.146.17.185 115.146.17.185 を 返 す Copyright 2008-2010 HASH Consulting Corp. 74
DNS Rebindingによるなりすまし 攻 撃 www.hash-c.co.jp 115.146.17.185 攻 撃 対 象 evil.example.jp 192.0.2.2 ワナ example.jpのdns evil 115.146.17.185 iモードidが 送 出 X-DCMGUID:xxxXXX9 http://evil.example.jp/ userinfo.php?guid=on にアクセス Copyright 2008-2010 HASH Consulting Corp. 75
DNS Rebindingによるなりすまし 攻 撃 www.hash-c.co.jp 115.146.17.185 攻 撃 対 象 evil.example.jp 192.0.2.2 ワナ example.jpのdns evil 115.146.17.185 個 人 情 報 を 返 す 氏 名 メールアドレス 住 所 電 話 番 号 Copyright 2008-2010 HASH Consulting Corp. 76
DNS Rebindingによるなりすまし 攻 撃 www.hash-c.co.jp 115.146.17.185 攻 撃 対 象 evil.example.jp 192.0.2.2 ワナ example.jpのdns evil 115.146.17.185 個 人 情 報 をワナのサ ーバーに 返 す Copyright 2008-2010 HASH Consulting Corp. 77
Copyright 2008-2010 HASH Consulting Corp. 78
DNSリバインディング 対 策 はケータイ 事 業 者 側 ではできない 本 来 はケータイブラウザあるいはゲートウェイで 対 策 するべきも のではあるが ケータイブラウザはゲートウェイ(PROXY) 経 由 のアクセスなので ブラウザでは 名 前 解 決 をしていない すなわち ブラウザでは 対 策 (DNS Pinning)できない ゲートウェイはマルチユーザが 対 象 なので 文 脈 を 意 識 した Pinningは 不 可 能 で いつかはIPアドレスを 切 り 替 えなければな らない Copyright 2008-2010 HASH Consulting Corp. 79
キャリアのDNSが 最 低 1 時 間 DNSキャッシュする 想 定 では 以 下 のような 攻 撃 が 可 能 となる 攻 撃 者 はワナサイトを 用 意 する 攻 撃 者 は 自 ら 携 帯 電 話 でワナサイトをアクセスする ワナサイトのIPアドレスをターゲットサイトのIPに 切 り 替 えておく 58 分 後 に ワナサイトのURLをまいて 誘 導 する 被 害 者 がワナサイトを 閲 覧 した 直 後 に DNSサーバーのキャッシ ュ 保 持 が 無 効 となる 被 害 者 のブラウザ 上 でDNSリバインディングを 悪 用 したリクエスト が 発 行 されるが 既 に 標 的 サイトのIPアドレスが 有 効 となり 攻 撃 が 成 立 する Copyright 2008-2010 HASH Consulting Corp. 80
ゲートウェイIPの 変 遷 Copyright 2008-2010 HASH Consulting Corp. 81
Webサイト 側 でのDNSリバインディング 対 策 iモードブラウザ2.0のxmlhttprequestでは setrequestheaderメソッドが 無 効 化 されているので リクエスト ヘッダのHostフィールドはワナサイトのドメインになっている したがって かんたんログインの 際 に Hostフィールドをチェック すればよい 簡 単 に 実 装 するには 名 前 ベースのバーチャルホストにすれば よい Copyright 2008-2010 HASH Consulting Corp. 82
twtr.jpの 事 例 http://www.tokumaru.org/d/20100222.html#p01 Copyright 2008-2010 HASH Consulting Corp. 83
http://takagi-hiromitsu.jp/diary/20100228.html#p01 より 引 用 Copyright 2008-2010 HASH Consulting Corp. 84
ソフトバンクでもJavaScriptに 対 応 http://k-tai.impress.co.jp/docs/news/20100518_367787.html より 引 用 Copyright 2008-2010 HASH Consulting Corp. 85
本 当 に2010 年 夏 モデルからなのか? 実 はかなり 以 前 からソフトバンク 端 末 の 一 部 のモデルで JavaScriptに 対 応 していた ノキア 702NK(2004 年 12 月 発 売 )では 簡 単 なJavaScriptに 対 応 XMLHttpRequestやIFRAME DOMには 対 応 していない 804SS(2006 年 3 月 ) 910T(2006 年 10 月 ) 910SH(2006 年 11 月 )では NetFront 3.3によるJavaScript 対 応 XMLHttpRequestには 対 応 していない IFRAME DOMに 対 応 攻 撃 に 利 用 できる 可 能 性 *1 922SH(2008 年 3 月 )では NetFront 3.4にてAjaxに 対 応 XMLHttpRequestのサポート setrequetheaderのサポート (!) 独 自 調 査 の 結 果 以 下 5 機 種 は デフォルトでAjaxが 有 効 820N, 821N, 831N, 830CA, 940SC Copyright 2008-2010 HASH Consulting Corp. 86
Ajax 有 効 な 機 種 のサマリ ただし SHARPの 最 新 機 種 943SHのみは Refererが 送 出 されるが 改 変 はできない はデフォルトでAjax 無 効 オプションにより 有 効 化 可 能 (SHARP 端 末 は 多 いので 抜 粋 ) 上 記 以 外 のPanasonic Toshiba 等 はAjax 無 効 Copyright 2008-2010 HASH Consulting Corp. 87
Copyright 2008-2010 HASH Consulting Corp. 88
かんたんログイン は ギリギリの 瀬 戸 際 に 立 たされている かんたんログインに 対 して ケータイ JavaScriptによる 攻 略 手 法 がわかってきた かんたんログインに 際 しての 必 須 対 策 キャリアゲートウェイのIPアドレスとのみ 通 信 を 制 限 する キャリアの 判 定 にもIPアドレスを 用 いる Hostヘッダのチェック(あるいは 名 前 ベースのバーチャルホスト) ソフトバンク 端 末 については Ajax 規 制 あるいはスクリプトの 禁 止 SSLでは かんたんログインは 行 わない これで 完 璧 かどうかは 誰 にも 分 からない とくに ソフトバンク 端 末 のように 機 種 依 存 性 が 多 いと 全 ての 端 末 につい て 検 証 しないと 確 かなことは 言 えない それでも まだ かんたんログイン 続 けますか? Copyright 2008-2010 HASH Consulting Corp. 89
能 動 的 攻 撃 の 可 能 性 Copyright 2008-2010 HASH Consulting Corp. 90
ケータイJavaScriptによる 能 動 的 攻 撃 の 可 能 性 iモードブラウザ2.0はsetrequestheader()が 無 効 化 されている ので User-AgentやX-DCM-GUIDの 変 更 は 不 可 能 と 思 われる ソフトバンク 端 末 では setrequestheader() 関 数 自 体 は 無 効 化 されていないが User-AgentやX-JPHONE-UIDの 変 更 は 禁 止 さ れている 抜 け 道 はないのか? Copyright 2008-2010 HASH Consulting Corp. 91
2 種 類 のトリックによる 端 末 固 有 IDの 改 変 が 可 能 トリック1:End-EndのSSLを 使 う キャリアゲートウェイのチェックをすり 抜 ける ソフトバンクにはゲートウェイ 型 のSSLもあるが こちらはゲートウェイのチ ェックが 有 効 (2011 年 2 月 廃 止 予 定 ) トリック2:ハイフン - の 代 わりにアンダースコア _ を 用 いる リクエストヘッダ 中 のハイフンは アプリケーションが 利 用 する 際 にアンダ ースコアに 変 更 される 仕 様 を 悪 用 アンダースコアはゲートウェイだとチェックされるが 端 末 のチェックはすり 抜 ける Copyright 2008-2010 HASH Consulting Corp. 92
SSLを 利 用 したリクエストヘッダ 改 変 スクリプトの 例 var requester = new XMLHttpRequest(); requester.open('get', 'https://example.com/login.php', true); requester.onreadystatechange = function() { if (requester.readystate == 4) { onloaded(requester); } }; requester.setrequestheader("host", "twtr.com"); requester.setrequestheader("user_agent", "SoftBank/1.0/943SH/SHJ001/SN359XXXXXXXXXXX0 " + " Browser/NetFront/3.5 Profile/MIDP-2.0 Configuration/CLDC-1.1"); requester.setrequestheader( "X_JPHONE_UID", "a3xxxxxxxxxxxxxp"); requester.send(null); Copyright 2008-2010 HASH Consulting Corp. 93
アプリケーションが 受 け 取 ったリクエストの 例 ( 一 部 ) HTTP_USER_AGENT=DoCoMo/2.1 P07A3(c500;TB;W24H15)Fake SERVER_NAME=twitter.com SERVER_PORT=443 HTTP_COOKIE=aaa=bbbx REMOTE_ADDR=123.108.237.4 SERVER_PROTOCOL=HTTP/1.1 HTTP_X_JPHONE_UID=fakejphoneuid HTTP_X_DCMGUID=fakedcmguid HTTP_X_UP_SUBNO=fakesubno HTTP_HOST=twitter.com URLと 証 明 書 のドメインが 異 なるので 警 告 が 出 るが 処 理 は 続 行 可 能 Copyright 2008-2010 HASH Consulting Corp. 94
SSLを 悪 用 した 能 動 型 なりすまし 攻 撃 への 対 策 SSLではかんたんログインを 受 け 付 けない 必 須 はソフトバンクのみ 禁 止 だが 全 キャリア 禁 止 することが 無 難 キャリア 判 定 は User-Agentではなく IPアドレスで 行 う Copyright 2008-2010 HASH Consulting Corp. 95
セッション 管 理 の 問 題 Copyright 2008-2010 HASH Consulting Corp. 96
ケータイWebアプリのセッション 管 理 手 法 ケータイWebアプリでセッションIDを 保 持 する 場 所 はいくつか 候 補 がある URL 埋 め 込 み 現 在 の 主 流 しかし 色 々と 注 意 点 がある Cookie iモードブラウザがcookie 非 対 応 だったのであまり 使 われなかった 今 後 iモードもcookie 対 応 になるので 中 長 期 的 にはCookieへの 移 行 が 望 ま しい 端 末 固 有 IDそのものをセッションIDとして 使 用 する 方 法 最 近 増 えつつあるようだが 前 述 の 理 由 でやめた 方 がよい SSLに 対 応 できない 一 般 的 なセキュリティ 対 策 が 使 えない 場 合 がある Copyright 2008-2010 HASH Consulting Corp. 97
セッションIDをURLに 埋 め 込 む 場 合 の 問 題 点 URLに 埋 め 込 まれたセッションIDがReferrer 経 由 で 漏 洩 する セッションフィクセイション 攻 撃 の 可 能 性 ユーザがURLをメールなどで 教 えてしまう(!) Copyright 2008-2010 HASH Consulting Corp. 98
URLに 埋 め 込 まれたセッションIDがReferrer 経 由 で 漏 洩 する http://hogehoge.jp A WebサイトAにアクセス http://hogehoge.jp/item.jsp;jsessionid=12345abcdef WebサイトBへのリンク <a href= http://honya.jp/ >honya</a> リンクをクリック http://honya.jp/l WebサイトBのログに 別 サイトのセッションIDが 記 録 される なりすましの 危 険 性 WebサイトB http://honya.jp/ アクセスログ http://hogehoge.jp/ item.jsp;jsessio NID=12345ABCD EF EF Copyright 2008-2010 HASH Consulting Corp. 99
RefererによるセッションID 漏 洩 そもそもケータイブラウザではRefererは 送 出 されるのか? iモードでは 送 出 されないことになっていたが iモードブラウザ2.0では 送 出 されるようになった EZwebでは 送 出 することになっているが Yahoo! ケータイでは 送 出 することになっているが キャリアごとの 端 末 世 代 依 存 機 種 依 存 もある 端 末 のバグという 話 もあるが このレベルのバグは 改 修 されないことが 多 い ケータイWebアプリでは URLにセッションIDを 埋 め 込 む 実 装 が 多 く 用 いられるので RefererからのセッションID 漏 洩 には 注 意 が 必 要 キャリアごとに 違 いにより テスト 漏 れが 発 生 しやすい 結 局 細 かいことを 考 えずに 粛 々とReferer 対 策 をしておくのが 一 番 安 全 Copyright 2008-2010 HASH Consulting Corp. 100
セッションフィクセイション 攻 撃 の 可 能 性 攻 撃 者 がセッションIDを 取 得 する セッションIDつきのURLをメールなどで 正 規 ユーザ( 被 害 者 )に 送 りつけ 巧 妙 なメッセージでURLを 実 行 させる 正 規 ユーザが 同 URLをアクセスすると 攻 撃 者 は 同 じセッション を 共 有 できることになる Copyright 2008-2010 HASH Consulting Corp. 101
ユーザがURLをメールなどで 教 えてしまう(!) セッションフィクセイションと 似 ているが セッションIDつきのURLを 正 規 ユーザが 知 人 などにメールで 知 ら せてしまうorz 自 爆 型 セッションフィクセイション Copyright 2008-2010 HASH Consulting Corp. 102
セッションフィクセイション 対 策 一 般 的 なセッションフィクセイション 対 策 は 必 須 ログイン 後 にセッションIDを 振 り 直 す PHPの 場 合 は session_regenerate_id() が 使 える ログイン 前 には 極 力 セッションを 使 用 しない hiddenの 方 が 安 全 ログイン 前 のセッションは 全 ユーザと 共 有 しているくらいのつもりで 様 々な 保 険 的 対 策 検 索 エンジンにはセッションIDつきのURLが 保 存 されないように 注 意 SNSなどでは ユーザが 自 分 のページのURLをセッションIDつきで 添 付 し ないようにチェックする Refererチェックにより 外 部 からリンクされた 場 合 はセッションをリセットする セッションタイムアウトを 短 めに 設 定 する / 明 示 的 なログアウト Cookieへの 移 行 を 真 剣 に 検 討 する Copyright 2008-2010 HASH Consulting Corp. 103
スマートフォンのセキュリティ (グローバルな 話 題 ) Copyright 2008-2010 HASH Consulting Corp. 104
スマートフォンのWebアプリケーションセキュリティ PC 向 けのWebアプリケーションセキュリティと 同 じ 普 通 にセキュリティ 対 策 する SQLインジェクション クロスサイト スクリプティング クロスサイト リクエストフォージェリ いわゆる かんたんログイン は 実 装 してはいけない もっとも iphoneやandroidのブラウザは 端 末 固 有 IDを 送 出 しないので やりたくてもできないが アプリはどうか? Copyright 2008-2010 HASH Consulting Corp. 105
クライアントアプリのセキュリティ 脅 威 端 末 の 紛 失 盗 難 を 気 にする 人 が 多 いが 端 末 が 他 人 の 手 に 渡 ったら いくらでも 時 間 を 掛 けて 解 析 できるので 端 末 上 のデータは 守 れないと 考 えた 方 がよい 重 要 なデータはサーバー(クラウド)に サーバーとの 通 信 にはHTTP/HTTPSが 広 く 利 用 される 基 本 的 にはWebアプリケーションと 同 じ 脅 威 SQLインジェクションなど XSS CSRFなどブラウザ 経 由 で 起 こる 問 題 は 発 生 しない ただし アプリからブラウザを 起 動 している 場 合 などは 例 外 認 証 に 注 意 端 末 認 証 によりパスワードなしで 使 えるアプリが 多 い 認 証 方 式 に 注 意 端 末 の 紛 失 盗 難 時 に 速 やかにアカウントロックができるようにサーバー 側 で 考 慮 を Copyright 2008-2010 HASH Consulting Corp. 106
クライアントアプリのセキュリティ 重 要 な 情 報 はサーバー 上 に 保 持 する Webアプリケーションと 共 通 のセキュリティ 対 策 認 証 がカギ 見 えないこと に 頼 ったセキュリティは 脆 弱 スマートフォンの 場 合 Wi-Fiパケットは 簡 単 にキャプチャできる アプリのリバースエンジニアリングの 可 能 性 クライアントアプリなら 端 末 固 有 IDが 取 得 できるが iphone: ICCID UDIDなど Android: ANDROID_ID IMEI SIMシリアル 番 号 など いずれも 認 証 に 使 ってはいけない Copyright 2008-2010 HASH Consulting Corp. 107
AT&Tのウェブサイトから ipad ユーザーのデータが 大 量 流 出 ブログネットワークのGawker Mediaは 米 国 時 間 6 月 9 日 AT&Tのウェブサ イトから ipad Wi-Fi + 3G ユーザー 約 11 万 4000 人 分 の 電 子 メールアドレス 情 報 が 流 出 したと 報 じた 漏 えいしたデータには 米 国 政 府 の 高 官 や 映 画 監 督 企 業 の 最 高 経 営 責 任 者 (CEO)のものも 含 まれているようだ 同 報 道 によると Goatse Securityと 名 乗 るハッカーグループが AT&Tのウ ェブサイトから ipadのsimカードのシリアル 番 号 を 含 んだHTTPリクエストを 送 信 し 電 子 メールアドレスを 入 手 したという このICCIDと 呼 ばれるシリアル 番 号 は 順 番 に 付 けられているため 容 易 に 推 測 できるとしている AT&Tの 広 報 担 当 者 は 米 CNETに 対 しデータ 流 出 があったことを 認 め 同 社 は7 日 Goatse Securityとは 関 係 しない 人 物 からiPadのICCIDのデータ 漏 え いの 可 能 性 について 報 告 を 受 け その 翌 日 に 電 子 メールアドレスを 提 供 する 機 能 を 停 止 したと 述 べた また ICCIDから 引 き 出 せる 情 報 は 電 子 メールア ドレスだけであり 同 社 は 調 査 を 継 続 するとともに 情 報 の 流 出 について 顧 客 に 報 告 していくと 発 表 した Goatse SecurityとAppleにもコメントを 求 めたが 返 答 は 得 られていない http://itpro.nikkeibp.co.jp/article/mag/20100611/349088/ より 引 用 108
電 波 チェッカー の 事 例 このアプリケーションは 端 末 識 別 のためUDID 情 報 を 使 用 します Copyright 2008-2010 HASH Consulting Corp. 109
対 策 Copyright 2008-2010 HASH Consulting Corp. 110
ケータイWebアプリの 対 策 認 証 とセッション 管 理 が 最 大 の 課 題 いずれもcookieを 使 えば 解 決 Webアプリケーションの 一 般 原 則 として セキュアな 作 りにする XSS SQLインジェクション 対 策 などをふつーに 実 装 する これはケータイではできないはず などと 手 を 抜 かない ケータイ 固 有 の 作 法 を 極 力 使 わない cookieが 使 えればcookieを 使 う ケータイ 固 有 の 特 性 をよく 勉 強 する キャリアとの 契 約 により 情 報 を 入 手 する 地 道 に 技 術 解 説 書 を 読 む ネット 等 のセキュリティ 勧 告 を 地 道 に 追 う Copyright 2008-2010 HASH Consulting Corp. 111
ご 清 聴 ありがとうございました Copyright 2008-2010 HASH Consulting Corp. 112