20080521-Ruby-on-Rails-Security
Upcoming SlideShare
Loading in...5
×
 

20080521-Ruby-on-Rails-Security

on

  • 3,797 views

 

Statistics

Views

Total Views
3,797
Views on SlideShare
3,559
Embed Views
238

Actions

Likes
2
Downloads
28
Comments
0

2 Embeds 238

http://ruby-sapporo.org 190
http://blog.stco.info 48

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    20080521-Ruby-on-Rails-Security 20080521-Ruby-on-Rails-Security Presentation Transcript

    • 2008-05-21(水); Apple Store Sapporo Ruby Sapporo Night vol.6 Rails 入門 セキュリティ Ruby on Rails Security 日本Rubyの会島田浩二 Ruby札幌 snoozer.05@ruby-sapporo.orgSHIMADA Koji; Nihon Ruby-no-kai; RubySapporo
    • Tell The Topic of Ruby, RubySapporo! Ruby札幌、Rubyの話しろ!
    • しまだこうじhttp://iddy.jp/profile/snoozer05✓ ふつうのフリーランス・プログラマ✓ 日本Rubyの会 ✓ Ruby札幌 運営 ✓ RubyKaigi スタッフ/実行委員✓ プログラミングの楽しさを共有したい✓ 自分の知らないコトやヒトに出会いたい
    • どうぞ よろしくお願いします
    • まとめ✓ Railsは標準でさまざまなセキュリ ティ対策をサポートしている✓ 重要なのはRailsによる対策のポイン トを理解すること✓ 用法・用量を守って正しくお使い下 さい
    • 今日のゴール✓ Railsアプリがセキュアかどうかを 確認するための、いくつかの基本的な チェック項目について知る✓ それぞれのチェック項目を満たすため の作戦を知る
    • チェックリスト
    • チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
    • 一つずつ
    • チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
    • チェック項目1見せなくてよい情報を 公開していないか
    • 見せなくてよい情報を公開していないか
    • 見せなくてよい情報を公開していないか
    • 見せなくてよい情報を公開していないか
    • 見せなくてよい情報を公開していないか
    • 見せなくてよい情報を公開していないか 422ステータスのテンプレートが デフォルトで用意されているのは Rails2.0∼
    • 何が起きるか✓ 攻撃者に攻撃方法を考えるヒントを 与えてしまう✓ フレームワークや固有のバージョン の脆弱性をつかれる可能性がある
    • 対策✓ 攻撃のヒントになる可能性のある情報は、極力表に出さない✓ デフォルトのページなどをそのままにしない✓ アクセス制御をきちんと
    • 対策config/routes.rbActionController::Routing:: Routes.draw do ¦map¦ … map.root :controller => "welcome" …end トップページが指定された場合の ルーティング先を定義
    • 対策 各種デフォルトのテンプレートを きちんと差し替える
    • 対策httpd.conf…<DirectoryMatch "^/.*/.svn/"> ErrorDocument 403 /404.html Order allow,deny Deny from all Satisfy All</DirectoryMatch>… Webサーバでファイルのアクセス に関する適切な設定を行う
    • 見せなくてよい情報を 公開していないか✓ 攻撃のヒントになる可能性のある情報は、極力表に出さない✓ デフォルトのページなどをそのままにしない ✓ ステータスページ等✓ アクセス制御をきちんと ✓ サーバの設定などをきちんと確認
    • チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
    • チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
    • チェック項目2重要なモデル属性を 保護できているか
    • 重要なモデル属性を 保護できているかdb/migrate/00X_create_users.rb create_table :users do ¦t¦ t.string :login t.string :name t.string :password t.integer :admin, :default => 0 endapp/models/user.rb 制御に絡む属性 class Users < ActiveRecord::Base end
    • 重要なモデル属性を 保護できているかdb/migrate/00X_create_users.rb create_table :users do ¦t¦ t.string :login t.string :name t.string :password t.integer :admin, :default => 0 endapp/models/user.rb 何のガードもしていない 制御に絡む属性 class Users < ActiveRecord::Base end
    • 重要なモデル属性を 保護できているかhttp://example.com/users/new
    • 重要なモデル属性を 保護できているかhttp://example.com/users/new
    • 何が起きるか✓ 攻撃者の視点✓ このフォームを使って何か攻撃できないか✓ フィールドにありそうな属性でも追加 してみるか✓ ユーザ情報だったら管理者権限か✓ とりあえずadminあたりから
    • 何が起きるかオリジナルのフォーム <form action="/users" method="post"> <input name="user[login]" type="text" /> <input name="user[name]" type="text" /> <input name="user[password]" type="text" /> <input name="commit" type="submit" value="Create" /> </form>
    • 何が起きるか改変されたフォーム <form action="/users" method="post"> <input name="user[login]" type="text" /> <input name="user[name]" type="text" /> <input name="user[password]" type="text" /> <input name="user[admin]" type="text" /> <input name="commit" type="submit" value="Create" /> </form>
    • 何が起きるか改変されたフォーム <form action="/users" method="post"> <input name="user[login]" type="text" /> フォームを改変されて使用されると <input name="user[name]" type="text" /> <input name="user[password]" type="text" /> 公開していない属性でも上書きされてしまう <input name="user[admin]" type="text" /> <input name="commit" type="submit" value="Create" /> </form>
    • 対策✓ 制御に絡む属性はきちんと保護する✓ フォームからのリクエストで直で更新しない✓ ARが提供している仕組みを利用する ✓ attr_protected, attr_accesible
    • 対策attr_protectedのサンプルclass Users < ActiveRecord::Base attr_protected :adminend 指定した属性は一括代入時には無視されるattr_accesibleのサンプルclass Users < ActiveRecord::Base attr_accesible :login, :name, :passwordend 指定した属性以外は一括代入時には無視される
    • 重要なモデル属性を 保護できているか✓ 制御に絡む属性はきちんと保護する✓ フォームからのリクエストで直で更新しない✓ ARが提供している仕組みを利用する ✓ attr_protected, attr_accesible ✓ 開発当初はattr_protectedを使用し、開発 が進み制御に絡む属性が増えてきたら attr_accesibleへ切り替えるのが吉
    • チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
    • チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
    • チェック項目3コントローラメソッドが公開されていないか
    • コントローラメソッドが 公開されていないかapp/controllers/users_controller.rbclass UsersController < ApplicationController # 外部に公開しているアクション def activate mark_as_activate if valid_request end # 具体的にアクティベート化を行う処理 def mark_as_activate ... end publicメソッドとして定義してしまっているend
    • 何が起きるか✓ 内部処理が外部からアクションとして 呼べてしまう✓ ブラウザ等から容易に実行できてしまう✓ 悪意がなくても踏んでしまう危険性が ある✓ 一度でも呼ばれると、システムの整合性 は保証できない
    • 対策✓ コントローラメソッドのアクセス制 御をきちんと管理する✓ アクションではないメソッドはpublic にしない✓ アクセス制御の明示 ✓ private, protected
    • 対策app/controllers/users_controller.rbclass UsersController < ApplicationController def activate mark_as_activate if valid_request end private def mark_as_activate ... endend
    • コントローラメソッドが 公開されていないか✓ コントローラメソッドのアクセス制 御をきちんと管理する✓ アクションではないメソッドはpublic にしない✓ アクセス制御の明示 ✓ private, protected
    • チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
    • チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
    • チェック項目4 出力ページの エスケープ処理に 漏れはないか
    • 出力ページのエスケープ処理に 漏れはないかapp/views/users/show.erb.rhtml...<p> <b>Name:<b> <%= @user.name %></p>... hメソッドによる、特殊文字のHTMLエンティ ティとしてのエスケープ処理が漏れている
    • 何が起きるか✓ クロスサイト・スクリプティング攻撃(XSS)✓ 攻撃者が埋め込んだ任意のスクリプトが 出力ページ内に挿入されてしまう✓ ページの訪問者のCookie情報が盗み取られ る等、致命的な被害を引き起こす入り口
    • 対策✓ 出力ページのエスケープ処理について 漏れがないことを確認する✓ SafeERBプラグインを使用しエスケープ 漏れを検出✓ sanitizeメソッドを使用しホワイトリス ト形式で出力時にスクリプトを除去
    • 対策✓ SafeERB✓ http://agilewebdevelopment.com/plugins/safe_erb✓ taint機構を使ってエスケープ漏れを チェック✓ エスケープ漏れがあると例外 ✓ SQLiteから取り出した値はtaintedではない ので例外が出ないので注意→確認する場合は PostgresやMySQLで
    • 対策✓ sanitizeメソッド ✓ ホワイトリスト方式を使用し任意のタグ を除去app/views/users/show.erb.rhtml ... <p> <b>Name:<b> <%= sanitaize(@user.name) %> </p> ...
    • 出力ページのエスケープ処理に 漏れはないか✓ 出力ページのエスケープ処理について 漏れがないことを確認する✓ SafeERBプラグインを使用しエスケープ 漏れを検出✓ sanitizeメソッドを使用しホワイトリス ト形式で出力時にスクリプトを除去
    • チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
    • チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
    • チェック項目5 DBへ渡す入力の エスケープ処理に 漏れはないか
    • DBへ渡す入力のエスケープ処理に 漏れはないかapp/controllers/user_controller.rb
    • DBへ渡す入力のエスケープ処理に 漏れはないかapp/controllers/user_controller.rb ユーザ入力をそのままSQLへ変換してしまって いるためエスケープ処理が行われていない
    • DBへ渡す入力のエスケープ処理に 漏れはないかapp/controllers/user_controller.rb ユーザ入力をそのままSQLへ変換してしまって いるためエスケープ処理が行われていない
    • 何が起きるか✓ SQLインジェクション✓ サーバ上で実行されるSQLを攻撃者が 制御可能になってしまう✓ データベースを不正操作され致命的な被 害を引き起こす
    • 対策✓ SQLの組み立てにはバインド変数を使 用しSQLのメタ文字をエスケープする✓ ?プレースホルダの使用して値を指定✓ 名前付きバインド変数のハッシュを使用
    • 対策✓ プレースホルダの使用User.find(:first, :conditions => [ name = ? , params[:name]])User.find(:all, :conditions => [ category IN (?) ,[1, 2, 3]])
    • 対策✓ 名前付きバインド変数の使用User.find(:first, :name => params[:name], :password => params[:password])User.find(:first, :conditions => [ name = :name , :name => params[:name]])
    • DBへ渡す入力のエスケープ処理に漏れはないか✓ SQLの組み立てにはバインド変数を使 用しSQLのメタ文字をエスケープする✓ ?プレースホルダの使用して値を指定✓ 名前付きバインド変数のハッシュを使用
    • チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
    • チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
    • チェック項目7 外部ページからの不正なリクエストをガードできているか
    • 外部からの不正なリクエストを ガードできているかapp/views/blog/edit.rhtml<% form_for(@blog) do ¦f¦ %> ...<% end %>app/controllers/blogs_controller.rbclass BlogsController < ApplicationController ... def update ... リクエスト処理に対して end 何もガードをかけていない ...end
    • 何が起きるか✓ クロスサイトリクエストフォージ(CSRF)✓ 攻撃者の誘導により、ユーザが外部ペー ジから攻撃者の用意したリクエストを 実行してしまう
    • 対策✓ リクエストの有効性を検証する✓ Rails2.0からはデフォルトで対策の処理 が入っている✓ protect_from_forgery ✓ ApplicationControllerクラスで指定 ✓ Railsの生成するフォームと対で検証用 のトークンを持ち、それらを比較するこ とでリクエストの有効性を評価
    • 対策✓ protect_from_forgeryの使用class ApplicationController < ActionController::Base protect_from_forgeryendclass BlogController < ApplicationController::Base protect_from_forgery :only => [:create,:update]end
    • 外部からの不正なリクエストを ガードできているか✓ リクエストの有効性を検証する✓ Rails2.0からはデフォルトで対策の処理 が入っている✓ protect_from_forgery ✓ ApplicationControllerクラスで指定 ✓ Railsの生成するフォームと対で検証用 のトークンを持ち、それらを比較するこ とでリクエストの有効性を評価
    • チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
    • チェックリスト1. 見せなくてよい情報を公開していないか2. 重要なモデル属性を保護できているか3. コントローラメソッドが公開されていないか4. 出力ページのエスケープ処理に漏れはないか5. DBへ渡す入力のエスケープ処理に漏れはないか6. 外部ページからの不正なリクエストをガードできているか
    • 今日のゴール✓ Railsアプリがセキュアかどうかを 確認するための、いくつかの基本的な チェック項目について知る✓ それぞれのチェック項目を満たすため の作戦を知る
    • セキュリティについてもう少し知りたくなったら OSC2008-do Ruby/Rails セキュリティハンズオン(仮) 開催日:2008年6月28日(土)  場所:さっぽろ産業振興センター 参加費:無料
    • セキュリティ以外について 知りたくなったら Railsレシピブック 高橋征義, 諸橋恭介(著) 発売日:2008年5月31日 出版社:ソフトバンククリエイティブ  価格:2940円(税込)
    • まとめ✓ Railsは標準でさまざまなセキュリ ティ対策をサポートしている✓ 重要なのはRailsによる対策のポイン トを理解すること✓ 用法・用量を守って正しくお使い下 さい
    • ご清聴 ありがとうございました