【问题标题】:Is OS X's SecRandomCopyBytes fork safe?OS X 的 SecRandomCopyBytes 分支安全吗?
【发布时间】:2014-02-12 17:16:40
【问题描述】:

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

dtruss 来看,很明显SecRandomCopyBytes 至少是从/dev/random 播种的,但它是否以在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 得到以下信息(删除了不相关的内容):

open("/dev/random\0", 0x0, 0x7FFF900D76F5)       = 3 0
read(0x3, "\b\2029a6\020+\254\356\256\017\3171\222\376T\300\212\017\213\002\034w\3608\203-\214\373\244\177K\177Y\371\033\243Y\020\030*M\3264\265\027\216r\220\002\361\006\262\326\234\336\357F\035\036o\306\216\227\0", 0x40)        = 64 0
read(0x3, "\223??3\263\324\3604\314:+\362c\311\274\326\a_Ga\331\261\022\023\265C\na\211]\356)\0", 0x20)      = 32 0

【问题讨论】:

    标签: ios macos security prng security-framework


    【解决方案1】:

    实现其实是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 的包含中的 cmets 声明它是 fork() 安全的:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-11
      • 2017-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      相关资源
      最近更新 更多