5

問題の完璧な例を次に示します:分類子の gem が Rails を壊します

** 元の質問: **

セキュリティの専門家として気になる点の 1 つは、Ruby には Java のパッケージ プライバシーに匹敵するものがないことです。つまり、これは有効な Ruby ではありません。

public module Foo
  public module Bar
    # factory method for new Bar implementations
    def self.new(...)
      SimpleBarImplementation.new(...)
    end
    def baz
      raise NotImplementedError.new('Implementing Classes MUST redefine #baz')
    end
  end

  private class SimpleBarImplementation
    include Bar
    def baz
      ...
    end
  end
end

Foo::BarImpl のモンキー パッチを防ぐことができれば非常に便利です。そうすれば、ライブラリに依存している人々は、誰もそれをいじっていないことを知ることができます。誰かがあなたの MD5 または SHA1 の実装を変更したと想像してみてください! これらのクラスを呼び出すことはできますfreezeが、クラスごとに行う必要があり、読み込み順序に十分注意しないと、アプリケーションの保護が完了する前に他のスクリプトによってそれらが変更される可能性があります。

Java は防御的プログラミングのための他の多くのツールを提供しますが、その多くは Ruby では不可能です。(適切なリストについては、Josh Bloch の本を参照してください。) これは本当に懸念事項ですか? 文句を言うのをやめて、Ruby を軽量のものに使用し、「エンタープライズ対応」のソリューションを期待しないでよいのでしょうか?

(いいえ、Ruby ではコア クラスはデフォルトで凍結されていません。以下を参照してください:)

require 'md5'
# => true
MD5.frozen?
# => false
4

9 に答える 9

9

これは心配ないと思います。

はい、神話上の「誰か」は、MD5 の実装を安全でないものに置き換えることができます。しかし、それを行うには、架空の誰かが実際に自分のコードを Ruby プロセスに取り込める必要があります。そして、それができれば、Java プロセスに自分のコードを挿入して、たとえば MD5 操作のバイトコードを書き直すこともできるはずです。または、キープレスをインターセプトするだけで、実際には暗号化コードをいじる必要はまったくありません。

典型的な懸念の 1 つは、次のように使用されるはずのこの素晴らしいライブラリを作成していることです。

require 'awesome'
# Do something awesome.

しかし、誰かがそれを次のように使用するとどうなりますか:

require 'evil_cracker_lib_from_russian_pr0n_site'
# Overrides crypto functions and sends all data to mafia
require 'awesome'
# Now everything is insecure because awesome lib uses 
# cracker lib instead of builtin

そして、簡単な解決策は次のとおりです。そうしないでください。セキュリティ クリティカルなアプリケーションで、あいまいなソースからダウンロードした信頼できないコードを実行してはならないことをユーザーに教育します。もしそうなら、彼らはおそらくそれに値するでしょう。

privateJava の例に戻ると、Java で暗号化コードを作成できることは事実ですfinal。ただし、誰かがあなたの暗号化実装を置き換えることができます! 実際、実際に行った人がいます。多くのオープンソース Java 実装では、OpenSSL を使用して暗号化ルーチンを実装しています。そして、おそらくご存じのとおり、Debian には壊れた安全でないバージョンの OpenSSL が何年にもわたって出荷されてきました。つまり、過去 2 年間 Debian で実行されていたすべての Java プログラムは、実際に安全でない暗号で実行されていました!

于 2008-08-28T23:09:11.183 に答える
4

Java は防御的プログラミングのための他の多くのツールを提供します

最初は、通常の防御的プログラミングについて話していると思いました。その考えは、プログラム(またはそのサブセット、または単一の関数)を無効なデータ入力から防御することです。
これは素晴らしいことです。ぜひこの記事を読んでください。

ただし、実際には「他のプログラマーからコードを守る」ことについて話しているようです。

私の意見では、これは完全に無意味な目標です。何をしようとも、悪意のあるプログラマーは常にデバッガーの下でプログラムを実行したり、dll インジェクションやその他のさまざまな手法を使用したりできるからです。

無能な同僚からコードを保護しようとしているだけなら、これはばかげています。同僚を教育するか、より良い同僚を獲得してください。

いずれにせよ、そのようなことが気になるなら、Ruby はあなたのためのプログラミング言語ではありません。モンキーパッチは意図的にそこにあり、それを禁止することは機能の要点全体に反します。

于 2008-08-28T23:34:07.393 に答える
1

GarryDolleyによるImmutableをチェックしてください。

個々のメソッドの再定義を防ぐことができます。

于 2008-10-02T07:57:17.693 に答える
1

モンキー パッチを適用することに関心がある場合は、Immutable モジュール (または同様の機能の 1 つ) を使用できます。

不変

于 2008-10-02T08:01:32.597 に答える
1

Why the Lucky Stiff の "Sandbox" プロジェクトを参照してください。これは、安全でないコードを実行する可能性を心配している場合に使用できます。 http://code.whytheluckystiff.net/sandbox/

例 (オンライン TicTacToe): http://www.elctech.com/blog/safely-exposed-your-app-to-a-ruby-sandbox

于 2008-10-02T08:08:14.797 に答える
1

「同僚を教育するか、より良い同僚を獲得する」ことは、小規模なソフトウェア スタートアップには効果的であり、Google や Amazon のような大物企業にとっても効果的です。マイナーな都市の診療所で、すべての低レベルの開発者がいくつかの小さなカルテ アプリケーションの契約を結んだと考えるのはばかげています。

最小公倍数に合わせてビルドする必要があると言っているわけではありませんが、セキュリティに注意を払わずに、仕事を成し遂げるライブラリを引き込む平凡なプログラマがたくさんいることを現実的に考える必要があります。彼らはどのようにセキュリティに注意を払うことができますか? おそらく、アルゴリズムとデータ構造のクラスを取りました。たぶん、彼らはコンパイラのクラスを受講しました。彼らはほぼ間違いなく、暗号化プロトコルのクラスを受講していませんでした。彼らは間違いなく、Schneier や、ソフトウェアを構築する際にセキュリティを考慮するように非常に優れたプログラマーでさえ実際に懇願し、懇願しなければならない他の人を読んだわけではありません。

私はこれについて心配していません:

require 'evil_cracker_lib_from_russian_pr0n_site'
require 'awesome'

awesome私は、必要なfoobarand fazbot、およびfoobar必要なhas_gumption、および ... 最終的に、重要なセキュリティ面を元に戻す、あいまいな方法でこれらの 2 つが競合することを心配しています。

重要なセキュリティ原則の 1 つは、「多層防御」です。これらの追加のセキュリティ層を追加すると、誤って足を撃たれるのを防ぐことができます。完全に防ぐことはできません。何もできません。しかし、彼らは助けます。

于 2008-08-29T03:05:27.557 に答える
1

Rubyにはその機能があると思います-セキュリティの問題よりも価値があります。ダックタイピングも。
たとえば、Ruby String クラスを拡張またはラップするのではなく、Ruby String クラスに独自のメソッドを追加できます。

于 2008-08-28T14:48:38.780 に答える
1

Raganwald は、これに関する最近の投稿をしています。最終的に、彼は次のものを構築します。

class Module
  def anonymous_module(&block)
   self.send :include, Module.new(&block)
  end
end

class Acronym
  anonymous_module do
    fu = lambda { 'fu' }
    bar = lambda { 'bar' }
    define_method :fubar do
      fu.call + bar.call
    end
  end
end

これはs のfubarパブリック メソッドとして公開されAcronymますが、内部ガッツ (fuおよびbar) は非公開に保たれ、ヘルパー モジュールは外部ビューから隠されます。

于 2008-12-01T17:00:46.297 に答える
0

誰かがオブジェクトまたはモジュールにモンキーパッチを適用した場合は、2つのケースを調べる必要があります。彼は新しいメソッドを追加しました。このmeyhodを追加しているのが彼だけである場合(これは非常に可能性が高いです)、問題は発生しません。彼だけではない場合は、両方の方法で同じことができるかどうかを確認し、ライブラリ開発者にこの深刻な問題について伝える必要があります。

彼らが方法を変更した場合、あなたは方法が変更された理由を調査し始める必要があります。エッジケースの動作のために変更しましたか、それとも実際にバグを修正しましたか?特に後者の場合、モンキーパッチは多くの場所でバグを修正するため、神のようなものです。

それに加えて、プログラマーがこの自由を正しい方法で使用することを前提として、非常に動的な言語を使用しています。この仮定を取り除く唯一の方法は、動的言語を使用しないことです。

于 2008-11-18T06:21:08.977 に答える