版本

explicit_bzero()首次出现在glibc 2.25中。

语法

#include <strings.h>

void bzero(void *s, size_t n);

#include <string.h>

void explicit_bzero(void *s, size_t n);

名称

bzero,explicit_bzero-将字节字符串清零

返回值

没有。

另外参见

bstring(3),memset(3),拭子(3)

BZERO - Linux手册页

Linux程序员手册 第3部分
更新日期: 2019-03-06

说明

bzero()函数通过将零(包含aq \ 0aq的字节)写入该区域,从s指向的位置开始擦除内存的n个字节中的数据。

explicit_bzero()函数执行与bzero()相同的任务。它与bzero()的不同之处在于,它保证如果编译器推断出该操作是"不必要的",则编译器优化不会删除该擦除操作。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
bzero(),
explicit_bzero()
Thread safetyMT-Safe

遵循规范

不建议使用bzero()函数(在POSIX.1-2001中标记为LEGACY);在新程序中使用memset(3)。 POSIX.1-2008删除了bzero()的规范。 bzero()函数首先出现在4.3BSD中。

explicit_bzero()函数是一个非标准扩展,在某些BSD上也存在。其他一些实现也具有类似的功能,例如memset_explicit()或memset_s()。

备注

explicit_bzero()函数解决了使用bzero()时注重安全性的应用程序可能会遇到的问题:如果编译器可以推断出归零的位置永远不会再被正确的程序触及,则它可能会删除bzero()一起打电话。如果bzero()调用的目的是擦除敏感数据(例如密码),以防止数据被不正确或受损的程序泄漏的可能性,则这是一个问题。编译器永远不会优化对explicit_bzero()的调用。

explicit_bzero()函数不能解决与擦除敏感数据有关的所有问题:

1.
explicit_bzero()函数不能保证敏感数据已从内存中完全删除。 (bzero()也是如此。)例如,在寄存器和"临时"堆栈区域中可能存在敏感数据的副本。 explicit_bzero()函数无法识别这些副本,因此无法擦除它们。
2.
在某些情况下,explicit_bzero()可能会降低安全性。如果编译器确定包含敏感数据的变量可以被优化以存储在寄存器中(因为它足够小以适合寄存器,并且除explicit_bzero()调用之外的任何操作都不需要获取变量的地址)。变量),则explicit_bzero()调用将强制将数据从寄存器复制到RAM中的某个位置,然后立即将其擦除(而寄存器中的副本不受影响)。这里的问题是,RAM中的数据比寄存器中的数据更容易被错误暴露,因此,explicit_bzero()调用会创建一个简短的时间窗口,在此窗口中,敏感数据比没有缓存时更容易受到攻击。已尝试擦除数据。

请注意,使用volatile限定符声明敏感变量并不能消除上述问题。确实,这会使它们变得更糟,因为例如,它可能迫使本应优化的变量放入寄存器中,而不是在整个生命周期内都保存在(更易受攻击的)RAM中。

尽管有上述详细说明,但对于注重安全性的应用程序,使用explicit_bzero()通常比不使用它更可取。 explicit_bzero()的开发人员预计,将来的编译器将识别对explicit_bzero()的调用,并采取措施确保擦除所有敏感数据副本,包括寄存器或"暂存"堆栈区域中的副本。

日期:2019-08-20 17:59:56 来源:oir作者:oir