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権限でのコマンド実行が可能になってしまう。
4294967295 (スコア:0)
まあ、rootをID0として-1および設定最大値のIDに特殊な権限を与えるって発想は頷けるが、そんなに沢山のユーザがいることを想定しているのかな。不思議な数字だ。
Re:4294967295 (スコア:1)
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 に化けてしまいます
どうやって見つけたんだ (スコア:0)
・ソースを読解
・ひたすら逐次実験的に
・特別そうな数字に当たりを付けて
Re: (スコア:0)
自作のUID検索(ランダムID生成、ユニークID生成等)関数の戻り値をエラー処理せずにsudoにぶち込んでたら、
何故かroot権限で実行されるケースが起きて、原因調査してみたら、その自作関数がエラーで-1返していたのが発覚した。とか。
Re: (スコア:0)
16bitの65535では不足することがあったから、32bitの4294967295が上限になった。
わざわざ制限する理由も無いから、仕様上の上限まで利用できるというだけ。
Re: (スコア:0)
uint(User IdeNTifier)が32bitかぁ~。
Re: (スコア:0)
ちゃうちゃう、-1が0に化けるんや
32767とか65535とかは覚えてるけど (スコア:0)
2147483647と4294967295は覚えてない。なんか語呂合わせとかあるなら教えて下さい。
Re: (スコア:0)
大体21.4億と大体42.9億で覚えてるから下から3桁目辺りが違う数字になってても気付ける自信がないぜ
Re: (スコア:0)
2147483647=「追試なしは皆無視な」説。テストしないで本番に投入すると、ありがちですね。
https://it.srad.jp/comment/3361638 [it.srad.jp]
4294967295は、ううむ、歯肉よく胸肉…?なんか気持ち悪いですね。いいのないのかな。
Re: (スコア:0)
「死肉よ 喰ろう 何喰ろう」
和ホラーの巻頭歌っぽいのでいずれにせよ気持ち悪い
Re: (スコア:0)
$FFFFFFFFと$7FFFFFFFで覚えると簡単だ(簡単じゃない)
#49.7日問題とか24.8日問題で見かけた数値なので全部覚えてはいないけどピンときた。
Re: (スコア:0)
それくらい丸覚えできるだろ