OS X的SecRandomCopyBytes叉安全吗?

时间:2014-02-12 17:16:40

标签: ios macos security prng security-framework

许多用户空间CSPRNG都有一个问题,在fork(2)之后,两个不同的进程可能会返回相同的随机字节流。

dtruss开始,很明显SecRandomCopyBytes至少是从/dev/random播种,但它是以{{1}之后安全使用的方式进行的}}?

使用以下源代码:

fork()

我从#include <Security/Security.h> int main() { uint8_t data[8]; SecRandomCopyBytes(kSecRandomDefault, 8, data); SecRandomCopyBytes(kSecRandomDefault, 8, data); printf("%llu\n", *(uint64_t *)data); } 获得以下内容(删除了无关的内容):

dtruss

1 个答案:

答案 0 :(得分:7)

实现实际上是CCRandomCopyBytes():

http://www.opensource.apple.com/source/Security/Security-55471/libsecurity_keychain/lib/SecRandom.c

int SecRandomCopyBytes(SecRandomRef rnd, size_t count, uint8_t *bytes) {
    if (rnd != kSecRandomDefault)
        return errSecParam;
    return CCRandomCopyBytes(kCCRandomDefault, bytes, count);
}

所以实际代码在这里:

http://www.opensource.apple.com/source/CommonCrypto/CommonCrypto-60049/lib/CommonRandom.c

CCRandomCopyBytes包含中的注释表明它是fork()安全:

  

调用系统随机数生成器很不方便   直。在调用/ dev / random的简单情况下,调用者   必须打开设备并关闭它,除了管理它   虽然它是开放的。该模块具有直接的存在理由   这样做的不便之处。它管理文件描述符   / dev / random包括发生的异常处理   在fork()和exec()中。调用CCRandomCopyBytes()和所有   为您管理繁琐的位。只要继续你的一切   真的很想做。   [...]

在我自己的快速测试中,孩子在调用SecRandomCopyBytes()时会被杀死