bzero, explicit_bzero — zero a byte string
#include <strings.h>
void
bzero( |
void *s, |
size_t n) ; |
#include <string.h>
void
explicit_bzero( |
void *s, |
size_t n) ; |
The bzero
() function erases
the data in the n
bytes of the memory starting at the location pointed to by
s
, by writing zeros
(bytes containing '\0') to that area.
The explicit_bzero
()
function performs the same task as bzero
(). It differs from bzero
() in that it guarantees that compiler
optimizations will not remove the erase operation if the
compiler deduces that the operation is "unnecessary".
For an explanation of the terms used in this section, see attributes(7).
Interface | Attribute | Value |
bzero (), explicit_bzero () |
Thread safety | MT-Safe |
The bzero
() function is
deprecated (marked as LEGACY in POSIX.1-2001); use memset(3) in new programs.
POSIX.1-2008 removes the specification of bzero
(). The bzero
() function first appeared in
4.3BSD.
The explicit_bzero
()
function is a nonstandard extension that is also present on
some of the BSDs. Some other implementations have a similar
function, such as memset_explicit
() or memset_s
().
The explicit_bzero
()
function addresses a problem that security-conscious
applications may run into when using bzero
(): if the compiler can deduce that
the location to zeroed will never again be touched by a
correct
program, then it may
remove the bzero
() call
altogether. This is a problem if the intent of the
bzero
() call was to erase
sensitive data (e.g., passwords) to prevent the possibility
that the data was leaked by an incorrect or compromised
program. Calls to explicit_bzero
() are never optimized away
by the compiler.
The explicit_bzero
()
function does not solve all problems associated with erasing
sensitive data:
The explicit_bzero
()
function does not guarantee that sensitive
data is completely erased from memory. (The same is
true of bzero
().) For
example, there may be copies of the sensitive data in a
register and in "scratch" stack areas. The explicit_bzero
() function is not
aware of these copies, and can't erase them.
In some circumstances, explicit_bzero
() can decrease
security. If the compiler
determined that the variable containing the sensitive
data could be optimized to be stored in a register
(because it is small enough to fit in a register, and
no operation other than the explicit_bzero
() call would need to
take the address of the variable), then the
explicit_bzero
() call
will force the data to be copied from the register to a
location in RAM that is then immediately erased (while
the copy in the register remains unaffected). The
problem here is that data in RAM is more likely to be
exposed by a bug than data in a register, and thus the
explicit_bzero
() call
creates a brief time window where the sensitive data is
more vulnerable than it would otherwise have been if no
attempt had been made to erase the data.
Note that declaring the sensitive variable with the
volatile
qualifier does
not eliminate the
above problems. Indeed, it will make them worse, since, for
example, it may force a variable that would otherwise have
been optimized into a register to instead be maintained in
(more vulnerable) RAM for its entire lifetime.
Notwithstanding the above details, for security-conscious
applications, using explicit_bzero
() is generally preferable to
not using it. The developers of explicit_bzero
() anticipate that future
compilers will recognize calls to explicit_bzero
() and take steps to ensure
that all copies of the sensitive data are erased, including
copies in registers or in "scratch" stack areas.
This page is part of release 5.11 of the Linux man-pages
project. A
description of the project, information about reporting bugs,
and the latest version of this page, can be found at
https://www.kernel.org/doc/man−pages/.
Copyright (C) 2017 Michael Kerrisk <mtk.manpagesgmail.com> %%%LICENSE_START(VERBATIM) Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Since the Linux kernel and libraries are constantly changing, this manual page may be incorrect or out-of-date. The author(s) assume no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein. The author(s) may not have taken the same level of care in the production of this manual, which is licensed free of charge, as they might when working professionally. Formatted or processed versions of this manual, if unaccompanied by the source, must acknowledge the copyright and authors of this work. %%%LICENSE_END |