狠狠撸

狠狠撸Share a Scribd company logo
WEBシステムのセキュリティーについて
(+FuelPHPでの対策方法)
2015/09/06
安達 知仁
自己紹介(1)
? 安達 知仁(アダチ トモヒト)
? エンジニア歴:十数年
– フリーランス兼2社の役員
– プレイングマネージャー、フルスタックエンジニア(?)
– 要件定義から運用?CSまで
– サーバーサイド、フロントエンド、インフラ、スマホアプリまで幅広く
– PHP/Java(J2EE/Android)/C#.NET/Javascript/C/VisualBasic(VBA)/XML/CSS/etc
? Facebook: https://www.facebook.com/adachi.tomohito
? Twitter: https://twitter.com/adachi_0523
? オウンドメディア:「Extend」http://extend.jpn.com/
自己紹介(2)
? 2010年:ベンチャー起業創業メンバーで加わり、他者の資金に頼らない
ブートストラップで成功。CTO取締役として一からソーシャルアプリシステ
ムを開発、構築し、会社の収益基盤を作る。
? 総ユーザー数:150万人、展開プラットフォーム:Mobage、GREE、Y!モバゲ
ー、AIMA、DMM、REAL WORLD
? 2015年:現在はフリーランスとして働きながら、コンサルティング会社の取
締役(CTO)として新規事業開発を担う。
? 知人のスタートアップや新規事業、サービス開発の支援やアドバイスも行
う。
? エンジニア交流会やビジネスモデル勉強会などを主催している。
基本的内容(おさらい)
? WEBシステムの脆弱性
– ユーザーなど外部からの入力を扱う動的な処理を行うWEBシステムで、
脅威となる行為(システムの乗っ取りや機密情報の漏洩など)に
利用される可能性のある欠陥や仕様上の問題
– 正常なリクエストと同じ(とみなされる)形で送信されるため、
ファイアーウォールやウィルス対策ソフト、侵入検知システムの導入などでは防
げない
http://www.itmedia.co.jp/enterprise/articles/0506/16/news030.html
– IPA(独立行政法人 情報処理推進機構)も注意喚起と対策情報を公開している
http://www.ipa.go.jp/security/
? 起こり得る被害
– 情報の流出?改ざん、サイトの改ざん、データ?システムの破壊、
サービスの停止など
– ユーザー端末への被害
背景
? エンジニアのセキュリティーや脆弱性対策の知識?スキル不足
? 恒久的なエンジニア不足と短納期(低コスト)化
– セキュリティー?脆弱性面の試験や品質の確保が困難
? リーン開発/MVP開発などでプロトタイプシステムから本番公開版
(β版以降)サービス移行時に
脆弱性対策が行われずに持ち越されるケース
? 外部委託やオフショア開発などで、
開発要件/要求仕様に入っていないケース
? 古いバージョンのCMSやフレームワークなどを使用していて
脆弱性が放置されているケース
SQLインジェクション
? 前提条件
– データーベースを使用しているシステム
– ユーザーからの入力値をパラメーターとして扱う
– 例:ログインフォーム、会員登録フォームなど
? 簡単な説明
– 任意のSQLを入力して実行される
– 例: 入力内容:a’ OR 1=1; --
→SELECT * FROM users WHERE name = ‘a’ OR 1=1; --‘
???usersテーブル全件取得(”--”以降はコメント行とみなされる)
? 危険性
– SQLで実行できる操作全て、SELECT、INSERT、UPDATE、DELETE、など
– 情報の流出、改ざん、データ破壊
SQLインジェクション
? 基本的な対策方法
– SQLが実行される前に入力された内容の特殊文字を適切にエスケー
プする(' →'‘)
– クライアント側の文字コードにシフトJISを使わない(マルチバイト文字
の問題対策)
– Prepared Statementあるいはバインドメカニズムを用いる
? セカンドオーダーSQLインジェクション
? ブラインドSQLインジェクション
などの発展形も。
? 参考資料
– SQLインジェクション - Wikipedia
– 星野君のWebアプリほのぼの改造計画(9):隠されていたSQLイン
ジェクション (1/2) - @IT
– Security&Trust ウォッチ(42):今夜分かるSQLインジェクション対策 -
@IT
クロスサイトスクリプティング(XSS)
? 前提条件
– ユーザーの入力内容を画面に出力するシステム
– 例:掲示板、wikiシステムなど
? 簡単な説明
– 任意のjavascriptが実行される
– 入力例:<script>alert(“XSS")</script>
→画面上に上記スクリプトが埋め込まれ、その画面(掲示板など)を見たユー
ザーのブラウザ上で”XSS”とアラート表示される
? 危険性
– サイトの改ざん
– 偽のページを作り出しフィッシングに用いられる
クロスサイトスクリプティング(XSS)
? 基本的な対策方法
– 画面表示処理を行う前に
HTMLの実体参照を用いてエスケープする
(& → &amp; 、< → &lt; 、> → &gt; 、" → &quot; )
– タグの属性値は必ず “~” (ダブルクオート)で括る
– プログラムファイルの文字エンコードはUTF-8で。
– CSP(Content Security Policy)では不十分
? セッションハイジャックやクロスサイトリクエストフォージュリに発展
? 「DOM Based XSS」、「ユニーバーサルXSS(UXSS)」などもある。
? 参考資料
– クロスサイトスクリプティング – Wikipedia
– ユニバーサルクロスサイトスクリプティング(UXSS)とは | 日立ソリュー
ションズの情報セキュリティブログ
クロスサイト?リクエスト?フォージュリ
(CSRF)
? 前提条件
– ログインやユーザー認証や行うシステム
– 例:facebookやmixiなどのSNSやその他(ブログ等)管理者用画面
? 簡単な説明
– 特定のサイトで利用した人のアカウントとして任意の操作を行わせる
ような仕組みを持った攻撃用ページを公開して利用させる
– 例: <img src=/slideshow/weblt/52461571/"http:/example.com/bbs/register.cgi?title=攻撃者が指
定した題名&article=攻撃者が指定した本文">
→このページにユーザーAがアクセスすると、example.comの掲示板
に
ユーザーAの投稿として”攻撃者が指定した本文”が書きこまれる
? 危険性
– 日記やコメントに意図しない投稿をさせられる
– オンラインショップで勝手に買い物をさせられる
クロスサイト?リクエスト?フォージュリ
(CSRF)
? 基本的な対策方法
– リクエスト(ユーザーからのアクセス)を受け付けた際に、
キーとなる値をCookie値およびformのhidden値(隠しパラ
メーター)として発行し、ユーザーからの操作が行われる
際にその両者の値の同一性をサーバー側で検証する
– XSS対策をしておくことが前提
? 参考資料
– クロスサイトリクエストフォージェリ - Wikipedia
クリックジャッキング
? 前提条件
– ログインやユーザー認証や行うシステム
– 例:facebookやmixiのSNSやその他(ブログ等)管理者用画面
? 簡単な説明
– 正常なサイトの上にiFrameなどを用いてOHPフィルムのような透明な
罠ページに重ねて偽装し、ユーザーが意図しない操作を行わせる
? 危険性
– アカウントが乗っ取られる(フィッシング)
– IDやパスワードが漏えいする
– 日記やコメントに意図しない投稿をさせられる
– オンラインショップで勝手に買い物をさせられる
クリックジャッキング
? 基本的な対策方法
– HTTPレスポンスにX-FRAME-OPTIONS の設定を記述する
– ユーザー側で(極力)最新のブラウザを使用してもらう
→古いブラウザではX-FRAME-OPTIONSが未実装(無効)
– CSP(Content Security Policy)では不十分
? 参考資料
– IPAから「クリックジャッキング」に関するレポート出ました | 徳丸浩の
日記
– あの徳丸本にも間違いはある! 自分で確認することが大切です - A
Day in Serenity @ kenjis
– 知らぬ間に自ら「設定変更」~クリックジャッキング攻撃を防ぐ - 第1
回 SNSの個人情報がさらされる、昔ながらの攻撃だが対策は後手:
ITpro
– ? クリックジャッキングって? TECHSCORE BLOG
FuelPHPについて
? PHPのWebアプリケーションフレームワーク
? オープンソース
? HMVCパターン
? MITライセンス
? 参考資料
– FuelPHP - Wikipedia
– FuelPHP開発入門_01 – Qiita
FuelPHPについて
? バグ?脆弱性
– (1.7.1以下対象)任意のコードが実行される脆弱性
– JVN#94791545: FuelPHP において任意のコードが実行される脆弱性
– (1.6.1 以下対象)DB quote_identifier() の SQL インジェクション
– (1.6.1 以下対象)xss_clean() の Unicode EM Space の処理の問題によ
る XSS
– FuelPHP 1.6.1 以下へのセキュリティ勧告(脆弱性) - A Day in Serenity @
kenjis
– (1.6以下対象)RestコントローラでのXSS脆弱性
– 本当は怖いFuelPHP 1.6までのRestコントローラ — A Day in Serenity
(Reloaded) — PHP, FuelPHP, Linux or something
– など
– FuelPHP のバグ情報 : FuelPHP まとめ Wiki
???出来るだけ最新バージョンを使いましょう
FuelPHPでの対策方法
SQLインジェクション
? 安全な方法
– Query Builder (クエリビルダー)を用いる
$result = DB::select()->from('users')->where(‘user_id', '=', 1)->execute();
– ORMパッケージを使用する(内部でQuery Builder が使われる)
$result = Model_User::query()->where('user_id', $user_id)->get_one();
– プリペアドステートメントを用いる(PDOStatementのprepareやbind)
? 危険な例
– DB::query()メソッドでパラメータをそのまま使用した場合はSQLインジェク
ションが可能になるので注意!
DB::query(‘SELECT * FROM users WHERE user_id=' . $user_id)->execute();
? 参考資料
– FuelPHP でのセキュリティ対策(2) - A Day in Serenity @ kenjis
– fuelphpのSQLインジェクション対策とSQLインジェクションの機械的
チェック - kiriya-systemの日記
FuelPHPでの対策方法
XSS
? 安全な方法
– 入力パラメーターをコントローラーからビューに渡す時点で自動的にエスケープさ
れるようにFuelはデフォルトで設定されている
– $this->template->content = View::forge(‘hoge/index’, Input::get(‘id’));
? 安全でない方法(エスケープしたくない場合に使用)
? Viewクラス forge()メソッドの第三引数に「false」を設定
– $this->template->content = View::forge('hoge/index', $data, false);
? 変数を指定してエスケープしない値をビューに渡す
– $this->template->content->set_safe('hoge_html', $data['hoge_html']);
? MVCに則った構成でない場合は適用されない
– <?php echo Input::get(‘id’); ?>
? 参考資料
– FuelPHP でのセキュリティ対策(1) - A Day in Serenity @ kenjis
FuelPHPでの対策方法
クリックジャッキング
? 安全な方法
– ベースとなるクラスを作成してbefore内に記述して全クラスで継承
すると楽
– しかし、古いブラウザでは実装されていないため最新バージョンの
ブラウザを使ってもらうことが必要。
? 参考資料
? FuelPHP - Controller間共通でHTTPヘッダを追加する方法 – Qiita
$this->response->set_header(‘X-FRAME-OPTIONS’, ‘SAMEORIGIN’);
X-Frame-Options には、3 種類の値を設定できます:
DENY
…サイト側の意図に関わらず、ページをフレーム内に表示することはできません。
SAMEORIGIN
…自身と生成元が同じフレーム内に限り、ページを表示することができます。
ALLOW-FROM uri
…指定された生成元に限り、ページをフレーム内に表示できます。
FuelPHPでの対策方法
クリックジャッキング
? Webサーバー設定ファイルでの対応方法
– ApacheやNginx、IISなどでも設定可能。一括?一律に対応できるので、
可能ならそのほうがお勧めです。
? 参考資料
– クリックジャッキング対策(Apache/IIS) | Webセキュリティの小部屋
– X-Frame-Options レスポンスヘッダ - HTTP | MDN
# (Apache)httpd.conf 設定例
$ sudo vi /etc/httpd/conf/httpd.conf
# クリックジャック対策
Header always append X-FRAME-OPTIONS SAMEORIGIN
# Apache再起動
$ sudo service httpd restart
他にもたくさん
? アカウント乗っ取り
? セッションハイジャック
? OSコマンドインジェクション
? HTTPヘッダインジェクション
? パス/ディレクトリトラバーサル
? バックドアとデバッグオプション
? Cookieポイズニング
? DDoS攻撃
? 参考資料:
– Webアプリの常識をJSPとStrutsで身につける(11):Webアプリにおけ
る11の脆弱性の常識と対策 (1/4) - @IT
サーバー環境による問題
? ハートブリード
– ハートブリード - Wikipedia
– より危険な日本の「ハートブリード」問題:日経ビジネスオンライン
? ShellShock(シェルショック)
– Shellshockとは | 日立ソリューションズの情報セキュリティブログ
– ShellShockの衝撃 -- バグの舞台裏
– 記者の眼 - 記者は「ShellShock」に触れてみた、そして震え上がった:ITpro
? POODLE: SSLv3.0 脆弱性
– POODLE: SSLv3.0 脆弱性 (CVE-2014-3566) - Red Hat Customer Portal
– SSL v3.0の脆弱性「POODLE」ってかわいい名前だけど何?? - Padding Oracle On
Downgraded Legacy Encryptionの仕組み - — Mobage Developers Blog
? GHOST
– http://japan.zdnet.com/article/35059585/
静的コンテンツでの問題
? 公開前のIR情報が閲覧可能になっていたという事例
– 公開前の情報がネット流出、重大ミス防ぐ「5カ条」 :日本経済新闻
まとめ
? セキュリティー脆弱性の対策方法は、サーバーサイドのシス
テム開発に関わるエンジニアは知っておくべき技術
? 攻撃を受けた場合の損害は会社経営に与えるインパクトが
大きい
? 開発が進み後になるほど脆弱性の対策はより困難になり規
模?コストが何倍にも増加する
? 開発の初期段階で対策方針を決めてコーディング規約化す
ることで、開発メンバー間の認識を合わせて一定の品質を保
つのに役立てることができる
? 脆弱性は発見されるので日ごろからアンテナを張り情報を
キャッチアップしていくことが大切
– セキュリティー系のメルマガ、OWASP、IPAサイト など

More Related Content

奥别产システム脆弱性尝罢资料