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

Linux カーネルの zero-day exploit コード、リリースされる 34

ストーリー by reo
読売の記事になってるのがびっくりだ 部門より

ある Anonymous Coward 曰く、

Linux カーネルの脆弱性を突いた zero-day exploit がリリースされたそうだ (CNET Japan の記事YOMIURI ONLINE の記事本家 /. 記事より) 。

Brad Spengler 氏がリリースしたこのコードを利用すれば NULL ポインタデリファレンスの保護を突破し、root 権限を掌握することが可能という。さらにこのコードは SELinux や AppArmor、また Linux Security Module の監査機能を無効化することもできるとのことで、それらの機能が有効であるかのようにシステムに思い込ませることができるそうだ。この脆弱性は Linux カーネル 2.6.30 及び 2.6.18 にあり、32 ビット版と 64 ビット版共に影響を受けるとのことで、この zero-day exploit のデモ動画も公開されている。

なお、SANS Internet Storm Center でもこの脆弱性に関するレポートが確認できる。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 2.6.30.2 で対策 (スコア:4, 参考になる)

    by oltio (3848) on 2009年07月22日 14時11分 (#1609291) 日記

    19日にリリースされた 2.6.30.2 で対策されていました。2.6.18 系列へのバックポートはおそらく採用しているディストリビューションからリリースされているのでしょう。

    commit 76f578b630347be522b6df7917013fd0712612e5
    Author: Eugene Teo
    Date: Wed Jul 15 14:59:10 2009 +0800

            Add '-fno-delete-null-pointer-checks' to gcc CFLAGS

            commit a3ca86aea507904148870946d599e07a340b39bf upstream.

            Turning on this flag could prevent the compiler from optimising away
            some "useless" checks for null pointers. Such bugs can sometimes become
            exploitable at compile time because of the -O2 optimisation.

            See http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Optimize-Options.html [gnu.org]

            An example that clearly shows this 'problem' is commit 6bf67672.

              static void __devexit agnx_pci_remove(struct pci_dev *pdev)
              {
                      struct ieee80211_hw *dev = pci_get_drvdata(pdev);
            - struct agnx_priv *priv = dev->priv;
            + struct agnx_priv *priv;
                      AGNX_TRACE;

                      if (!dev)
                              return;
            + priv = dev->priv;

            By reverting this patch, and compile it with and without
            -fno-delete-null-pointer-checks flag, we can see that the check for dev
            is compiled away.

                    call printk #
            - testq %r12, %r12 # dev
            - je .L94 #,
                    movq %r12, %rdi # dev,

            Clearly the 'fix' is to stop using dev before it is tested, but building
            with -fno-delete-null-pointer-checks flag at least makes it harder to
            abuse.

  • milw0rm (スコア:2, 参考になる)

    by a-yasui (30289) <a.yasui@gmail.com> on 2009年07月22日 12時57分 (#1609220) ホームページ 日記

    一応、milw0rmへのリンクを投下しておきますね。
    milwo0rm exploits [milw0rm.com]

    # cc のオプションの -fno-stack-protector ってのが今回のミソかしら。

    • Re:milw0rm (スコア:4, 参考になる)

      by deleted user (19654) on 2009年07月22日 13時08分 (#1609232) ホームページ 日記

      わかる範囲で日本語にしてみましたので、こちらもどうぞ:
      http://tamo.tdiary.net/20090719.html#p01 [tdiary.net]

      mmap することで NULL でもクラッシュしないようにしているらしいですが、
      mmap 下限を無視させる方法を、SELinux ありなし 2 種類用意してあるようですね。
      SELinux ありのほうが簡単、というかデフォルトで mmap 下限制限なしになってることが多いとか。

      また、exploit なしではすぐ単なる DoS として扱う開発陣の心理にも脆弱性がありそうです。

      親コメント
      • by Anonymous Coward
        そのtdiaryのリンクをたどると500エラーが出るよ。SecurityErrorとか言われた。
      • by Anonymous Coward
        500 Internal Server Errorで見れない
      • by Anonymous Coward
        > exploit なしではすぐ単なる DoS として扱う

        いつからクラッシュする欠陥まで DoS と呼ぶようになったのでしょうね.
        DoS という言葉が出来た当初は,データの損失を伴いうる欠陥は DoS に分類されていなかったと思うのですが.
  • たまたま会社で使ってたので見てみたらRedHat系はビンゴでした。

  • バグ?仕様? (スコア:1, 参考になる)

    by Anonymous Coward on 2009年07月22日 12時43分 (#1609209)
    少し詳しい解説 [blogspot.com]によると、GCCの最適化によりnullチェックのif文が外されてしまうそうで。面白い
    • これ、gccで-fno-delete-null-pointer-checksしてやらないと、ソースの書き方によっては同じようなexploitやDOSの可能性が出るということですよね?Linuxカーネルにやられるかかれ方のコードがあって、脆弱性が偶然見つかっただけで

      と言うことは、μITronやeCosやVxWorksのような比較的小規模な機械に良く使われているようなカーネルモードとかそういうのがない上にアプリ層をgccでコンパイルする事も多くなってる組み込み系のOS環境ではexploitなコードを突っ込むのが容易になるのでは(怖)

      未だ、ハードウェアのMMUにメモリアクセス例外があって、ここのトラップから(元凶のアプリを殺して)回復するような作りのカーネルになってれば救われるし(トラップしたら全リセットだったりしたら立派なDoS…)、カーネルからアプリまで一緒にメモリ上に展開されてそれ以上ネイティブバイナリのアプリが動かないような作りであれば外部からコード突っ込まれる心配ないでしょうけど、下手に補助記憶上のアプリをforkして実行して実行が終わったら解放するような真似をしていたりして主記憶を節約していたりすると…あぁ、想像したくない…

      親コメント
      • by Anonymous Coward

        Linuxガラケ群がハックされてGNUになって俺大歓喜…にならないかな(・∀・)

    • by Anonymous Coward on 2009年07月22日 13時16分 (#1609237)

      良く分からないなぁ。

      struct sock *sk = tun->sk;

      tun が NULL なら tun->sk を参照した時点で落ちるんじゃないの?
      その時点で後ろの if ブロックが削られようが削られまいが何も問題ないと思うんだけど。
      それとも sk のオフセットはメモリアクセスできちゃうエリアに到達するほど大きい値?

      struct sock *sk = &tun->sk;

      なら分からないでもないけど、それだとGCCの問題な気が・・・

      親コメント
      • Re:バグ?仕様? (スコア:3, 参考になる)

        by bero (5057) on 2009年07月22日 14時21分 (#1609294) 日記

        >tun が NULL なら tun->sk を参照した時点で落ちるんじゃないの?
        >その時点で後ろの if ブロックが削られようが削られまいが何も問題ないと思うんだけど。

        gccもそう思って最適化しちゃうんだけど、mmapでメモリを割り当てていた場合、落ちずに処理が進む。
        進んだときにおかしくなるデータをtun->sk(0x0+offsetof(sk))に仕込んどけはexploitになる。

        上記の解説はちょっと変
        >コンパイラは 'if' ブロックを外してしまい、カーネルは0x00000000にアクセスしようとし、

        アクセスした後で NULLチェックしても常に偽と判断され最適化で消えちゃう、というべきか

        親コメント
        • >上記の解説はちょっと変
          >>コンパイラは 'if' ブロックを外してしまい、カーネルは0x00000000にアクセスしようとし、
          >アクセスした後で NULLチェックしても常に偽と判断され最適化で消えちゃう、というべきか

          原文はまともです。翻訳するときに時間がなかったのでしょう。よくあることです

          親コメント
      • by Anonymous Coward

        すいません、自己解決。カーネルなら tun が NULL でも tun->sk を参照しても落ちるわけありませんね。
        NULL 参照が許されるような環境でそんな最適化を行ってしまう GCC にも問題がある気がします。

        • by Anonymous Coward on 2009年07月22日 14時23分 (#1609296)

          シロウトの印象だと、必要な処理をすっ飛ばしちゃうGCCの最適化手法が
          おかしいんだろうとは思うんですが、ソースコードベースで
          ソフトウェアを公開するとなるとけっこうめんどくさい問題ですね、これ。

          GCCの挙動がもし「仕様」(速いコードを吐く代わりに妙なところで命令を
          すっ飛ばすことがある)だとしたら、コンパイラやコンパイルオプションを選んだ人にも
          問題がないわけでもなく、でもそうすると「選んだ人」って誰ということにもなり、
          あとはリリースエンジニアリング的なトコにもツッコミどころがあるのかなとか、
          いろいろ考えられますよね。

          でも少なくとも心情的には「コードが間違ってる」とは言いがたいなあ。

          親コメント
          • 通常のユーザープロセスで動かす分には、最近の環境ならNULLアクセスしたら大抵トラップ食らってプログラム終了ですから、そういう前提 (NULLアクセスしたらカーネルが止めてくれる) で最適化している可能性はあるかも。

            カーネルコードとか組込み機器とかでは、そもそもNULLアクセスで止まる保証がないわけで、そんなところでGCCの最適化を盲目的に適用するのは危険という教訓になるんですかね。

            親コメント
            • by Anonymous Coward
              > カーネルコードとか組込み機器とかでは、そもそもNULLアクセスで止まる保証がないわけで、そんなところでGCCの最適化を盲目的に適用するのは危険という教訓になるんですかね。

              ヌル参照はANSI Cでは未定義になっているわけです。今回の話も仕様に従った正しい動作です。
              gccの最適化により潜在的なバグが顕在化したということですから、gccを責めるのはお門違いです。
        • by rti (659) on 2009年07月22日 18時07分 (#1609499) ホームページ

          NULLでもカーネルなら落ちないから大丈夫です(キリッ
          って感じのコードを書くのそもそもどうかと思うなー。
          gccも悪いかもしれないけど、カーネルハカーももう少し注意してコードを書いてほしいと思う。

          よくわからんから勘違いしているかもしれんけど、、、
          なんかエラーでたけど @つけたら大丈夫でしたっていうphpプログラマや、
          try{}catch(...){} で余裕でしたとかいう C++ プログラマーの香りがする。
          #間違っていたら突っ込みください。あやまります。ごめんご。

          --
          by rti.
          親コメント
        • by Anonymous Coward
          > NULL 参照が許されるような環境でそんな最適化を行ってしまう GCC にも問題がある気がします。

          ANSI CではNULL参照の動作は未定義だから(たぶん)、脆弱性を引き起こすのも仕様に合致している。
          gccは悪くない、悪くないよ。
  • by Anonymous Coward on 2009年07月22日 14時24分 (#1609299)

    皆さんWindowsやLinuxといった糞OSを捨ててMacを使って幸せになろう。

    • by Anonymous Coward on 2009年07月22日 20時20分 (#1609565)

      マジレスしたくなるが、さすがにこれはネタだろう。
      #放置プレイ [google.co.jp]

      親コメント
      • by Anonymous Coward

        WindowsやLinuxの脆弱性関連のストーリーではお約束のネタなのです。

    • by Anonymous Coward on 2009年07月23日 22時58分 (#1610286)
      マックというのは SELinux や AppArmor のような強制アクセス制御( Mandatory Access Control )を指す言葉であって、
      今回は「マックを使っても幸せになれない」というお話かと思います。
      親コメント
    • by Anonymous Coward
      gccのバグなら、macも無縁とは言えないよ。
      むしろ、vc使ってビルドされているwindowsが安全という結論に。
      • by Anonymous Coward

        Windows はやっぱり VC でコンパイルされてるの?
        Microsoft って頻繁に紺屋の白袴やってるけど

        • by Anonymous Coward
          インテルコンパイラーだったりしてな。
        • by Anonymous Coward
          そうだよ だからVCはWindowsを出荷できる程度の完成度は持ってる msvcrt.dllにリンクできるlibもDDK/WDKといった形で公開されてる
    • by Anonymous Coward

      Macユーザの大半が同じように思っているからMacを使う奴らをまともだと思えないんだ。

      Macを所有したときに大変な目に逢ったのでAC

  • by Anonymous Coward on 2009年07月22日 16時02分 (#1609395)
    Julia Lawall が [n/10] Move a dereference below a NULL test
    というタイトルでlkmlに一連のパッチを投げてるが、
    これすべてexploitの餌食だぜ。
typodupeerror

目玉の数さえ十分あれば、どんなバグも深刻ではない -- Eric Raymond

読み込み中...