OpenBSD、予測不可能なrand関数を実装(ただしPOSIX違反) 54
ストーリー by hylom
知らないで困る人も出てきそう 部門より
知らないで困る人も出てきそう 部門より
あるAnonymous Coward 曰く、
乱数が欲しいとき、言語の標準関数にrandやrandomという名前の関数があればそれを使うのは自然であろう。しかし、Cのrandはランダムではない。むしろ規定されているのはランダムネスではなく、その逆、srandによる予測可能性である。それにも関わらず余りにも多くのコードが定数やpidや現在時刻をシードにして安心しきっている。OpenBSDはPOSIXを破って、そのそうなアホなコードでもランダムになるよう変更を行った。
今後しばらくOpenBSDでsrandによる再現可能性を必要とする場合にはsrand_deterministicを呼ぶ必要がある (srandのユースケースをすべて調査したあとで元に戻す可能性はあるが)。このような乱暴な手法でセキュリティを実現しようとする独善的態度には批判もありそうだ。
そのそうなアホなコードでも (スコア:2)
そのような が正解なのか?
Re: (スコア:0)
人をバカにするときにトチる人って、見てて恥ずかしいですね。
こりは困った (スコア:2)
randはseedを同じにすることによって同じ系列が出ること、前提になる事を書いたプログラムはある。再現テスト用だったはず。てか、そのためのseed。
まあ、遠い昔に書いたんで今使ってないけど。
今度そんなのが必要になるとしたら、MTでも拾ってきて使うかな。
Re:こりは困った (スコア:1)
Re: (スコア:0)
C++11ならrandomが用意されたんで拾ってこなくてもソレでできます。
Cは知りません。
POSIX互換 (スコア:0)
POSIX互換でないとアメリカの官庁の仕事が受けられない
(からWindowsも2000までPOSIX互換だった)
みたいなのって、今でも残ってるところには残ってるんです?
Re: (スコア:0)
Windows Server 系は今でもPOSIXサブシステム標準で乗ってるんじゃなかったかな。
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互換だった [slashdot.jp]」が正しく、
それに続く「Windows Server 系は今でもPOSIXサブシステム標準で乗ってる [slashdot.jp]」というコメントは誤り。
Re:POSIX互換 (スコア:2)
載ってはいますが、さすがにWindows Server 2012では非推奨になりました。なんとCygwinやMinGWが紹介されています。
Windows Server 2012 で削除された機能または推奨されなくなった機能 [microsoft.com]
知らない自慢されても困るが (スコア: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)
それはFATの仕様。
Re: (スコア:0)
そもそもfork自体がシングルスレッドを前提とした仕組みで、当初からマルチスレッドOSとして設計されたWindowsにforkがないのは当然。
自慢だと思っている奴が馬鹿をさらしてるだけ。
Re: (スコア:0)
Re: (スコア:0)
最新のWindowsではなくなりましたけどね
http://technet.microsoft.com/ja-jp/library/dn303411.aspx [microsoft.com]
Re:POSIX互換 (スコア:2, おもしろおかしい)
Re:POSIX互換 (スコア:1)
つ[Microsoft Windows Services for UNIX]
http://ja.wikipedia.org/wiki/Microsoft_Windows_Services_for_UNIX [wikipedia.org]
Re: (スコア:0)
Typoも含め、たった2行でツッコミどころ満載。ある意味すげぇな。
「dosにグラフィック」やfork()の件は詳しいコメントがついてるので割愛。
・"WindOS"という名称のLinuxディストリが存在するぞ(更新止まってるけど)。
・一般的なLinuxシステムは実はPOSIX準拠じゃないぞ。
# つか、わざわざ正規のPOSIX認証とってるディストリがほぼ皆無なので
# POSIX準拠を名乗れない、というべきか。
# ここで最初の1行を見直すと一周回って別の意味になるなw。
意味あるかな? (スコア: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, おもしろおかしい)
pidや現在時刻の方を乱数にすればいいのに。
Re: (スコア:0)
OpenBSDはpidの出現順序がランダムだよね。バージョン幾つかからは忘れたが、2001年くらいには既にそうなってたはず。
まあたかだか2^16の空間でしかなかったけど。(今はもっと広がっているのかな)
卒論は機械学習だったんだが… (スコア:0)
再現性がないと困ることもあるんだよね。
卒論に添付したコードの結果が合わなくなるとか勘弁。
Re:卒論は機械学習だったんだが… (スコア:1)
> 再現性がないと困ることもあるんだよね。
> 卒論に添付したコードの結果が合わなくなるとか勘弁。
機械学習の研究で
標準関数のrandやrandomを使っている方が問題だと思います
randやrandomの値は乱数の質が悪いことで有名です.たとえば,2次元以上のランダムなベクトルをrand関数で作成すると,ベクトルの分布が偏り,格子状のパターンが出現します.
機械学習の各種定番アルゴリズムでこのような偏った乱数を用いると,正常な動作はまず期待できません.また評価実験データで偏った乱数を用いても,網羅的に事象が列挙できないので,正しい評価実験になりません
機械学習ではrand()は使うべきではなく,もう少しまともな乱数生成器,たとえばメルセンヌ・ツイスタ等を利用したほうが良いと思います
Re: (スコア:0)
安心しろ。
乱数の違いで結果が大きく変わるような論文に大きな価値はない。
Re: (スコア:0)
線形合同法でもMTでもLDSでも変わらない論文って限られそう。
セキュリティ? (スコア:0)
いやすまんちょっと意味わからないんだが
Re: (スコア:0)
そうかぁ。多分、他の皆は分かってるよ。
Re: (スコア:0)
暗号に使う鍵は乱数を使って生成する。
でだ、疑似乱数≒周期的な数列なわけで、要するに次の数が予想できるわけだね。
それってつまり、SSLとかだと接続毎にセッション鍵を生成するけど、
次の接続で使われるセッション鍵が予想できるってことだね。
あとはわかるね?
Re: (スコア:0)
そんな人がなんで無理に割り込んできたがるのか…
うーん (スコア:0)
すべてのサーバーで同じアルゴリズムで乱数を発生させたとき同じ数が出てほしいんだけどなぁ。
Re: (スコア:0)
そんなときにはsrand_deterministic使えって書いてあるじゃない
Re: (スコア:0)
なんで正しいプログラムを変えなきゃいけないの?
OpenBSDのBugfixを待てと言うべきだな。
自分は使い方が分からなかったので仕様は無視して適当に作りなおしましたってことじゃん。無茶苦茶だよ。
規格を無視して独自仕様をやりまくったかつてのMSの様。
Re: (スコア:0)
それを言ったらすべてのrand()が同じアルゴリズムで乱数を発生させる保証などPOSIXもC標準もしていないのだが。保証されているのはsrand()に同じ種を渡すと(同じ実装の上では)同じ乱数列が再現できることだけ。
> なんで正しいプログラムを変えなきゃいけないの?
したがってすべてのサーバーで同じ数が出ることを期待しているなら正しいプログラムではない。
> 自分は使い方が分からなかったので仕様は無視して適当に
ってのは#2726495のこと?
乱数と擬似乱数 (スコア:0)
乱数(というか真の乱数を目指した真の乱数もどき)と擬似乱数の区別がついていないんじゃないか?
真の乱数でも擬似乱数でも無いものを作り出してしまって良いのか?
どうも目先のアプリケーション開発しか能の無いアホなプログラマ的発想だと思うが
Re: (スコア:0)
> 乱数(というか真の乱数を目指した真の乱数もどき)と擬似乱数の区別がついていないんじゃないか?
そういうアホプログラマが多くてどうしようもないから rand() を暗号乱数にしちまおうっていう話だとは思います。
アホプログラマ発想に合わせているという意味では、「アホなプログラマ的発想」ですね。
とはいえ、私にもこれが思慮のある変更だとは思えませんけど。
Re: (スコア:0)
何のことを言ってるのかさっぱりわかりません。
この件との関連性も
Re: (スコア:0)
カーチャンに鬼畜王を買ってきてくれと頼んだら現地妻を持つ赤毛の戦士シリーズを買ってきてしまい
なら自作するかとがんばったけどまともなものができなかった少年
を想像することはできた
Re: (スコア:0)
カーチャンに鬼畜王を買ってきてくれと頼む少年が想像できない。
Re: (スコア:0)
擬似乱数ってのは要るんだよ。直近の例だと、ブルーレイの穴パターンで太陽電池効率化の記事があるけど、あれは、「穴の開きうる場所」自体は等間隔だから、すごく規則性がある。一方で、「候補地に穴が開いているかどうか」は動画のビットパターンの圧縮データに従うから、すごくランダム。つまり、穴が実数直線状に並べてあると考えればすごく規則的だけど、それを特定の単位で四捨五入したときだけ、すごくランダムになる。太陽電池の場合「特定の波長だけ吸収してあとは反射する」という効果が得られる。
だから、本物の乱数がいらなくて擬似乱数が欲しい場合、困る。
タレコミ氏は大丈夫か (スコア:0)
> このような乱暴な手法でセキュリティを実現しようとする独善的態度には批判もありそうだ
「このような乱暴な手法」「独善的態度」って既に立派な批判だって。
自分でそう書いておいて「批判もありそうだ」って、いったい何言ってるんだ?
# 「乱暴な手法でセキュリティを実現しようとする独善的態度だ、という批判もありそうだ」ならまだよかった
# どっちにしても三流マスコミが好きそうな、セコい文章だけど
なんで別の関数にしなかったんだろ? (スコア:0)
strlcpy, strlcatの前例があるというのに
Re: (スコア:0)
ports の rand() 系を全部見直して、必要に応じて書き換えるんか? やってられんわ
ということでは