table of contents
bzero(3) | Library Functions Manual | bzero(3) |
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¶
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 à debian-l10n-french@lists.debian.org.
2 mai 2024 | Pages du manuel de Linux (non publiées) |