エントロピー供給システムコールは、 Unix系オペレーティングシステムカーネルにおけるシステムコールであり、プロセスはこれを通じてエントロピーデータまたはランダムデータを取得できる。最初のものは であり、1997年以来使用されているsysctl(3) KERN_ARNDアプローチのリファクタリングとして、リリース5.6(2014年11月)でOpenBSDオペレーティングシステムに導入された。 [1] Linuxはをベースにした非常によく似たシステムコール を提供している。[2]これは、2014年10月にリリースされたLinux 3.17で初めて利用可能になった。[3] 2015年7月、Solarisはとのわずかに修正されたバージョンを導入した。[4] 2015年8月、FreeBSDはカーネルからランダムデータを取得するための システムコールを導入した。 [5]getentropygetrandomgetentropygetentropygetrandomread_random
これらのシステム コールを使用すると、プロセスは、ランダム性疑似デバイスを開いて読み取ることなく、高品質のランダム データにアクセスできます。
Microsoft WindowsとCryptGenRandomApple iOSのSecRandom API は非常に似ています。ただし、システム コールとして実装されていません。
モチベーション
伝統的に、Unix 系オペレーティング システムは、2 つの疑似デバイスと/dev/randomを通じてランダム データを提供します/dev/urandom。ただし、これらのデバイスからランダム データを安全かつ確実に読み取ることは、困難で複雑になる可能性があります。たとえば、攻撃者は、使用可能なすべてのファイル記述子を開くか、同様の形式のリソース枯渇攻撃によって、疑似デバイスへのプロセスのアクセスを妨害できます。これらのデバイスの使用は、特権の取り消しにも干渉します。権限のないプロセスは、ファイルやデバイスを開いて読み取る機能が拒否されることが多く、ランダム デバイスはchroot されたプロセスには表示されません。
乱数疑似デバイスの使用が難しいため、開発者は代わりに標準ライブラリ関数を使用することがよくあります。Cプログラミング言語のrand()、POSIXのrandom()、などの一部の関数は、暗号化や同様のアプリケーションに使用すると非常に危険です。これは、これらのアルゴリズムが実際には決定論的であり、インターフェイス、、およびdrand48()を通じてシード再利用の要件を満たすように意図的に制限されているためです。
srand()srandom()srand48()
これらの呼び出しには大きな違いがあります。getentropy()ブロックなしで乱数がすぐに返されることを保証します。できるだけ早くランダム データ ストリームの初期化を保証するオペレーティング サポートが必要です。他のオペレーティング システムにもこのモデルに従うように促すため、getentropy()アプリケーションにエラーを示すことはできません。ここで説明する他の呼び出しは、代わりにエラーを返すか、不確定にブロックする場合があります。このようなブロッキング セマンティクスは、重大な問題に関係しています。[6]
セキュリティがソフトウェア開発においてより広範な優先事項となるにつれて、品質のランダム性がより頻繁に、より多くの状況で使用されるようになりました。このため、品質のランダム性を提供することは、カーネルの中心的な責任であるとますます考えられています。システム コールは、プロセスがコアカーネル サービスを使用する従来のインターフェイスであり、カーネルはシステム コールを介したランダム性へのアクセスをサポートしています。
使用法
これはより高速であり、エントロピー混合の別のレイヤーを追加するため、プロセスは取得したデータを直接変数に割り当てるのではなく、ユーザー空間の暗号的に安全な疑似乱数ジェネレータ(CSPRNG) を介してこれらのシステムコールのデータを使用することが通常推奨されます。この目的のために、OpenBSD の C 標準ライブラリには関数 が含まれておりarc4random、プログラムはランダムデータが必要なときにこれを呼び出すことが期待されています。[1]と同様にgetentropy、arc4randomもブロックしたりエラーを返したりすることはできません。
このアプローチにより、プログラムはカーネルからより少ないエントロピーを取得できますが、ランダムデータの強度は低下しません。getentropyシステムコールはこの仮定に基づいて設計されており、1回の呼び出しで256バイト以上は提供されません。[1] [7]
参照
参考文献
- ^ abc "getentropy(2) OpenBSD man page". OpenBSD マニュアルページ. OpenBSD . 2016年5月27日閲覧。
- ^ 「[PATCH、RFC] random: getrandom(2) システムコールを導入」LKML 2014年7月17日2015年12月30日閲覧。
- ^ 「Linux 3.17」。Linux Kernel Newbies 。 2015年12月30日閲覧。
- ^ Darren, Moffat. 「Solaris の新しいシステムコール: getentropy(2) と getrandom(2)」/dev/urandom . Oracle. 2017 年 8 月 2 日時点のオリジナルよりアーカイブ。2016 年1 月 3 日閲覧。
- ^ 「リビジョン r286839」。svnweb.freebsd.org。FreeBSD。2017年8月29日閲覧。
- ^ 「Python が起動中にブロックする」 。2017年4 月 28 日閲覧。
- ^ "arc4random(3) OpenBSD man page". OpenBSD マニュアルページ. OpenBSD . 2016年5月27日閲覧。
外部リンク
- 乱数のためのシステムコール: getrandom()、LWN.net、2014 年 7 月 23 日、Jake Edge 著
