パスワードを忘れた? アカウント作成
14024668 story
UNIX

sudoでUIDに4294967295を指定すると途中からuid = 0と解釈される特権昇格の脆弱性 42

ストーリー by hylom
チェックしてなかったのか 部門より

sudoコマンドで、任意のユーザー権限でのコマンド実行を許可されているユーザーに対し、ルート権限で指定したコマンドを実行できてしまう脆弱性が確認された(sudo公式サイトでの脆弱性報告サイオスセキュリティブログ)。

この脆弱性は、実行するユーザーを指定するsudoコマンドの「-u」オプションで「-1」もしくは「4294967295」を指定すると、そのユーザーIDではなくルート権限で指定したコマンドを実行できてしまうというもの。

任意のユーザーがルート権限を取得できるわけでは無く、sudoersなどの設定ファイルで「ALL」キーワードを使って任意のユーザー権限でのコマンド実行が許可されたユーザーのみがルート権限を奪取できる。実行できるコマンドが指定されていた場合はそのコマンドのみがルート権限で実行できる対象となる。

また、この際にログにはroot権限ではなく指定したユーザーID(-1もしくは4294967295)で実行されたものとして記録される。こうしたユーザーIDは存在しない為、PAMセッションモジュールも実行されない。

この問題を悪用することで、たとえば「<ユーザー名> = (ALL, !root) <コマンド名>」のようにroot以外のユーザーでsudoコマンドを利用できるように指定されていた場合に、本来は不可能なはずのroot権限でのコマンド実行が可能になってしまう。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • sudo 公式サイトの説明に、

    This can be used by a user with sufficient sudo privileges to run commands as root even if the Runas specification explicitly disallows root access as long as the ALL keyword is listed first in the Runas specification.

    と書いてあるのに、そこ抜かして説明するからわけわかんない。
    例にあるように、
    myhost bob = (ALL, !root) /usr/bin/vi
    としたら、先頭のキーワードにALLがあるため、除外したはずのrootで実行できてしまう、という問題です。
    (引用部中のboldは私が指定しました)

    • by Anonymous Coward

      タレコミ文の末尾よみました?

  • by Anonymous Coward on 2019年10月15日 17時12分 (#3701163)
    なんか不思議な数字だと思ったんだけど、1足した4294967296を1024で3回割ったら4になったので2の32乗であることが分かった。
    まあ、rootをID0として-1および設定最大値のIDに特殊な権限を与えるって発想は頷けるが、そんなに沢山のユーザがいることを想定しているのかな。不思議な数字だ。
    • by Anonymous Coward on 2019年10月15日 18時40分 (#3701213)

      4294967295 はプログラマには馴染みがある数字です.
      -1を2の補数で表現すると32bit環境では4294967295になるからです

      たとえばC言語で sizeof(int)が4bytesな環境だと

      int a = 4294967295;
      printf("%d\n", a);

      とか

      printf("%d\n", atoi("4294967295"));

      のようなコードは -1 を出力します.

      つまりメモリ上に 4bytesのデータ 0xffffffff をおいて
      それを符号なし32bit整数で読むと 4294967295 ですが
      型指定のミスなどで符号なし整数として読んでしまうと -1 に化けてしまいます

      親コメント
      • by Anonymous Coward

        プログラムの素養があると、逆に4294967295という値に説明が要るという観点をスルーしちゃうかな。

      • by Anonymous Coward

        カッコいい解説に野暮ですが、符号付き整数がオーバーフローしたら、未定義。

        • by Anonymous Coward

          未定義だからこそ処理系依存で循環もするでしょ。

        • by Anonymous Coward

          > カッコいい解説に野暮ですが、符号付き整数がオーバーフローしたら、未定義。

          オーバーフローじゃないですよ

    • ・ソースを読解
      ・ひたすら逐次実験的に
      ・特別そうな数字に当たりを付けて

      • デバッグの常識として、オーバーフロー前後の数字は要チェックですよ?
        だから、むしろ、今まで誰もチェックしてなかったってことが驚き。

        親コメント
      • by Anonymous Coward on 2019年10月15日 22時33分 (#3701339)

        一般人「常識ですよ」
        逸般人「やってみないとわかんねーじゃん」

        親コメント
      • by Anonymous Coward

        自作のUID検索(ランダムID生成、ユニークID生成等)関数の戻り値をエラー処理せずにsudoにぶち込んでたら、
        何故かroot権限で実行されるケースが起きて、原因調査してみたら、その自作関数がエラーで-1返していたのが発覚した。とか。

        • by Anonymous Coward

          sudo開発陣がテストを充実させて境界値もチェックしたとか、
          ユーザが覚えやすいuidを考えてるうちに負数が使えることに気づくも-1の挙動が変だったとか、
          ファジング等のテストツールのテストがてらにsudoをテストしたとか、
          ソフトウェアテストの実習で仮のプロダクトとしてOSSを使った際にsudoで境界値チェックしたとか、
          発見に至るシナリオは沢山ありそう。

          沢山あるにも関わらず今まで発覚しなかったのが怖いところだね。

        • by Anonymous Coward

          エラーで-1か!
          権限のいる処理なのでrootの状態になってユーザーID変更するが、
          本来なら指定したIDにならなかった場合、処理されないはずが、
          指定したIDの-1とエラーの-1が一致するから成功と誤認して
          ユーザーID変更失敗のrootのまま処理されるのか?

    • by Anonymous Coward

      16bitの65535では不足することがあったから、32bitの4294967295が上限になった。
      わざわざ制限する理由も無いから、仕様上の上限まで利用できるというだけ。

      • by Anonymous Coward

        uint(User IdeNTifier)が32bitかぁ~。

    • by Anonymous Coward

      ちゃうちゃう、-1が0に化けるんや

      • by Anonymous Coward

        化けねーよsudo公式サイトの原文読め

  • by Anonymous Coward on 2019年10月15日 17時24分 (#3701173)

    2147483647と4294967295は覚えてない。なんか語呂合わせとかあるなら教えて下さい。

    • by Anonymous Coward on 2019年10月15日 17時40分 (#3701187)

      2147483647=「追試なしは皆無視な」説。テストしないで本番に投入すると、ありがちですね。

      https://it.srad.jp/comment/3361638 [it.srad.jp]

      4294967295は、ううむ、歯肉よく胸肉…?なんか気持ち悪いですね。いいのないのかな。

      親コメント
    • by Anonymous Coward

      大体21.4億と大体42.9億で覚えてるから下から3桁目辺りが違う数字になってても気付ける自信がないぜ

      • by Anonymous Coward

        まあ普段はそんなモンで問題ないでしょう。
        さすがにINT32_MAXは頻繁に見てるので丸暗記しちまったけど。

        ていうかこのあたりの数だと2^n乗として対数で話をしたほうが楽。

    • by Anonymous Coward

      $FFFFFFFFと$7FFFFFFFで覚えると簡単だ(簡単じゃない)

      #49.7日問題とか24.8日問題で見かけた数値なので全部覚えてはいないけどピンときた。

      • by Anonymous Coward

        十六進数リテラルを $ で表記するのって、最近あんまり見ない。昔、Motorola 系 CPU のアセンブリでは見たが。
        調べたら、Delphi や Forth が $ なのかな?

    • by Anonymous Coward

      それくらい丸覚えできるだろ

      • 人間は一度に覚えられる数字はだいたい4~7つと言われていて、それより大きい電話番号のようなものは区切り文字を入れるのが一般的です。
        16bitは覚えられても32bitが覚えられないのは個人差でしょう。
        固定長IDを設計する時の豆知識として聞きますよ。

        親コメント
  • やっぱUACじゃねえとな

    https://blogs.msdn.microsoft.com/aaron_margosis/2007/06/29/faq-why-can... [microsoft.com]

    The designers of Windows Vista's User Account Control expressly decided not to incorporate functionality like setuid/suid or sudo found in Unix and Unix-like OSes such as Mac OS X. I think they made the right decision.

    at least as important – how do you ensure that malware that has infected the user's session cannot drive a setuid application programmatically to take over the system? Ensuring strict behavioral boundaries for complex software running with elevated privileges is (at best) incredibly difficult. And ensuring that it is free of exploitable design and implementation bugs is far beyond the capabilities of software engineering today.

    Privilege escalation due to setuid and sudo has plagued Unix-like systems for many years, and continues to do so. In fact, several of the bugs in the recent Month of Apple Bugs fell into this category.

    • by Anonymous Coward

      サーバにGUIを使うバカ

      • by Anonymous Coward

        いつの時代のWindows Serverだよw

    • by Anonymous Coward

      何度言っても「UACはそもそもセキュリティ機能ではない」のほうは故意に無視する印象操作乙
      https://blogs.msdn.microsoft.com/e7/2009/02/05/update-on-uac/ [microsoft.com]

    • by Anonymous Coward

      過去に何度も問題を起こしている autoElevate が true のファイルを利用した UAC の回避って根本的に解決したんでしたっけ?

      • by Anonymous Coward

        バグではなく仕様です
        気になる人は自動昇格を無効化してください

        There are really only two effectively distinct settings for the UAC slider [microsoft.com]

      • by Anonymous Coward

        UACが有効でも管理者ユーザーを使うな
        一般ユーザーを常用して昇格プロンプトに毎回パスワードを入れろ

        • by Anonymous Coward

          自動昇格の無効化は効果あるでしょうけど、
          普段使ってるユーザが管理者ユーザかどうかは関係ないんじゃなかったでしたっけ?

          例えば下記のブログのような攻撃については、一般ユーザでログインしていた場合も
          感染する可能性があるって話じゃなかったですかね?
          https://www.mbsd.jp/blog/20171012.html [www.mbsd.jp]

  • by Anonymous Coward on 2019年10月15日 21時32分 (#3701308)

    糞だな

  • by Anonymous Coward on 2019年10月16日 8時06分 (#3701461)

    私は早々にdoasに乗り換えた口なんですが、世間一般的にはどうなんですかね?

    以下DistroWatchのOpinion Poll archive [distrowatch.com]より引用

    Poll results for: sudo versus su

    I use sudo to run admin commands: 1433 (67%)
    I use su to become a privileged user: 581 (27%)
    I use another tool such as doas: 16 (1%)
    I logout and start a new session as root: 34 (2%)
    Other: 81 (4%)
    I do not have admin access: 5 (0%)

    • by Anonymous Coward

      sudo 使わねぇなぁ。たまにイジる ubuntu 系で使うぐらいだな。
      普段は、Linux なら 'su -c "admin commands"', FreeBSD, Solaris なら 'su root -c "admin commands"' を使ってる。

    • by Anonymous Coward

      macで使うことがありますね。
      sudo nvram なんちゃら…等。

      起動時にわらわらとログを出すのが好き(でもRetinaだと細かくて読めませんが)

typodupeerror

吾輩はリファレンスである。名前はまだ無い -- perlの中の人

読み込み中...