アカウント名:
パスワード:
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 に化けてしまいます
プログラムの素養があると、逆に4294967295という値に説明が要るという観点をスルーしちゃうかな。
カッコいい解説に野暮ですが、符号付き整数がオーバーフローしたら、未定義。
未定義だからこそ処理系依存で循環もするでしょ。
> カッコいい解説に野暮ですが、符号付き整数がオーバーフローしたら、未定義。
オーバーフローじゃないですよ
・ソースを読解・ひたすら逐次実験的に・特別そうな数字に当たりを付けて
デバッグの常識として、オーバーフロー前後の数字は要チェックですよ?だから、むしろ、今まで誰もチェックしてなかったってことが驚き。
普通の使い方してる限り、sudoしたらrootになれるのは当たり前だからな。
一般人「常識ですよ」逸般人「やってみないとわかんねーじゃん」
自作のUID検索(ランダムID生成、ユニークID生成等)関数の戻り値をエラー処理せずにsudoにぶち込んでたら、何故かroot権限で実行されるケースが起きて、原因調査してみたら、その自作関数がエラーで-1返していたのが発覚した。とか。
sudo開発陣がテストを充実させて境界値もチェックしたとか、ユーザが覚えやすいuidを考えてるうちに負数が使えることに気づくも-1の挙動が変だったとか、ファジング等のテストツールのテストがてらにsudoをテストしたとか、ソフトウェアテストの実習で仮のプロダクトとしてOSSを使った際にsudoで境界値チェックしたとか、発見に至るシナリオは沢山ありそう。
沢山あるにも関わらず今まで発覚しなかったのが怖いところだね。
エラーで-1か!権限のいる処理なのでrootの状態になってユーザーID変更するが、本来なら指定したIDにならなかった場合、処理されないはずが、指定したIDの-1とエラーの-1が一致するから成功と誤認してユーザーID変更失敗のrootのまま処理されるのか?
16bitの65535では不足することがあったから、32bitの4294967295が上限になった。わざわざ制限する理由も無いから、仕様上の上限まで利用できるというだけ。
uint(User IdeNTifier)が32bitかぁ~。
ちゃうちゃう、-1が0に化けるんや
化けねーよsudo公式サイトの原文読め
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲはアレゲを呼ぶ -- ある傍観者
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 に化けてしまいます
Re: (スコア:0)
プログラムの素養があると、逆に4294967295という値に説明が要るという観点をスルーしちゃうかな。
Re: (スコア:0)
カッコいい解説に野暮ですが、符号付き整数がオーバーフローしたら、未定義。
Re: (スコア:0)
未定義だからこそ処理系依存で循環もするでしょ。
Re: (スコア:0)
> カッコいい解説に野暮ですが、符号付き整数がオーバーフローしたら、未定義。
オーバーフローじゃないですよ
どうやって見つけたんだ (スコア:0)
・ソースを読解
・ひたすら逐次実験的に
・特別そうな数字に当たりを付けて
Re:どうやって見つけたんだ (スコア:1)
デバッグの常識として、オーバーフロー前後の数字は要チェックですよ?
だから、むしろ、今まで誰もチェックしてなかったってことが驚き。
Re:どうやって見つけたんだ (スコア:1)
普通の使い方してる限り、sudoしたらrootになれるのは当たり前だからな。
Re:どうやって見つけたんだ (スコア:1)
一般人「常識ですよ」
逸般人「やってみないとわかんねーじゃん」
Re: (スコア:0)
自作のUID検索(ランダムID生成、ユニークID生成等)関数の戻り値をエラー処理せずにsudoにぶち込んでたら、
何故かroot権限で実行されるケースが起きて、原因調査してみたら、その自作関数がエラーで-1返していたのが発覚した。とか。
Re: (スコア:0)
sudo開発陣がテストを充実させて境界値もチェックしたとか、
ユーザが覚えやすいuidを考えてるうちに負数が使えることに気づくも-1の挙動が変だったとか、
ファジング等のテストツールのテストがてらにsudoをテストしたとか、
ソフトウェアテストの実習で仮のプロダクトとしてOSSを使った際にsudoで境界値チェックしたとか、
発見に至るシナリオは沢山ありそう。
沢山あるにも関わらず今まで発覚しなかったのが怖いところだね。
Re: (スコア:0)
エラーで-1か!
権限のいる処理なのでrootの状態になってユーザーID変更するが、
本来なら指定したIDにならなかった場合、処理されないはずが、
指定したIDの-1とエラーの-1が一致するから成功と誤認して
ユーザーID変更失敗のrootのまま処理されるのか?
Re: (スコア:0)
16bitの65535では不足することがあったから、32bitの4294967295が上限になった。
わざわざ制限する理由も無いから、仕様上の上限まで利用できるというだけ。
Re: (スコア:0)
uint(User IdeNTifier)が32bitかぁ~。
Re: (スコア:0)
ちゃうちゃう、-1が0に化けるんや
Re: (スコア:0)
化けねーよsudo公式サイトの原文読め