パスワードを忘れた? アカウント作成
36298 story
セキュリティ

ソースコードを元にソフトウェアの異常な動作を検知する侵入検知システム 21

ストーリー by hylom
OSS専用の侵入検知システム 部門より

あるAnonymous Coward 曰く、

そのソースコードを元に、ソフトウェアの異常な振る舞いを検知するシステムが開発されている。このシステムは「Korset」と呼ばれており、開発者はテルアビブ大学のAvishai Wool教授と院生のOhad Ben氏だ(Science Daily本家/.)。

Korsetはホストベースの侵入検知システム(Host-based Intrusion Detection Systems、HIDS)の1種で、動作するアプリケーションを監視し、もしアプリケーションが攻撃され、バッファオーバフローなどによって想定外の動作を行おうとした際にそれをブロックする、というものだ。

一般的にこのようなシステムでは、あらかじめアプリケーションごとに許可する動作/許可しない動作を手動で指定したり、アプリケーションを動作させて許可する動作を学習させておく必要があった。いっぽうKorsetでは、アプリケーションのソースコードからアプリケーションの振る舞いを認識し、ソースコードに記述されていない動作を行おうとした際に、その動作をブロックする。

(つづく...)

詳しくはオタワLinuxシンポジウムで発表された論文を確認してほしいが、動作原理としてはソースコードからそのアプリケーションが呼び出すシステムコールの呼び出し順とその遷移のパターンを抽出し、そのパターンとは異なる順番でシステムコールが発行された場合、想定していない動作と見なしてブロックする、というもののようだ。

ただし、Korsetではそのソースコードが完全に入手できるアプリケーションしか対応できないほか、マルチスレッドやsetjmp、longjmpなどを利用するアプリケーションには対応していない、といった課題も残されている。また、システムコールをトラップするため、利用にはカーネルの修正が必要であるとのことだ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • これを使えば (スコア:4, おもしろおかしい)

    by Anonymous Coward on 2008年09月30日 18時40分 (#1429057)
    僕の書いたコードが思わぬ挙動をするのを防げるわけですね
  • すると攻撃方法は… (スコア:4, すばらしい洞察)

    by okky (2487) on 2008年09月30日 19時43分 (#1429079) ホームページ 日記
    まず、当該ソフトを strace で実行して、system call sequence を割り出してから、どこの部分を攻撃するか決め、制御権を奪った後
    『どのような順番でシステムコールを発行するべきか』
    に従ってシステムコールを発すれば良い、と。

    ほぼ全てのソフトが open/close/mmap/read/write を必ず実行する以上、守れる範囲はそんなに広くない気もするが…???
    実際問題として、攻撃対象になるようなソフトって大抵 fork/exec もするだろうし…
    --
    fjの教祖様
    • by Anonymous Coward
      でも、面白そうな技術ですよね。

      システムコールをトラップするため、利用にはカーネルの修正が必要であるとのことだ。

      ここらへんからふと思いついたんだけど、Xenに組み込んだりできないのかな?

      予めソースを手に入れて、そのソースを元にモジュールを作って組み込み、という感じからしてSELinuxのような感じになるのかな?

      # いや。仕事前の感想にて、失礼
      • by okky (2487) on 2008年10月01日 10時33分 (#1429409) ホームページ 日記
        どちらかというと、こういう技術のためには Ring2 を使えるようにしたほうが良いと思うんだ。Ring3のアプリがいきなり Ring0を呼ぶのではなく、真ん中でいろいろチェックしてくれる Ring1/2層があるkernel…

        あぁ、でもそれは Linux では駄目だ。実装できない。
        Linus君、micro kernel が大嫌いだったからな
        --
        fjの教祖様
        親コメント
        • 移植性を考えたらカーネル全体に影響するような特定プロセッサファミリ固有の機能なんて使いたくないだろうし、microkernelとはあんまり関係ないんじゃないか?
          親コメント
          • 特権モードがあるプロセッサにおいて、Supervisor モードと user mode の2つしかないプロセッサの方が珍しいと思うが。IA32はもちろん、IA64(風前の灯の Itanium2 の方ね)、Power(PCもそうじゃない方も)、R4000以降は3モード以上あるし。
            --
            fjの教祖様
            親コメント
            • 珍しいと言える程マイナーじゃないと思うがな。組み込み向けとか忘れてないか?
              移植性を保つには「だいたいの環境で使える」って機能に依存するわけにはいかんだろ。
              親コメント
              • 組み込み系の大半は User モード自体を持っていませんが。全部 Supervisor。

                「どこで何をするのかなど全部事前に判っているのだから、そんな機能はいらん。
                  それよりも1個あたりの値段を10円安くしろ」
                という声は私自身、直接聞いたこともあります。組み込みの場合、Supervisor mode, MMU, FPUは『いらないから消せ』といわれる3大機能ですな。

                つまり、2モードって意外と珍しいって事です。1か、あるいは3以上、はたくさんある。
                --
                fjの教祖様
                親コメント
              • 16bits以下はともかく32bits以上ではあるほうが多い。そういうのは大抵2モードだけどな。

                68k系だってSHだってMIPS(R3000以前を故意に無視してない?)だってARMだって大抵2モードじゃないか?何にしてもLinuxは現状では2モードしか使ってないし2モードのプロセッサ用ツリーがある以上、3モード以上を使うようになるとは思えんよ。RING1/2を使うように改造することはできるだろうけど、前にも書いたようにそれをするだけのメリットがあるようには思えないし。

                ところで、2つ以上のモードを使うことがセキュリティ的にメリットがあってメジャーなプロセッサでは2モード以上使えるのなら、OpenBSDあたりは当然2モード以上使ってるはずだと思うんだけど、これについてはどう思う?「個人的には実行時に怪しい動作を検出する」などというのは下策であって「そもそも悪さをする方法自体をなくすように設計する」というのが正しいアプローチだと思うけどね。
                親コメント
              • OpenBSDあたりは当然2モード以上使ってるはずだと思うんだけど、これについてはどう思う?

                どう思うではなく、根本的に「使うわけ無いじゃん」が答。

                モノリシックカーネルデザイン上でセキュリティを構築するなら、2モードだろうね。kernelモード内に存在するものは全て信頼できる、と言うのがモノリシックカーネルの大前提だから。

                OpenBSDは「kernel 自身は信じている」という大前提で作られている。kernelが提供する機能を信頼せず、userland に追い出そうとはしておらず、その代わり kernel内部のコードの信頼性を高めるためにレビューを繰り返している。だから、OpenBSDでマルチモードが採択されることは(OpenBSD自身が micro kernel デザインにならない限り)ありえない。

                .

                マルチモードデザインは、基本的に Mach のように

                1) まず全てのリソースを操作できる micro kernel がいて、
                2) デバイスドライバーや system call emulator のように micro kernel 上でユーザーのためのサービスを提供するための一連の supervisor process が存在して(つまり、ユーザー空間を必要に応じてアクセスできる特権者としてのプロセスがいて)
                3) supervisor process の提供するサービスを利用する user process がいる

                時に初めて役に立つ。2のレベルと3のレベルが「別物でなくてはいけない」かつ2のレベルは3のレベルを自由に制御できなくてはいけない(1まで戻らないと制御できないのでは、2で提供できるはずの機能を1に盛り込まなくてはいけないから)というスタンスに立った場合に初めて意味が出てくる。

                現実問題として、このような制御方式はマルチプロセッサ(マルチコアでもいいが)が当たり前にならないと全然性能が出ない。だから、今までは無かった。それだけの話。
                --
                fjの教祖様
                親コメント
  • 検知システム内会議 (スコア:2, おもしろおかしい)

    by Anonymous Coward on 2008年10月01日 15時33分 (#1429651)
    A「この動作は異常だろ……常識的に考えて」
    B「私はこういう動作のプログラムを他にも知っています。別に珍しくもありませんよ。」
    A「お前の周りが変なんだよ!まともなプログラムとも付き合えよw」
    B「それでは何をもって異常を定義するのですか?」
    A「常識で考えろよ……まったくナードは厄介だ」
    B「そうやってレッテルを貼って逃げるのですね?」
    A「じゃあこのプログラムの動作が攻撃によるものでないと証明できるのか?」
    B「悪魔の証明ですね。詭弁ですね。」

    C「あれ?どこかで無限ループが発生してない?」
    • by Anonymous Coward
      この検知システムは、

      A「この動作は異常だろ……ソースに、こんな呼び出し書かれてないぜ」
      B「なるほど、攻撃者に送り込まれたコードが動いてるんだ」

      というものだと。
    • by Anonymous Coward
      >C「あれ?どこかで無限ループが発生してない?」

      ちゃんと検知ロジックまで組み込まれているとは

      # D「いや、もう少しみてみようぜ」
      # E 「そうだな」
  • by eigen (34018) on 2008年10月01日 11時47分 (#1429431)
    > システムコールをトラップするため、利用にはカーネルの修正が必要であるとのことだ。
    カーネルを修正したことによって起こりうる異常な動作は検知できますか?
  • by Anonymous Coward on 2008年09月30日 18時48分 (#1429061)
    とりあえず、「そのソースコード」の「その」は何を示してるのでしょう
    • by Anonymous Coward
      > そのソースコードを元に、ソフトウェアの異常な振る舞いを検知するシステムが開発されている。

      これのことけ?

      あるソフトウェアがあって、そのソースコードを元に、そのソフトウェアの異常な振る舞いを~、だね。

      文学的表現だなww
  • by Anonymous Coward on 2008年09月30日 19時08分 (#1429069)
    プログラムミスによるバグや、仕様そのものが脆弱な場合は検知できませんよね。
    ソースコードに書いてあることだし。
    • by Anonymous Coward
      "バグ"の検知はそもそも目的ではないんじゃないでしょうか?

      例えば、コーディングのミスが原因でバッファオーバフローを引き起こす可能性ががある場合、
      実際にそこを突かれて任意のコードを実行されて"有り得ない"システムコールのシーケンスが
      発生した時点で初めて検出されるわけで。

      ソースコードや仕様レベルで問題部分を指摘するなんてのは、最初から狙ってないかと。
  • by Anonymous Coward on 2008年10月01日 7時55分 (#1429362)
    JITと親和性悪そうだなあ。システムコールを直接JITコードから発行せずに、ラッパーを噛ませて「既知の遷移リンクが無いノード」として扱えるのかもしれないけれど、この方法の有効性を否定しそうだし (論文ざっと読んでみたけどJITに関する記述が見つからなかった。この方法で問題なくカバーできるのかな?)。
    動的生成されるコードまで面倒を見るには、静的解析によって「あるコード生成コードが生成可能な全てのコード」に対する性質が証明できれば良いわけだけれど、そのためにはコード生成をするコードを高レベルで記述できる言語が必要になりそうだ。
typodupeerror

人生unstable -- あるハッカー

読み込み中...