From: Makoto Kuwata Date: 2008-12-02T13:43:43+09:00 Subject: [ruby-list:45663] Re: セキュリティ制御モデルの改善について 桑田といいます。 面白そうなんですが、いくつか質問があります。 * 複数の引数を取るようなメソッドの場合はどのようになりますか。 たとえば次のような場合です。 class Html gate_public def foo(str, opts={}) # 引数が複数 ... end end * 複数のメソッドがあり、それぞれが異なるタイプの洗浄を 必要とする場合はどうなりますか。 たとえば HTML 文字列と SQL 文字列とでは、異なる洗浄 方法が必要ですが、それはどのように行うのでしょうか。 class Output def wash(str) ... end # wash() はひとつだけ gate_public def echo_html(str) ... end # HTML用の洗浄が必要 def echo_sql(str) ... end # SQL用の洗浄が必要 end * パッチを適用した Ruby と、適用してない Ruby とで、 コードを共通化する仕組みは用意されてますか。 たとえば、テストではパッチを適用した Ruby を使って サニタイズし忘れがないことを確かめ、本番環境では 通常の (= パッチが適用されてない) Ruby を使う、と いう利用方法が考えられます。 * この方法を利用して作られたサンプルアプリケーションは ありますか。またもしあるとして、それは公開されてますか。 よろしくお願いします。 -- regards, makoto kuwata 2008/12/1 Kiyotaka ATSUMI : > 渥美と申します. > > セキュリティ制御モデルの改善について研究しています.以前関連論文を発表 > したことも有りますので,詳細は以下を御覧下さい. > > オブジェクト毎にセキュリティ制御可能なtaintモデル > https://www.ka-lab.jp/index.cgi?c=plugin;plugin=attach_download;p=%B8%A6%B5%E6%B6%C8%C0%D32005-2009;file_name=IPSJ.PRO66.paper.pdf > > オブジェクト毎にセキュリティ制御可能なtaintモデルのRuby言語への実装について > https://www.ka-lab.jp/index.cgi?c=plugin;plugin=attach_download;p=%B8%A6%B5%E6%B6%C8%C0%D32005-2009;file_name=IEICE.SS69.paper.pdf > > これについて,皆様からの御意見を伺いたく,投稿します.簡単なアイディア > を以下に述べます.もし,ruby-devで議論すべしということでしたら,そのよ > うにご指示下さい. > > 以下,長文ですが,御了承下さい. > > 対象としているセキュリティ制御モデルはtaintモデルの方です.rubyのセキュ > リティレベル4のサンドボックスモデルではありません. > > 現在のtaintモデルは,rubyに限らずシステム保護を前提としており,セキュ > リティレベルに応じて,評価の実行や入出力を制限してシステムを保護しよう > とするものと理解しています.しかし,それでは,HTMLのクロスサイトスクリ > プティグや,SQLインジェクション攻撃に対しての有効な対策とならず,CGI作 > 成者やDBサービス提供者が個別アプリケーション毎に対策を施しているのが実 > 態です. > > そこで,各サービスは全てオブジェクトで扱うことを前提とし,オブジェクト > にメソッドを通してデータを送る時に,そのオブジェクトにとって安全なデー > タしか受け取らないようにする機構と,そのオブジェクトにとって安全になる > よう,データを洗浄する機能をセットにしたらどうかと考えるようになりまし > た.つまり,アプリケーション作成者が個別に洗浄機能を付加するのではなく, > クラス設計者が洗浄機能まで提供できるようにするということです. > > この方法には2つの利点が有ります. > > 1. 個別アプリケーション作成者は洗浄機能追加という作業から開放されます. > 個別アプリケーション作成者はクラス設計者の提供する洗浄機能を利用す > れば良いのです. > > 2. これまで同じクラスに対して洗浄方法がまちまちであり,時おりセキュリ > ティホールを作成してしまうことがありましたが,当該クラスのことを良 > く知っているクラス作成者が洗浄方法を提供するので,セキュリティ上の > リスクの軽減が期待できます. > > 具体的には以下のようにプログラムを書くことが出来るようになります. > > ----- BEGIN ----- BEGIN ----- BEGIN ----- BEGIN ----- BEGIN ----- > 1: class Html > 2: def wash(a) > 3: a.gsub!(/ 4: a.gsub!(/>/, '>') > 5: return true > 6: end > 7: > 8: gate_public > 9: def foo(a) > 10: puts a > 11: end > 12: end > 13: > 14: html = Html.new > 15: str = gets # safe for nil > 16: html.clean(str) # safe for Html > 17: html.foo(str) > ----- END ----- END ----- END ----- END ----- END ----- END ----- > > クラス設計者はwashというプライベートメソッドを定義します.ここで,受け > 取ったデータの洗浄を試みます.受け取ったデータの洗浄に成功した場合は > trueを,失敗した場合はnilを返すように作成します. > > gate_public以降に書かれたパブリックメソッドはこのメソッドによって送ら > れてきたデータがこのオブジェクトにとって安全かどうかを判断してからメソッ > ドの実行をします.他のクラスで安全とされたデータで有っても,このクラス > で安全と記されていなければ実行は遮断されます.gate_public以外に, > gate_protected, gate_privateも有ります.今までのpublic, protected, > privateもありますので,今まで作成されたコードとも互換性が有ります. > > クラスの利用者は,あるクラス用に洗浄したいデータについて,そのクラスが > 用意したcleanメソッドを当該データを付けて呼び出すだけです.上記のよう > に15行で読み込んだデータは外から取り込んだデータなので安全ではありませ > ん.これをcleanメソッドで安全になるよう加工できます.もし,16行目をコ > メントアウトし,プログラム実行時に適当な文字列を入力すると,17行目実行 > 時に > > test.rb:17: Arguments are tainted @ foo (MethodCallError) > > といったソフトウェア割り込みを発生させて停止します. > > cleanメソッドの実体は,washメソッドの実行と,washメソッド実行成功時に, > 洗浄したデータについて,当該クラスにとって安全であるというマークを付け > る2つの作業から成っています. > > なお,プログラム中にハードコードされたデータは,どのクラスに対しても安 > 全であるとしています. > > これだけだと分かり難いと思うので,ruby-1.8.7-p72に対するパッチを下記の > 場所に用意しました.もし,お時間があり,面白そうだと思われた方は実行し > ていただき,コメントを頂戴出来れば幸いです.よろしくお願いします. > > パッチデータの場所 > > https://www.ka-lab.jp/~kiyotaka/ruby-1.8.7-p72-sec-ruby-0.1.diff > > パッチの適用は以下の通り > > 1. 適当なディレクトリに, > ruby-1.8.7-p72.tar.bz2 > ruby-1.8.7.p72-sec-ruby-0.1.diff > を置く. > > 2. 以下の通り実行してrubyバイナリを作成する. > $ tar xvjf ruby-1.8.7-p72.tar.bz2 > $ cd ruby-1.8.7-p72 > $ patch -p1 <../ruby-1.8.7.p72-sec-ruby-0.1.diff > $ ./configure > $ make > $ make test > > 3. カレントディレクトリにrubyバイナリが出来ている. > > -- > Kiyotaka ATSUMI, Suzuka National College of Technology > Web: https://www.ka-lab.jp/ > PGP Public Key: https://www.ka-lab.jp/pubkey/kiyotaka-at-ka-lab.jp.asc > Finger Print: 9E2A 80B4 0F3D 424E 035F B594 991F 7795 DD6D 560F > > > > > >