bzero
Table des matières
Retour à l'index
NOM
bzero, explicit_bzero - mise à zéro d'une chaîne d'octets
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <strings.h>
void bzero(void s[.n], size_t n);
#include <string.h>
void explicit_bzero(void s[.n], size_t n);
DESCRIPTION
La fonction bzero() efface les données dans les n premiers octets de
la mémoire à partir de l'emplacement pointé par s en écrivant des zéros
(octets contenant « \0 ») dans cette zone.
La fonction explicit_bzero() exécute les mêmes tâches que
bzero(). Elle diffère de bzero() en ce qu'elle garantit que les
optimisations du compilateur ne suppriment pas l'opération d'effacement si
le compilateur déduit que l'opération n'est « pas indispensable ».
VALEUR RENVOYÉE
Aucune.
ATTRIBUTS
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
| Interface | Attribut | Valeur
|
|
bzero(),
explicit_bzero()
| Sécurité des threads | MT-Safe
|
STANDARDS
Aucune.
HISTORIQUE
- explicit_bzero()
-
glibc 2.25.
-
La fonction explicit_bzero() est une extension qui n'est pas standard,
mais est présente également dans certains BSD. Certaines autres
implémentations ont une fonction similaire comme memset_explicit() ou
memset_s().
- bzero()
-
4.3BSD.
-
Fonction marquée « LEGACY » dans POSIX.1-2001, supprimée dans
POSIX.1-2008.
NOTES
La fonction explicit_bzero() traite d'un problème que peuvent rencontrer
les applications soucieuses de la sécurité lors de l'utilisation de
bzero() : si le compilateur peut déduire que l'emplacement à mettre à
zéro ne sera jamais plus touché par un programme correct, alors il peut
supprimer complètement l'appel bzero(). C'est un problème si l'intention
de l'appel bzero() était d'effacer des données sensibles (par exemple des
mots de passe) pour éviter la possibilité de la divulgation des données par
un programme incorrect ou compromis. Les appels à explicit_bzero() ne
sont jamais optimisés par le compilateur.
La fonction explicit_bzero() ne résout pas tous les problèmes associés à
l'effacement des données sensibles :
- -
-
La fonction explicit_bzero() ne garantit pas que les données sensibles
sont complètement effacées de la mémoire. (C'est la même chose pour
bzero().) Par exemple, il peut y avoir des copies des données sensibles
dans un registre et des zones « scratch » de la pile. La fonction
explicit_bzero() n'a pas connaissance de ces copies et ne peut pas les
effacer.
- -
-
Dans certaines circonstances, explicit_bzero() peut réduire la
sécurité. Si le compilateur a déterminé que la variable contenant les
données sensibles pouvait être optimisée pour être stockée dans un registre
(parce qu'elle était assez petite pour tenir dans un registre et qu'aucune
autre opération que l'appel explicit_bzero() n'avait besoin d'obtenir
l'adresse de la variable), alors l'appel explicit_bzero() pourra forcer
la copie des données du registre vers un emplacement en mémoire vive qui est
alors immédiatement effacé (tandis que la copie dans le registre demeure non
touchée). Le problème ici est que la donnée en mémoire vive est plus
susceptible d'être exposée par un bogue que les données dans le registre, et
donc l'appel explicit_bzero() crée une courte fenêtre temporelle où les
données sont plus vulnérables qu'elles ne l'auraient été si aucune tentative
d'effacement des données n'avait été entreprise.
Notez que déclarer la variable sensible avec le qualificatif de volatile
n'élimine pas les problème ci-dessus. En fait, cela ne fait que
l’aggraver dans la mesure où, par exemple, cela peut faire qu'une variable,
qui autrement aurait été optimisée dans un registre, est plutôt maintenue en
mémoire vive (plus vulnérable) durant toute son existence.
Malgré les détails ci-dessus, pour les applications soucieuses de la
sécurité, utiliser explicit_bzero() est généralement préférable à ne pas
le faire. Les développeurs d'explicit_bzero() s'attendent à ce que les
compilateurs à venir reconnaîtront les appels d'explicit_bzero() et
prendront des mesures pour s'assurer que toutes les copies des données
sensibles sont effacées, y compris les copies dans les registres ou dans les
zones « scratch » de la pile.
VOIR AUSSI
bstring(3), memset(3), swab(3)
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>,
Frédéric Hantrais <fhantrais@gmail.com>
et
Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>
Cette traduction est une documentation libre ; veuillez vous reporter à la
GNU General Public License version 3
concernant les conditions de copie et
de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- VALEUR RENVOYÉE
-
- ATTRIBUTS
-
- STANDARDS
-
- HISTORIQUE
-
- NOTES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:12 GMT, September 19, 2025