4.5. Le projet Annobin
Le projet Annobin est une implémentation du projet de spécification Watermark. Le projet de spécification Watermark vise à ajouter des marqueurs aux objets ELF (Executable and Linkable Format) afin de déterminer leurs propriétés. Le projet Annobin se compose du plugin annobin
et du programme annockeck
.
Le plugin annobin
analyse la ligne de commande de GNU Compiler Collection (GCC), l'état de la compilation et le processus de compilation, et génère les notes ELF. Les notes ELF enregistrent la manière dont le binaire a été construit et fournissent des informations permettant au programme annocheck
d'effectuer des vérifications de renforcement de la sécurité.
Le vérificateur de renforcement de la sécurité fait partie du programme annocheck
et est activé par défaut. Il vérifie les fichiers binaires pour déterminer si le programme a été construit avec les options de renforcement de la sécurité nécessaires et s'il a été compilé correctement. annocheck
est capable d'analyser de manière récursive les répertoires, les archives et les paquets RPM à la recherche de fichiers objets ELF.
Les fichiers doivent être au format ELF. annocheck
ne gère aucun autre type de fichier binaire.
La section suivante décrit comment
-
Utiliser le plugin
annobin
-
Utiliser le programme
annocheck
-
Supprimer les notes redondantes de
annobin
4.5.1. Utiliser le plugin annobin
La section suivante décrit comment
-
Activer le plugin
annobin
-
Transmettre des options au plugin
annobin
4.5.1.1. Activation du plugin annobin
La section suivante décrit comment activer le plugin annobin
via gcc
et via clang
.
Procédure
Pour activer le plugin
annobin
avecgcc
, utilisez :$ gcc -fplugin=annobin
Si
gcc
ne trouve pas le pluginannobin
, utilisez :$ gcc -iplugindir=/path/to/directory/containing/annobin/
Remplacez /path/to/directory/containing/annobin/ par le chemin absolu vers le répertoire qui contient
annobin
.Pour trouver le répertoire contenant le plugin
annobin
, utilisez :$ gcc --print-file-name=plugin
Pour activer le plugin
annobin
avecclang
, utilisez :$ clang -fplugin=/path/to/directory/containing/annobin/
Remplacez /path/to/directory/containing/annobin/ par le chemin absolu vers le répertoire qui contient
annobin
.
4.5.1.2. Passer des options au plugin annobin
La section suivante décrit comment transmettre des options au plugin annobin
via gcc
et via clang
.
Procédure
Pour passer des options au plugin
annobin
avecgcc
, utilisez :gcc -fplugin=annobin -fplugin-arg-annobin-option file-name
Remplacez option par les arguments de la ligne de commande
annobin
et remplacez file-name par le nom du fichier.Exemple :
Pour afficher des détails supplémentaires sur ce que
annobin
est en train de faire, utilisez :$ gcc -fplugin=annobin -fplugin-arg-annobin-verbose file-name
Remplacez file-name par le nom du fichier.
Pour passer des options au plugin
annobin
avecclang
, utilisez :$ clang -fplugin=/path/to/directory/containing/annobin/ -Xclang -plugin-arg-annobin -Xclang option file-name
Remplacez option par les arguments de la ligne de commande
annobin
et remplacez /path/to/directory/containing/annobin/ par le chemin absolu du répertoire contenantannobin
.Exemple :
Pour afficher des détails supplémentaires sur ce que
annobin
est en train de faire, utilisez :$ clang -fplugin=/usr/lib64/clang/10/lib/annobin.so -Xclang -plugin-arg-annobin -Xclang verbose file-name
Remplacez file-name par le nom du fichier.
4.5.2. Utilisation du programme annocheck
La section suivante décrit comment utiliser annocheck
pour examiner :
- Dossiers
- Annuaires
- Paquets RPM
-
annocheck
outils supplémentaires
annocheck
analyse récursivement les répertoires, les archives et les paquets RPM à la recherche de fichiers objets ELF. Les fichiers doivent être au format ELF. annocheck
ne gère aucun autre type de fichier binaire.
4.5.2.1. Utiliser annocheck pour examiner les fichiers
La section suivante décrit comment examiner les fichiers ELF à l'aide de annocheck
.
Procédure
Pour examiner un fichier, utilisez :
$ annocheck file-name
Remplacez file-name par le nom d'un fichier.
Les fichiers doivent être au format ELF. annocheck
ne gère aucun autre type de fichier binaire. annocheck
traite les bibliothèques statiques qui contiennent des fichiers objets ELF.
Informations complémentaires
-
Pour plus d'informations sur
annocheck
et les options de ligne de commande possibles, voir la page de manuelannocheck
.
4.5.2.2. Utiliser annocheck pour examiner les répertoires
La section suivante décrit comment examiner les fichiers ELF dans un répertoire à l'aide de annocheck
.
Procédure
Pour scanner un répertoire, utilisez :
$ annocheck directory-name
Remplacez directory-name par le nom d'un répertoire.
annocheck
examine automatiquement le contenu du répertoire, de ses sous-répertoires et de toutes les archives et paquets RPM qui s'y trouvent.
annocheck
ne recherche que les fichiers ELF. Les autres types de fichiers sont ignorés.
Informations complémentaires
-
Pour plus d'informations sur
annocheck
et les options de ligne de commande possibles, voir la page de manuelannocheck
.
4.5.2.3. Utiliser annocheck pour examiner les paquets RPM
La section suivante décrit comment examiner les fichiers ELF dans un paquetage RPM à l'aide de annocheck
.
Procédure
Pour analyser un paquetage RPM, utilisez :
$ annocheck rpm-package-name
Remplacez rpm-package-name par le nom d'un paquetage RPM.
annocheck
analyse récursivement tous les fichiers ELF contenus dans le paquetage RPM.
annocheck
ne recherche que les fichiers ELF. Les autres types de fichiers sont ignorés.
Pour analyser un paquetage RPM avec l'info debug RPM fournie, utilisez :
$ annocheck rpm-package-name --debug-rpm debuginfo-rpm
Remplacez rpm-package-name par le nom d'un paquet RPM et debuginfo-rpm par le nom d'un RPM d'informations de débogage associé au RPM binaire.
Informations complémentaires
-
Pour plus d'informations sur
annocheck
et les options de ligne de commande possibles, voir la page de manuelannocheck
.
4.5.2.4. Utiliser les outils supplémentaires d'annocheck
annocheck
comprend plusieurs outils permettant d'examiner les fichiers binaires. Vous pouvez activer ces outils à l'aide des options de la ligne de commande.
La section suivante décrit comment activer la fonction :
-
built-by
outil -
notes
outil -
section-size
outil
Vous pouvez activer plusieurs outils en même temps.
Le vérificateur de durcissement est activé par défaut.
4.5.2.4.1. Activation de l'outil built-by
Vous pouvez utiliser l'outil annocheck
built-by
pour trouver le nom du compilateur qui a construit le fichier binaire.
Procédure
Pour activer l'outil
built-by
, utilisez$ annocheck --enable-built-by
Informations complémentaires
-
Pour plus d'informations sur l'outil
built-by
, voir l'option de ligne de commande--help
.
4.5.2.4.2. Activation de l'outil notes
Vous pouvez utiliser l'outil annocheck
notes
pour afficher les notes stockées dans un fichier binaire créé par le plugin annobin
.
Procédure
Pour activer l'outil
notes
, utilisez$ annocheck --enable-notes
Les notes sont affichées dans une séquence triée par plage d'adresses.
Informations complémentaires
-
Pour plus d'informations sur l'outil
notes
, voir l'option de ligne de commande--help
.
4.5.2.4.3. Activation de l'outil section-size
Vous pouvez utiliser l'outil annocheck
section-size
pour afficher la taille des sections nommées.
Procédure
Pour activer l'outil
section-size
, utilisez$ annocheck --section-size= (taille de la section)name
Remplacez name par le nom de la section nommée. La sortie est limitée à des sections spécifiques. Un résultat cumulé est produit à la fin.
Informations complémentaires
-
Pour plus d'informations sur l'outil
section-size
, voir l'option de ligne de commande--help
.
4.5.2.4.4. Principes de base du vérificateur de trempe
Le vérificateur d'endurcissement est activé par défaut. Vous pouvez le désactiver à l'aide de l'option de ligne de commande --disable-hardened
.
4.5.2.4.4.1. Options du vérificateur de durcissement
Le programme annocheck
vérifie les options suivantes :
-
Lazy binding est désactivée à l'aide de l'option
-z now
linker. - Le programme n'a pas de pile dans une région exécutable de la mémoire.
- Les emplacements de la table GOT sont définis en lecture seule.
- Aucun segment de programme ne possède les trois bits de permission de lecture, d'écriture et d'exécution.
- Il n'y a pas de relocalisation par rapport au code exécutable.
- Les informations relatives au chemin d'exécution permettant de localiser les bibliothèques partagées au moment de l'exécution ne comprennent que les répertoires ayant pour racine /usr.
-
Le programme a été compilé avec les notes
annobin
activées. -
Le programme a été compilé avec l'option
-fstack-protector-strong
activée. -
Le programme a été compilé avec
-D_FORTIFY_SOURCE=2
. -
Le programme a été compilé avec
-D_GLIBCXX_ASSERTIONS
. -
Le programme a été compilé avec
-fexceptions
activé. -
Le programme a été compilé avec
-fstack-clash-protection
activé. -
Le programme a été compilé à l'adresse
-O2
ou à une adresse supérieure. - Le programme n'a pas de relocalisation maintenue dans un élément inscriptible.
- Les exécutables dynamiques ont un segment dynamique.
-
Les bibliothèques partagées ont été compilées avec
-fPIC
ou-fPIE
. -
Les exécutables dynamiques ont été compilés avec
-fPIE
et liés avec-pie
. -
Si elle est disponible, l'option
-fcf-protection=full
a été utilisée. -
Si elle est disponible, l'option
-mbranch-protection
a été utilisée. -
Si elle est disponible, l'option
-mstackrealign
a été utilisée.
4.5.2.4.4.2. Désactivation du vérificateur de durcissement
La section suivante décrit comment désactiver le vérificateur de durcissement.
Procédure
Pour scanner les notes d'un fichier sans le vérificateur de durcissement, utilisez :
$ annocheck --enable-notes --disable-hardened file-name
Remplacez file-name par le nom d'un fichier.
4.5.3. Suppression des notes annobines redondantes
L'utilisation de annobin
augmente la taille des fichiers binaires. Pour réduire la taille des binaires compilés avec annobin
, vous pouvez supprimer les notes redondantes de annobin
. Pour supprimer les notes redondantes de annobin
, utilisez le programme objcopy
, qui fait partie du paquetage binutils
.
Procédure
Pour supprimer les notes redondantes de
annobin
, utilisez :$ objcopy --merge-notes file-name
Remplacez file-name par le nom du fichier.
4.5.4. Spécificités de annobin dans GCC Toolset 12
Dans certaines circonstances, en raison d'un problème de synchronisation entre annobin
et gcc
dans GCC Toolset 12, votre compilation peut échouer avec un message d'erreur qui ressemble à ce qui suit :
cc1: fatal error: inaccessible plugin file
opt/rh/gcc-toolset-12/root/usr/lib/gcc/architecture-linux-gnu/12/plugin/gcc-annobin.so
expanded from short plugin name gcc-annobin: No such file or directory
Pour contourner le problème, créez un lien symbolique dans le répertoire du plugin du fichier annobin.so
vers le fichier gcc-annobin.so
:
# cd /opt/rh/gcc-toolset-12/root/usr/lib/gcc/architecture-linux-gnu/12/plugin
# ln -s annobin.so gcc-annobin.so
Remplacez architecture par l'architecture que vous utilisez dans votre système :
-
aarch64
-
i686
-
ppc64le
-
s390x
-
x86_64