hardening-check - Vérifier les binaires pour des
fonctionnalités de sécurisation
hardening-check [options] [ELF ...]
Examiner un ensemble donné de binaires ELF et rechercher
plusieurs fonctions de sécurisation en échouant si toutes ne
sont pas trouvées.
Cet utilitaire recherche dans un ensemble de binaires ELF
plusieurs fonctionnalités de sécurisation qui peuvent avoir
été compilées dans un exécutable. Ces
fonctionnalités sont :
- Position
Independent Executable
- Cela indique que l’exécutable a été construit
d’une manière telle (PIE) que la section "texte"
du programme peut être transférée en mémoire.
Pour tirer avantage de cette fonctionnalité, le noyau
exécuté doit prendre en charge la distribution
aléatoire de l’espace d’adressage (Address Space
Layout Randomization – ASLR) de texte.
- Stack
Protected
- Cela indique qu’il y a des indices que l’ELF a
été compilé avec l’option
-fstack-protector de gcc(1) (par exemple utilisation de
__stack_chk_fail). Le programme sera résistant au
dépassement de pile.
Quand un exécutable a été construit sans
qu’une table de caractères ne soit allouée dans la
pile, cette recherche mènera à des fausses alertes (dans
la mesure où __stack_chk_fail n’est pas
utilisé), même s’il a été
compilé avec les bonnes options.
- Fortify Source
functions
- Cela indique que l’exécutable a été
compilé avec -D_FORTIFY_SOURCE=2 et -O1 ou plus. Cela
provoque le remplacement de certaines fonctions non sûres de glibc
par leurs équivalents plus sûrs (par exemple strncpy
à la place de strcpy) , ou remplace des appels
vérifiables au moment de l’exécution par des versions
runtime-check (par exemple __memcpy_chk à la place de
memcpy).
Quand un exécutable a été construit de
telle manière que les versions renforcées des fonctions de
glibc ne sont pas utiles (par exemple, l’utilisation est
vérifiée comme sûre au moment de la compilation, ou
l’utilisation ne peut pas être vérifiée au
moment de l’exécution), cette recherche mènera
à de fausses alertes. Pour tenter de pallier cela, la recherche
réussira si une fonction renforcée est découverte,
et échouera si uniquement des fonctions non renforcées
sont découvertes. Les conditions non vérifiables
réussissent aussi (par exemple, aucune fonction qui peut
être renforcée n’est trouvée, ou
n’est pas liée à glibc).
- Read-only
relocations
- Cela indique que l’exécutable a été construit
avec les options -Wl,-z,relro pour que les marquages ELF (RELRO)
demandent que l’éditeur de liens au moment de
l’exécution marque toutes les zones de la table de
réadressage en "lecture seule" si les translations
d’adresses ont été résolues avant le
début de l’exécution. Cela réduit le nombre de
zones de mémoire d’un programme qui peuvent être
utilisées par un attaquant pour réaliser une exploitation
efficace de corruption de mémoire.
- Immediate
binding
- Cela indique que l’exécutable a été construit
avec les options -Wl,-z,now pour que les marquages ELF (BIND_NOW)
demandent que l’éditeur de liens au moment de
l’exécution résolve toutes les réadressages
avant de démarrer l’exécution du programme. Si cette
option est combinée avec l’option RELRO ci-dessus, cela
réduit encore davantage les zones de mémoire accessibles aux
attaques par corruption de mémoire.
- Branch
Protection
- Cela indique que l’exécutable a été construit
avec -mbranch-protection=standard. Sur les processeurs ARM, cela fournit
des protections additionnelles de structure de contrôle en
utilisant les instrutions de cible d’embranchement (BTI, Branch
Target Instructions) qui marquent tous les emplacements
d’embranchement valables, et les codes d’authentification de
pointeur (PAC, Pointer Authentication Codes) qui signent et
vérifient les cibles d’embranchements indirects. Cela
contribue à empêcher l’utilisation de failles
basées sur le détournement du déroulement d’un
programme pour lui faire exécuter du code à un emplacement
arbitraire en mémoire.
- --nopie,
-p
- Ne pas exiger que les exécutables vérifiés soient
construits comme PIE.
- --nostackprotector,
-s
- Ne pas exiger que les exécutables vérifiés soient
construits avec le protecteur de pile.
- --nofortify,
-f
- Ne pas exiger que les exécutables vérifiés soient
construits avec Fortify Source.
- --norelro,
-r
- Ne pas exiger que les exécutables vérifiés soient
construits avec RELRO.
- --nobindnow,
-b
- Ne pas exiger que les exécutables vérifiés soient
construits avec BIND_NOW.
- --nocfprotection,
-x
- Ne pas exiger que les exécutables vérifiés soient
construits avec la protection de structure de contrôle.
- --nobranchprotection,
-B
- Ne pas exiger que les exécutables vérifiés soient
construits avec la protection d’embranchement.
- --quiet,
-q
- Ne fournir que des rapports d’échec.
- --verbose,
-v
- Fournir des rapports d’échec détaillés.
- --report-functions,
-R
- Après le rapport, afficher toutes les fonctions externes
nécessaires à l’ELF.
- --find-libc-functions,
-F
- Au lieu de faire un rapport normal, localiser la libc pour le premier ELF
sur la ligne de commande et rapporter toutes les fonctions
"renforcées" exportées par libc.
- --color,
-c
- Activer les sorties d’état colorées.
- --lintian,
-l
- Changer les rapports pour une sortie analysable par une
vérification de lintian.
- --debug
- Rapporter des données de débogage durant le traitement.
- --help, -h,
-?
- Afficher un message d’aide bref et quitter.
- --man, -H
- Afficher la page de manuel et quitter.
Quand toutes les fonctionnalités de sécurisation
vérifiables des exécutables examinés ont
été détectées, ce programme
s’achève avec un code de sortie de "0". Si une
vérification échoue, le code de sortie sera "1". Les
vérifications individuelles peuvent être
désactivées avec des options en ligne de commande.
Kees Cook <kees@debian.org>
Copyright 2009-2013 Kees Cook <kees@debian.org>.
Ce programme est un logiciel libre ; il est permis de le
distribuer et/ou de le modifier selon les termes de la GNU General Public
License, telle que publiée par la Free Software Foundation,
version 2 ou ultérieure.
Cyril Brulebois <cyril.brulebois@enst-bretagne.fr>,
2006
Thomas Huriaux <thomas.huriaux@gmail.com>, 2006
David Prévot <david@tilapin.org>,
2010-2013
Xavier Guimard <yadd@debian.org>, 2018-2024