gpt4 book ai didi

c - 为什么未初始化的内存可以安全地用于 OpenSSL 的随机数生成器?

转载 作者:行者123 更新时间:2023-12-04 13:23:23 24 4
gpt4 key购买 nike

因此,距 Debian 维护者臭名昭著地导致 RNG 种子变得可预测由 commenting out a usage of uninitialized data 已经过去十一年多了。 .

这个问题在网络圈子里引起了很多热烈的讨论,大部分的焦点似乎都在批评审查过程或攻击有问题的开发者。

但是,我无法找到任何有关该部分最初出现的实际思考过程的信息。许多用户争辩说“最坏的情况下,它不会造成伤害”——然而,这对我来说似乎完全违反直觉。

毕竟,从未初始化的内存中读取会调用未定义的行为,臭名昭著的是,这会导致鼻恶魔、运行网络攻击或格式化硬盘。因此,在我看来,将这种逻辑引入任何程序——更不用说加密库了——可以让你进行积极的编译器优化,避免彻底的灾难。

因此,我的问题:

  • 我是不是误会了什么?为什么这实际上没有调用 UB,而是在标准下明确定义?
  • 如果它确实调用了 UB,为什么这个行为最初包含在 OpenSSL 中?

最佳答案

Debian 的“修复”是 completely incorrect . ssleay_rand_add唯一 向池中添加熵的函数。真正的罪魁祸首是在调用 的位置,它应该在那里被修复——因为函数本身 没有任何问题。

基本上是这样的:

void add_entropy(void *buf, size_t length) {
actually_add_entropy(buf, length);
}

int main(void) {
char buf[256];

// uninitialized local variable
add_entropy(buf, length);

// calculate more entropy to buf
// ...
add_entropy(buf, length);
}

如果您查看代码,问题在于第一次调用中传入的参数才是真正的罪魁祸首,第二种情况没问题,因为 buf 现在已初始化。正确的修复方法是“修复”add_entropy,如下所示:

void add_entropy(void *buf, size_t length) {
// valgrind complains about buf being uninitialized so
// actually_add_entropy(buf, length);
}

然而,他们正确尝试删除未初始化数组的使用 - 除了 UB 和 USB,它可能一直在掩盖代码中的严重问题 - 很可能是熵从未初始化的数据中初始化,因此可能仍然是可猜测或可控制的——但只是这一次更难注意到。

关于c - 为什么未初始化的内存可以安全地用于 OpenSSL 的随机数生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45395435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com