OpenBSD、予測不可能なrand関数を実装(ただしPOSIX違反) 69
ストーリー by hylom
知らないで困る人も出てきそう 部門より
知らないで困る人も出てきそう 部門より
あるAnonymous Coward 曰く、
乱数が欲しいとき、言語の標準関数にrandやrandomという名前の関数があればそれを使うのは自然であろう。しかし、Cのrandはランダムではない。むしろ規定されているのはランダムネスではなく、その逆、srandによる予測可能性である。それにも関わらず余りにも多くのコードが定数やpidや現在時刻をシードにして安心しきっている。OpenBSDはPOSIXを破って、そのそうなアホなコードでもランダムになるよう変更を行った。
今後しばらくOpenBSDでsrandによる再現可能性を必要とする場合にはsrand_deterministicを呼ぶ必要がある (srandのユースケースをすべて調査したあとで元に戻す可能性はあるが)。このような乱暴な手法でセキュリティを実現しようとする独善的態度には批判もありそうだ。
ばかだなあ (スコア:4, おもしろおかしい)
pidや現在時刻の方を乱数にすればいいのに。
Re: (スコア:0)
OpenBSDはpidの出現順序がランダムだよね。バージョン幾つかからは忘れたが、2001年くらいには既にそうなってたはず。
まあたかだか2^16の空間でしかなかったけど。(今はもっと広がっているのかな)
こりは困った (スコア:3)
randはseedを同じにすることによって同じ系列が出ること、前提になる事を書いたプログラムはある。再現テスト用だったはず。てか、そのためのseed。
まあ、遠い昔に書いたんで今使ってないけど。
今度そんなのが必要になるとしたら、MTでも拾ってきて使うかな。
Re:こりは困った (スコア:1)
Re:こりは困った (スコア:1)
詰めファイアーエムブレムが出来なくなるじゃないですか。
Re: (スコア:0)
C++11ならrandomが用意されたんで拾ってこなくてもソレでできます。
Cは知りません。
そのそうなアホなコードでも (スコア:2)
そのような が正解なのか?
Re:そのそうなアホなコードでも (スコア:3, おもしろおかしい)
タレコミ [srad.jp]を見てみると
そのアホなコードでも
となっているので、わざわざ校正と称して誤字を追加していますね。
毎度の事ながら言われていますが、彼は編集者としての尊厳を捨てたのでしょうか?
# 来いよマイナスモデ
Re:そのそうなアホなコードでも (スコア:1)
なるほど、そういう見方というか説があるのですか。
失礼いたしました。
今後そういう視点で見れば誤字を見かけるたびに頑張れスラド、負けるな編集者と微笑ましく見られますねw
POSIX互換 (スコア:1)
POSIX互換でないとアメリカの官庁の仕事が受けられない
(からWindowsも2000までPOSIX互換だった)
みたいなのって、今でも残ってるところには残ってるんです?
Re: (スコア:0)
Windows Server 系は今でもPOSIXサブシステム標準で乗ってるんじゃなかったかな。
Re:POSIX互換 (スコア:4, 参考になる)
載ってはいますが、さすがにWindows Server 2012では非推奨になりました。なんとCygwinやMinGWが紹介されています。
Windows Server 2012 で削除された機能または推奨されなくなった機能 [microsoft.com]
Re:POSIX互換 (スコア:2)
SUAとかSFUとかいうCygwinみたいな追加のパッケージ群があって、選べる、というだけなので、互換性があるっていう表現には違和感が。
Re:POSIX互換 (スコア:1)
2000までは「POSIXサブシステム」自体は標準で付いていました。初期のSFUは、そのPOSIXサブシステムに対してUNIX互換として足りない機能を追加するもの。
XPとServer 2003からはPOSIXサブシステムは標準で付かなくなり、SFU3.0以降には別のUNIX互換サブシステム(Interix)が付くようになってます。
というわけで、大元の「Windowsも2000までPOSIX互換だった [srad.jp]」が正しく、
それに続く「Windows Server 系は今でもPOSIXサブシステム標準で乗ってる [srad.jp]」というコメントは誤り。
知らない自慢されても困るが (スコア:3)
DOS にグラフィック付けたってのは 95 系の話であって NT は全くの別物。
確かに win32 サブシステムには fork はないけど NT は別枠で POSIX サブシステム持ってて、そっちにはちゃんと fork が入ってる。
(年がばれるが) NT 出て来た時に NT は POSIX 対応だって散々話題にされてたので、その頃から NT に注目してる人には常識だし Porting from UNIX to Win32 [microsoft.com]辺りを見ても POSIX 1003.1 をサポートしていると明記してあるよ。
実際 Utilities and SDK for Subsystem for UNIX-based Applications in Microsoft Windows 7 and Windows Server 2008 R2 [microsoft.com]拾ってくれば unistd.h も入ってるので CL.EXE でコンパイル出来るし LINK.EXE にも POSIX サブシステム用のバイナリ吐くためのオプション /SUBSYSTEM:POSIX [microsoft.com] が存在する。
ただしあくまでも win32 とは別のサブシステムとして POSIX 載せてるだけなので同一プロセスで両方のサブシステムにまたがって API を混ぜて使うことは出来ない。
あと、最近の Windows の場合 SUA(Subsystem for UNIX) は、基本的に Enterprise 以上と Server じゃないと入ってないので、無印はもちろん Professional でも動きません。
uxi
Re:知らない自慢されても困るが (スコア:1)
Re:知らない自慢されても困るが (スコア:1)
> DOS にグラフィック付けたってのは 95 系の話であって NT は全くの別物。
細かいツッコミを入れておくと、「DOSにグラフィックを付けた」ような構造になっているのはWindows 3.1 まで。
95/98/MeはDOSとは別物。起動の初期段階にDOSを利用していますが、立ち上がってしまえば完全に独自のwin9xカーネルが動いてます。
Re:知らない自慢されても困るが (スコア:1)
さらに細かいツッコミを入れると「DOSにグラフィックを付けた」ような構造になっているのは
Windows 3.1のリアルモードまでだね。
スタンダード(286)モードはDOSエクステンダー的なものの上で動いてるし
エンハンスト(386)モードに至ってはwin9xカーネルの原型みたいなシステムだし。
(ファイルシステムがなくてDOSに降りるというマヌケな仕様だったけど)
しかしいまだにWindowsを「DOSにグラフィックを付けた」みたいな寝言を言うバカがいることに驚きだけど。
Re: (スコア:0)
Win9xでも時刻の読み書きはまだDOSに降りてたよ
Re:知らない自慢されても困るが (スコア:1)
タイムスタンプは2秒刻みということでしたっけ?
Re: (スコア:0)
そもそもfork自体がシングルスレッドを前提とした仕組みで、当初からマルチスレッドOSとして設計されたWindowsにforkがないのは当然。
自慢だと思っている奴が馬鹿をさらしてるだけ。
Re: (スコア:0)
最新のWindowsではなくなりましたけどね
http://technet.microsoft.com/ja-jp/library/dn303411.aspx [microsoft.com]
Re:知らない自慢されても困るが (スコア:2)
うわ、これはちょっと驚いた。
しかも、
> このリリースと共に SUA POSIX サブシステムを使用する場合は、Hyper-V を使用してサーバーを仮想化してください。SUA によって提供されるツールを使用する場合は、Cygwin の POSIX エミュレーションに切り替えるか、mingw-w64 (Sourceforge.net から入手可能) または MinGW (MinGW.org から入手可能) を使ってネイティブ ポートを実行します。
って説明で2度驚いた。
確かに、サブシステムとして分離してたので Hyper-V の乗っけてもたいして困らんのは分かるけど、まさか MS の公式資料で Cygwin が代替手段として挙げられるとは。Cygwin も出世したものだ。
uxi
Re:知らない自慢されても困るが (スコア:1)
むしろMicrosoftがInterixに対して容赦なくこれほどまで評価を下げたリアルな経営視点にびっくりしたものだった。
2009年6月30日をもってMicrosoftのサポートが打ち切られてしまう [srad.jp](過去の拙タレコミ没ネタ)、その帰結は買収吸収したInterixを切り捨てたわけでして。
Re:POSIX互換 (スコア:2, おもしろおかしい)
Re:POSIX互換 (スコア:1)
つ[Microsoft Windows Services for UNIX]
http://ja.wikipedia.org/wiki/Microsoft_Windows_Services_for_UNIX [wikipedia.org]
セキュリティ? (スコア:1)
いやすまんちょっと意味わからないんだが
Re:セキュリティ? (スコア:1)
暗号に使う鍵は乱数を使って生成する。
でだ、疑似乱数≒周期的な数列なわけで、要するに次の数が予想できるわけだね。
それってつまり、SSLとかだと接続毎にセッション鍵を生成するけど、
次の接続で使われるセッション鍵が予想できるってことだね。
あとはわかるね?
Re: (スコア:0)
そうかぁ。多分、他の皆は分かってるよ。
これってつまり! (スコア:1)
フリーセルのゲーム番号#11982がクリアできるってことですね。
諦めずに頑張っててよかった。
-- 風は東京に吹いているか
意味あるかな? (スコア:0)
質のよい乱数関数にするのはいいことだけど、シード設定を無視するのは意味があるのかな?
どうせ暗号学的な乱数関数じゃないんだから、セキュリティ目的では使えない。
ゲームやシミュレーションの目的なんだから、現在時刻だって、シードとしては十分だと思うけど。
「rand()を使うのが正しいケースで、現在時刻をシードとして使うと、一見問題はない(開発時点では発覚しない)が、実は不具合になる」という場合ってどれだけあるかな。
Re:意味あるかな? (スコア:2, 参考になる)
変更のログを読むとrandは内部的にはarc4randomを呼ぶと書いてあります。つまり暗号学的に安全な乱数を返そうとしているのですね。
おいおいRC4はもはや危殆化してるだろうとお考えになると思うのですが,ところがどっこいarc4randomという名前の割に既に中身の関数が差し替えられていまして
http://www.openbsd.org/cgi-bin/man.cgi?query=arc4random&apropos=0&... [openbsd.org]
> In OpenBSD 5.5 it was replaced with the ChaCha20 cipher, and it may be replaced again in the future as cryptographic techniques advance.
暗号学的に安全と思って良いと思います。
Re: (スコア:0)
なるほど。そもそもrand()を使ってはいけないケースでrand()を使うようなプログラムが対象ということですか。
しかし、そんなプログラム相手に、乱数だけ暗号学的にしてどれほど意味があるのやら…。
Re:意味あるかな? (スコア:1)
どれほど? ゼロじゃない、それで十分だろ。
って言うんじゃない? 彼らは。そのためのOpenBSD。
卒論は機械学習だったんだが… (スコア:0)
再現性がないと困ることもあるんだよね。
卒論に添付したコードの結果が合わなくなるとか勘弁。
Re:卒論は機械学習だったんだが… (スコア:2)
> 再現性がないと困ることもあるんだよね。
> 卒論に添付したコードの結果が合わなくなるとか勘弁。
機械学習の研究で
標準関数のrandやrandomを使っている方が問題だと思います
randやrandomの値は乱数の質が悪いことで有名です.たとえば,2次元以上のランダムなベクトルをrand関数で作成すると,ベクトルの分布が偏り,格子状のパターンが出現します.
機械学習の各種定番アルゴリズムでこのような偏った乱数を用いると,正常な動作はまず期待できません.また評価実験データで偏った乱数を用いても,網羅的に事象が列挙できないので,正しい評価実験になりません
機械学習ではrand()は使うべきではなく,もう少しまともな乱数生成器,たとえばメルセンヌ・ツイスタ等を利用したほうが良いと思います
Re: (スコア:0)
安心しろ。
乱数の違いで結果が大きく変わるような論文に大きな価値はない。
うーん (スコア:0)
すべてのサーバーで同じアルゴリズムで乱数を発生させたとき同じ数が出てほしいんだけどなぁ。
Re: (スコア:0)
そんなときにはsrand_deterministic使えって書いてあるじゃない
Re: (スコア:0)
それを言ったらすべてのrand()が同じアルゴリズムで乱数を発生させる保証などPOSIXもC標準もしていないのだが。保証されているのはsrand()に同じ種を渡すと(同じ実装の上では)同じ乱数列が再現できることだけ。
> なんで正しいプログラムを変えなきゃいけないの?
したがってすべてのサーバーで同じ数が出ることを期待しているなら正しいプログラムではない。
> 自分は使い方が分からなかったので仕様は無視して適当に
ってのは#2726495のこと?
Re:うーん (スコア:2)
むしろ再現性だけのために
POSIX 1003.1-2003 で挙げられてる rand() と srand() の実装例 [osdn.jp]
をソースに突っ込んでる俺は、
Theo 様にぶっ殺されそうだな
uxi
乱数と擬似乱数 (スコア:0)
乱数(というか真の乱数を目指した真の乱数もどき)と擬似乱数の区別がついていないんじゃないか?
真の乱数でも擬似乱数でも無いものを作り出してしまって良いのか?
どうも目先のアプリケーション開発しか能の無いアホなプログラマ的発想だと思うが
Re: (スコア:0)
> 乱数(というか真の乱数を目指した真の乱数もどき)と擬似乱数の区別がついていないんじゃないか?
そういうアホプログラマが多くてどうしようもないから rand() を暗号乱数にしちまおうっていう話だとは思います。
アホプログラマ発想に合わせているという意味では、「アホなプログラマ的発想」ですね。
とはいえ、私にもこれが思慮のある変更だとは思えませんけど。
Re: (スコア:0)
何のことを言ってるのかさっぱりわかりません。
この件との関連性も
Re: (スコア:0)
カーチャンに鬼畜王を買ってきてくれと頼んだら現地妻を持つ赤毛の戦士シリーズを買ってきてしまい
なら自作するかとがんばったけどまともなものができなかった少年
を想像することはできた
Re: (スコア:0)
カーチャンに鬼畜王を買ってきてくれと頼む少年が想像できない。
Re: (スコア:0)
擬似乱数ってのは要るんだよ。直近の例だと、ブルーレイの穴パターンで太陽電池効率化の記事があるけど、あれは、「穴の開きうる場所」自体は等間隔だから、すごく規則性がある。一方で、「候補地に穴が開いているかどうか」は動画のビットパターンの圧縮データに従うから、すごくランダム。つまり、穴が実数直線状に並べてあると考えればすごく規則的だけど、それを特定の単位で四捨五入したときだけ、すごくランダムになる。太陽電池の場合「特定の波長だけ吸収してあとは反射する」という効果が得られる。
だから、本物の乱数がいらなくて擬似乱数が欲しい場合、困る。
Re:乱数と擬似乱数 (スコア:1)
暗号的に安全な乱数だと、ある程度のエントロピーの収集も必要になってくるしね。
あと、ゲームとかでseed値によってゲーム内容を固定したい場合もあるし。
まあ、擬似乱数自体はいろいろと優秀なルーチンが公開されてるから、
本当に必要なら C の rand() じゃなくて、ソース内に自分で乱数ルーチン
入れてもいいね。そんなにサイズが必要でもないし。
[Q][W][E][R][T][Y]
タレコミ氏は大丈夫か (スコア:0)
> このような乱暴な手法でセキュリティを実現しようとする独善的態度には批判もありそうだ
「このような乱暴な手法」「独善的態度」って既に立派な批判だって。
自分でそう書いておいて「批判もありそうだ」って、いったい何言ってるんだ?
# 「乱暴な手法でセキュリティを実現しようとする独善的態度だ、という批判もありそうだ」ならまだよかった
# どっちにしても三流マスコミが好きそうな、セコい文章だけど
Re:乱暴? 独善? お前さん、 OpenBSD は初めてか? まあ肩の力抜けよ. (スコア:1)
「arc4random() がないのは Linux と Solaris だけ」とか言っちゃう [marc.info]人ですから。
「えーマジ rand() ? srand(time(NULL)) が許されるのは小学生までだよねー」みたいな気分だったのでしょう。