From: Hidetoshi NAGAI Date: 2003-08-29T18:00:30+09:00 Subject: [ruby-dev:21288] Re: 大量メモリ消費攻撃に対する対応 永井@知能.九工大です. 毎度毎度,妙なところばかりを突っついてすみません. 議論の取りかかりにはなれたようで,その点は嬉しく思います. From: matz@ruby-lang.org (Yukihiro Matsumoto) Subject: [ruby-dev:21285] Re: 大量メモリ消費攻撃に対する対応 Date: Fri, 29 Aug 2003 15:35:17 +0900 Message-ID: <1062138918.827840.23924.nullmailer@picachu.netlab.jp> > メモリ消費攻撃については以下のように考えました。 > * $SAFE=4ではmalloc(3)の失敗に対してNoMemoryErrorを発生さ > せ、そのスレッドを終了させる。 「信用できないスクリプトは $SAFE=4 で」というのは 確かに本来はそうあるべきなのだとは思うのですが, 外部から持ちこんだスクリプトを丸々 $SAFE=4 で実行しようとした場合, 制約が厳しすぎて何もできないのと同意ですので, $SAFE=3 での実行を考えていました. # 例えば現在の Ruby/Tk は $SAFE=4 では全く動かせません. > しかし、これでは > > * malloc(3)が失敗するまで、つまりかなりの量のメモリを実際 > に割り当てるまで検出できない。 > > * 例外を捕捉されたら、検出がますます遅れる。その間に > $SAFE<4のスレッドが終了してしまうかも。 > > という問題が残ります。 malloc に失敗する状態まで確保させてしまうのは危険に感じます. その状態ですとすでにシステム負荷は非常に大きくなってしまっている と思いますので,そうなる前になんとか食い止めたいところですね. > |そこでなのですが,次のようなことは可能でしょうか. > |---------------------------------------------------------------------- > | ・スレッドないしスレッドグループ単位でメモリ制約を設定する. > | > | ただし,個々のスレッドないしスレッドグループが使用しているメモリを > | カウントすることは困難と思われるため,新しいオブジェクトの生成時に > | add_heap() が呼ばれたなら,その時点で Ruby 全体が使用している heap > | のサイズが与えられたメモリ制約値を越えているかを調べ,越えていれば > | エラーを生じるようにするという方法を取る. > | > | スレッドないしスレッドグループを新しく生成する場合には,生成元のメ > | モリ制約を引き継ぐこととし,メモリ制約の変更も利用可能量を減らす方 > | 向にしか許さないこととする. > |---------------------------------------------------------------------- > |実現可能性があって,かつ,処理負担が小さく有効に機能するように > |思える案といして出してみたものですが,いかがなものでしょうか? > > 早めに検出すると言う意味で現状よりは望ましい性質があるとは思 > います。制約値をどう定義するかなど悩ましい問題はありますが、 > 議論を深めたいと思います。 実は「制約値を自動的に」というのはあまり考えていませんでした. 信頼できるスレッド (メインスレッド) から信頼できないスレッドを 起動する際に適当に制約を与えるというようなことを思っていました. えいやぁでサンプル的な値を決めておいて,後は任せるというのでは だめですかね.(^_^; -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp