パスワードを忘れた? アカウント作成
11815451 story
プログラミング

OpenBSD、予測不可能なrand関数を実装(ただしPOSIX違反) 69

ストーリー by hylom
知らないで困る人も出てきそう 部門より
あるAnonymous Coward 曰く、

乱数が欲しいとき、言語の標準関数にrandやrandomという名前の関数があればそれを使うのは自然であろう。しかし、Cのrandはランダムではない。むしろ規定されているのはランダムネスではなく、その逆、srandによる予測可能性である。それにも関わらず余りにも多くのコード定数やpidや現在時刻をシードにして安心しきっている。OpenBSDはPOSIXを破って、そのそうなアホなコードでもランダムになるよう変更を行った

今後しばらくOpenBSDでsrandによる再現可能性を必要とする場合にはsrand_deterministicを呼ぶ必要がある (srandのユースケースをすべて調査したあとで元に戻す可能性はあるが)。このような乱暴な手法でセキュリティを実現しようとする独善的態度には批判もありそうだ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • ばかだなあ (スコア:4, おもしろおかしい)

    by Anonymous Coward on 2014年12月11日 15時45分 (#2726461)

    pidや現在時刻の方を乱数にすればいいのに。

    • by Anonymous Coward

      OpenBSDはpidの出現順序がランダムだよね。バージョン幾つかからは忘れたが、2001年くらいには既にそうなってたはず。
      まあたかだか2^16の空間でしかなかったけど。(今はもっと広がっているのかな)

  • by manmos (29892) on 2014年12月11日 14時14分 (#2726382) 日記

    randはseedを同じにすることによって同じ系列が出ること、前提になる事を書いたプログラムはある。再現テスト用だったはず。てか、そのためのseed。
    まあ、遠い昔に書いたんで今使ってないけど。

    今度そんなのが必要になるとしたら、MTでも拾ってきて使うかな。

  • そのような が正解なのか?

  • by Anonymous Coward on 2014年12月11日 14時21分 (#2726395)

    POSIX互換でないとアメリカの官庁の仕事が受けられない
    (からWindowsも2000までPOSIX互換だった)
    みたいなのって、今でも残ってるところには残ってるんです?

  • by Anonymous Coward on 2014年12月11日 16時17分 (#2726472)

    いやすまんちょっと意味わからないんだが

    • by Anonymous Coward on 2014年12月11日 21時13分 (#2726682)

      暗号に使う鍵は乱数を使って生成する。
      でだ、疑似乱数≒周期的な数列なわけで、要するに次の数が予想できるわけだね。
      それってつまり、SSLとかだと接続毎にセッション鍵を生成するけど、
      次の接続で使われるセッション鍵が予想できるってことだね。
      あとはわかるね?

      親コメント
    • by Anonymous Coward

      そうかぁ。多分、他の皆は分かってるよ。

  • by kentok (41940) on 2014年12月13日 11時23分 (#2727549)

    フリーセルのゲーム番号#11982がクリアできるってことですね。
    諦めずに頑張っててよかった。

    --
    -- 風は東京に吹いているか
  • by Anonymous Coward on 2014年12月11日 15時02分 (#2726427)

    質のよい乱数関数にするのはいいことだけど、シード設定を無視するのは意味があるのかな?
    どうせ暗号学的な乱数関数じゃないんだから、セキュリティ目的では使えない。
    ゲームやシミュレーションの目的なんだから、現在時刻だって、シードとしては十分だと思うけど。

    「rand()を使うのが正しいケースで、現在時刻をシードとして使うと、一見問題はない(開発時点では発覚しない)が、実は不具合になる」という場合ってどれだけあるかな。

    • by Anonymous Coward on 2014年12月11日 15時21分 (#2726437)

      変更のログを読むと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.
      暗号学的に安全と思って良いと思います。

      親コメント
      • by Anonymous Coward

        なるほど。そもそもrand()を使ってはいけないケースでrand()を使うようなプログラムが対象ということですか。
        しかし、そんなプログラム相手に、乱数だけ暗号学的にしてどれほど意味があるのやら…。

  • by Anonymous Coward on 2014年12月11日 16時05分 (#2726467)

    再現性がないと困ることもあるんだよね。
    卒論に添付したコードの結果が合わなくなるとか勘弁。

    • > 再現性がないと困ることもあるんだよね。
      > 卒論に添付したコードの結果が合わなくなるとか勘弁。

      機械学習の研究で
      標準関数のrandやrandomを使っている方が問題だと思います

      randやrandomの値は乱数の質が悪いことで有名です.たとえば,2次元以上のランダムなベクトルをrand関数で作成すると,ベクトルの分布が偏り,格子状のパターンが出現します.

      機械学習の各種定番アルゴリズムでこのような偏った乱数を用いると,正常な動作はまず期待できません.また評価実験データで偏った乱数を用いても,網羅的に事象が列挙できないので,正しい評価実験になりません

      機械学習ではrand()は使うべきではなく,もう少しまともな乱数生成器,たとえばメルセンヌ・ツイスタ等を利用したほうが良いと思います

      親コメント
    • by Anonymous Coward

      安心しろ。
      乱数の違いで結果が大きく変わるような論文に大きな価値はない。

  • by Anonymous Coward on 2014年12月11日 16時56分 (#2726495)

    すべてのサーバーで同じアルゴリズムで乱数を発生させたとき同じ数が出てほしいんだけどなぁ。

    • by Anonymous Coward

      そんなときにはsrand_deterministic使えって書いてあるじゃない

  • by Anonymous Coward on 2014年12月11日 17時05分 (#2726502)

    乱数(というか真の乱数を目指した真の乱数もどき)と擬似乱数の区別がついていないんじゃないか?
    真の乱数でも擬似乱数でも無いものを作り出してしまって良いのか?
    どうも目先のアプリケーション開発しか能の無いアホなプログラマ的発想だと思うが

    • by Anonymous Coward

      > 乱数(というか真の乱数を目指した真の乱数もどき)と擬似乱数の区別がついていないんじゃないか?

      そういうアホプログラマが多くてどうしようもないから rand() を暗号乱数にしちまおうっていう話だとは思います。
      アホプログラマ発想に合わせているという意味では、「アホなプログラマ的発想」ですね。

      とはいえ、私にもこれが思慮のある変更だとは思えませんけど。

    • by Anonymous Coward

      何のことを言ってるのかさっぱりわかりません。
      この件との関連性も

      • by Anonymous Coward

        カーチャンに鬼畜王を買ってきてくれと頼んだら現地妻を持つ赤毛の戦士シリーズを買ってきてしまい
        なら自作するかとがんばったけどまともなものができなかった少年

        を想像することはできた

        • by Anonymous Coward

          カーチャンに鬼畜王を買ってきてくれと頼む少年が想像できない。

      • by Anonymous Coward

        擬似乱数ってのは要るんだよ。直近の例だと、ブルーレイの穴パターンで太陽電池効率化の記事があるけど、あれは、「穴の開きうる場所」自体は等間隔だから、すごく規則性がある。一方で、「候補地に穴が開いているかどうか」は動画のビットパターンの圧縮データに従うから、すごくランダム。つまり、穴が実数直線状に並べてあると考えればすごく規則的だけど、それを特定の単位で四捨五入したときだけ、すごくランダムになる。太陽電池の場合「特定の波長だけ吸収してあとは反射する」という効果が得られる。

        だから、本物の乱数がいらなくて擬似乱数が欲しい場合、困る。

        • by qwerty (20776) on 2014年12月12日 2時34分 (#2726808) 日記

          暗号的に安全な乱数だと、ある程度のエントロピーの収集も必要になってくるしね。
          あと、ゲームとかでseed値によってゲーム内容を固定したい場合もあるし。
          まあ、擬似乱数自体はいろいろと優秀なルーチンが公開されてるから、
          本当に必要なら C の rand() じゃなくて、ソース内に自分で乱数ルーチン
          入れてもいいね。そんなにサイズが必要でもないし。

          --
          [Q][W][E][R][T][Y]
          親コメント
  • by Anonymous Coward on 2014年12月11日 18時57分 (#2726601)

    > このような乱暴な手法でセキュリティを実現しようとする独善的態度には批判もありそうだ
    「このような乱暴な手法」「独善的態度」って既に立派な批判だって。
    自分でそう書いておいて「批判もありそうだ」って、いったい何言ってるんだ?

    # 「乱暴な手法でセキュリティを実現しようとする独善的態度だ、という批判もありそうだ」ならまだよかった
    # どっちにしても三流マスコミが好きそうな、セコい文章だけど

typodupeerror

日々是ハック也 -- あるハードコアバイナリアン

読み込み中...