Rechercher

4.5. Le projet Annobin

download PDF

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.

Note

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 avec gcc, utilisez :

    $ gcc -fplugin=annobin
    • Si gcc ne trouve pas le plugin annobin, 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 avec clang, 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 avec gcc, 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 avec clang, 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 contenant annobin.

    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
Note

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.

Note

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 manuel annocheck.

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.

Note

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 manuel annocheck.

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.

Note

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 manuel annocheck.

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.

Note

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
Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.