dRuby and Security

841 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

dRuby and Security

  1. 1. dRuby and Security dRubyとセキュリティ 西山和広 日本Rubyの会Powered by Rabbit 0.5.7
  2. 2. drubyを不特定多数に向けて公開するの は危険
  3. 3. Security in rdocrdocでのSecurityについての説明 == Security As with all network services, security needs to be considered when using dRuby. By allowing external access to a Ruby object, you are not only allowing outside clients to call the methods you have defined for that object, but by default to execute arbitrary Ruby code on your server. Consider the following: 参考訳: あらゆるネットワークサービスと同様に、dRuby を使う場合には セキュリティを考慮することが欠かせない。 ある Ruby オブジェクトへの外部のアクセスを許すことによって、 そのオブジェクト向けにあなたが定義したメソッドを 外のクライアントが呼び出すことを許しているだけだはなく、 そのままだとあなたのサーバ上で任意の Ruby コードを実行する ことを許していることになる。 2/10
  4. 4. undef andinstance_evalrdocに載っている方法 (undefとinstance_eval) # !!! UNSAFE CODE !!! ro = DRbObject::new_with_uri("druby://your.server.com:8989") class << ro undef :instance_eval # force call to be passed to remote object end ro.instance_eval("`rm -rf *`") 本当にこのまま試すのは危険 3/10
  5. 5. method_missingmethod_missing 直接 ro.method_missing("instance_eval", "`echo hello druby`") 呼び出し側の記述が変わるだけ 出来ることは undef との組み合わせと同じ 4/10
  6. 6. insecure methods # List of insecure methods. # # These methods are not callable via dRuby. INSECURE_METHOD = [ :__send__ ] drb/drb.rb で禁止されているメソッド 直接呼べない instance_eval などと組み合わせれば呼べる send も呼べるのでほとんど制限はない 5/10
  7. 7. Method send_method = ro.method_missing(:method, :__send__) send_method.call(:puts, "hello druby!") Method オブジェクト経由 INSECURE_METHOD のチェックを回避可 能 6/10
  8. 8. $SAFEをあげて制限require drbDRb.start_service("druby://localhost:0", nil, :safe_level => 1)puts DRb.uriDRb.thread.joininstance_eval や system などは呼べないsafe level が 1 なら puts は呼べる 7/10
  9. 9. $SAFEでも防げないものDoSを狙うもの サーバ側で巨大な文字列を生成など rlimit などの OS の機能で制限他にもあるかも 8/10
  10. 10. デモ時間があればここでデモ 9/10
  11. 11. まとめdrubyを不特定多数に向けて公開するのは危険Powered by Rabbit 0.5.7 10/10

×