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

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

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

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

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

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

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

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

関連リンク

  • 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

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

    • by Anonymous Coward

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

      • by Anonymous Coward

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

    • by Anonymous Coward

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

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

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

    ここに返信
    • by Anonymous Coward

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

    • by Anonymous Coward

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

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

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

      • by Anonymous Coward

        「死肉よ 喰ろう 何喰ろう」

        和ホラーの巻頭歌っぽいのでいずれにせよ気持ち悪い

    • by Anonymous Coward

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

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

    • by Anonymous Coward

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

typodupeerror

ハッカーとクラッカーの違い。大してないと思います -- あるアレゲ

読み込み中...