Red Hat Training

A Red Hat training course is available for RHEL 8

4.9. Annobin プロジェクト

Annobin プロジェクトは Watermark 仕様プロジェクトの実装です。Watermark 仕様プロジェクトは、マーカーを Executable and Linkable Format (ELF) オブジェクトに追加してそのプロパティーを判断するためのものです。Annobin プロジェクトは、annobin プラグインと annockeck プログラムで設定されます。

annobin プラグインは、GNU コンパイラーコレクション (GCC) コマンドライン、コンパイル状態、およびコンパイルプロセスをスキャンし、ELF ノートを生成します。ELF ノートでは、バイナリーの構築方法を記録し、セキュリティー強化チェックを実行する annocheck プログラムの情報を得ることができます。

セキュリティー強化チェッカーは annocheck プログラムの一部で、デフォルトで有効になっています。バイナリーファイルをチェックして、必要なセキュリティー強化オプションでプログラムが構築されていて、正しくコンパイルされているかを判断します。annocheck は、ELF オブジェクトファイルのディレクトリー、アーカイブ、および RPM パッケージを再帰的にスキャンできます。

注記

ファイルは ELF 形式である必要があります。annocheck は、他のバイナリーファイルタイプの処理に対応していません。

次のセクションでは、以下を行う方法を説明します。

  • annobin プラグインの使用
  • annocheck プログラムの使用
  • 冗長な annobin ノートの削除

4.9.1. annobin プラグインの使用

次のセクションでは、以下を行う方法を説明します。

  • annobin プラグインの有効化
  • annobin プラグインにオプションを渡します。

4.9.1.1. annobin プラグインの有効化

次のセクションでは、gcc および clang を使用して annobin プラグインを有効にする方法を説明します。

手順

  • gccannobin プラグインを有効にするには、以下を使用します。

    $ gcc -fplugin=annobin
    • gccannobin プラグインを見つることができない場合は、以下を使用します。

      $ gcc -iplugindir=/path/to/directory/containing/annobin/

      /path/to/directory/containing/annobin/ は、annobin を含むディレクトリーへの絶対パスに置き換えます。

    • annobin プラグインを含むディレクトリーを検索するには、以下を使用します。

      $ gcc --print-file-name=plugin
  • clangannobin プラグインを有効にするには、以下を使用します。

    $ clang -fplugin=/path/to/directory/containing/annobin/

    /path/to/directory/containing/annobin/ は、annobin を含むディレクトリーへの絶対パスに置き換えます。

4.9.1.2. annobin プラグインへのオプションの指定

次のセクションでは、gcc および clang を使用して annobin プラグインにオプションを渡す方法を説明します。

手順

  • gcc を使用して annobin プラグインにオプションを渡すには、以下を使用します。

    $ gcc -fplugin=annobin -fplugin-arg-annobin-option file-name

    optionannobin コマンドライン引数に、file-name はファイル名に置き換えます。

    • 実行する annobin に関する追加情報を表示するには、以下を使用します。

      $ gcc -fplugin=annobin -fplugin-arg-annobin-verbose file-name

      file-name は、ファイルの名前に置き換えます。

  • clang を使用して annobin プラグインにオプションを渡すには、以下を使用します。

    $ clang -fplugin=/path/to/directory/containing/annobin/ -Xclang -plugin-arg-annobin -Xclang option file-name

    optionannobin コマンドライン引数に、/path/to/directory/containing/annobin/ は、annobin を含むディレクトリーへの絶対パスに置き換えます。

    • 実行する annobin に関する追加情報を表示するには、以下を使用します。

      $ clang -fplugin=/usr/lib64/clang/10/lib/annobin.so -Xclang -plugin-arg-annobin -Xclang verbose file-name

      file-name は、ファイルの名前に置き換えます。

4.9.2. annocheck プログラムの使用

次のセクションでは、annocheck を使用して検証する方法を説明します。

  • ファイル
  • ディレクトリー
  • RPM パッケージ
  • annocheck の追加ツール
注記

annocheck は、ELF オブジェクトファイルのディレクトリー、アーカイブ、および RPM パッケージを再帰的にスキャンします。ファイルは ELF 形式である必要があります。annocheck は、他のバイナリーファイルタイプの処理に対応していません。

4.9.2.1. annocheck を使用したファイルの検証

次のセクションでは、annocheck を使用して ELF ファイルを検証する方法を説明します。

手順

  • ファイルを検証するには、以下を使用します。

    $ annocheck file-name

    file-name は、ファイル名に置き換えます。

注記

ファイルは ELF 形式である必要があります。annocheck は、他のバイナリーファイルタイプの処理に対応していません。annocheck は、ELF オブジェクトファイルなどの静的ライブラリーを処理します。

関連情報

  • annocheck および使用可能なコマンドラインオプションに関する情報は、annocheck の man ページを参照してください。

4.9.2.2. annocheck を使用したディレクトリーの検証

次のセクションでは、annocheck を使用してディレクトリー内の ELF ファイルを検証する方法を説明します。

手順

  • ディレクトリーをスキャンするには、以下を使用します。

    $ annocheck directory-name

    directory-name は、ディレクトリー名に置き換えます。annocheck は、ディレクトリー、ディレクトリー内のサブディレクトリー、アーカイブおよび RPM パッケージの内容を自動的に検査します。

注記

annocheck は ELF ファイルのみを検索します。その他のファイルタイプは無視されます。

関連情報

  • annocheck および使用可能なコマンドラインオプションに関する情報は、annocheck の man ページを参照してください。

4.9.2.3. annocheck を使用した RPM パッケージの検証

次のセクションでは、annocheck を使用して RPM パッケージの ELF ファイルを検証する方法を説明します。

手順

  • RPM パッケージをスキャンするには、以下を使用します。

    $ annocheck rpm-package-name

    rpm-package-name は、RPM パッケージ名に置き換えます。annocheck は、RPM パッケージ内のすべての ELF ファイルを再帰的にスキャンします。

注記

annocheck は ELF ファイルのみを検索します。その他のファイルタイプは無視されます。

  • debug info RPM が含まれる RPM パッケージをスキャンするには、以下を使用します。

    $ annocheck rpm-package-name --debug-rpm debuginfo-rpm

    rpm-package-name は RPM パッケージの名前に、debuginfo-rpm はバイナリー RPM に関連付けられた debug info RPM の名前に置き換えます。

関連情報

  • annocheck および使用可能なコマンドラインオプションに関する情報は、annocheck の man ページを参照してください。

4.9.2.4. annocheck の追加ツールの使用

annocheck には、バイナリーファイルを検証する複数のツールが含まれます。コマンドラインオプションを使用してこれらのツールを有効にできます。

次のセクションでは、以下を有効にする方法を説明します。

  • built-by ツール
  • notes ツール
  • section-size ツール

複数のツールを同時に有効にできます。

注記

強化チェッカーはデフォルトで有効になっています。

4.9.2.4.1. built-by ツールの有効化

annocheck built-by ツールを使用して、バイナリーファイルを構築したコンパイラーの名前を検索できます。

手順

  • built-by ツールを有効にするには以下を使用します。

    $ annocheck --enable-built-by

関連情報

  • built-by ツールの詳細は、コマンドラインオプション --help を参照してください。
4.9.2.4.2. notes ツールの有効化

annocheck notes ツールを使用して、annobin プラグインが作成したバイナリーファイルに保存されたノートを表示できます。

手順

  • notes ツールを有効にするには、以下を使用します。

    $ annocheck --enable-notes

    このノートは、アドレス範囲順に表示されます。

関連情報

  • notes ツールの詳細は、コマンドラインオプション --help を参照してください。
4.9.2.4.3. section-size ツールの有効化

annocheck section-size ツールを使用すると、名前付きセクションのサイズを表示できます。

手順

  • section-size ツールを有効にするには、以下を使用します。

    $ annocheck --section-size=name

    name は、名前付きセクションの名前に置き換えます。出力は、特定のセクションに限定されます。累積結果は、最後に生成されます。

関連情報

  • section-size ツールの詳細は、コマンドラインオプション --help を参照してください。
4.9.2.4.4. 強化チェッカーの基本

強化チェッカーはデフォルトで有効になっています。コマンドラインオプション --disable-hardened で、強化チェッカーを無効にできます。

4.9.2.4.4.1. 強化チェッカーのオプション

annocheck プログラムは、以下のオプションをチェックします。

  • -z now リンカーオプションを使用して遅延結合が無効になる。
  • プログラムのメモリーの実行可能なリージョン内にスタックがない。
  • GOT テーブルの再配置が読み取り専用に設定されている。
  • プログラムセグメントには、読み取り、書き込み、および実行権限ビットセットの 3 つすべてがある。
  • 実行コードに対する再配置がない。
  • ランタイム時に共有ライブラリーを見つけるための runpath 情報には、/usr にルート指定されたディレクトリーのみが含まれている。
  • プログラムが annobin ノートを有効にしてコンパイルされている。
  • プログラムが -fstack-protector-strong オプションを有効にしてコンパイルされている。
  • プログラムが -D_FORTIFY_SOURCE=2 でコンパイルされている。
  • プログラムが -D_GLIBCXX_ASSERTIONS でコンパイルされている。
  • プログラムが -fexceptions を有効にしてコンパイルされている。
  • プログラムが -fstack-clash-protection を有効にしてコンパイルされている。
  • プログラムが -O2 以降でコンパイルされている。
  • プログラムには書き込み可能な再配置がない。
  • 動的実行可能ファイルには動的セグメントがある。
  • 共有ライブラリーが -fPIC または -fPIE でコンパイルされている。
  • 動的実行可能ファイルは -fPIE でコンパイルされ、-pie でリンクされている。
  • 利用可能な場合は、-fcf-protection=full オプションが使用されている。
  • 利用可能な場合は、-mbranch-protection オプションが使用されている。
  • 利用可能な場合は、-mstackrealign オプションが使用されている。
4.9.2.4.4.2. 強化チェッカーの無効化

次のセクションでは、強化チェッカーを無効にする方法を説明します。

手順

  • 強化チェッカーがないファイルでノートをスキャンするには、以下を使用します。

    $ annocheck --enable-notes --disable-hardened file-name

    file-name は、ファイルの名前に置き換えます。

4.9.3. 冗長する annobin ノートの削除

annobin を使用すると、バイナリーのサイズが増えます。annobin でコンパイルしたバイナリーのサイズを縮小するには、冗長な annobin ノートを削除できます。冗長する annobin ノートを削除するには、binutils パッケージに含まれる objcopy プログラムを使用します。

手順

  • 冗長な annobin ノートを削除するには、以下を使用します。

      $ objcopy --merge-notes file-name

    file-name は、ファイルの名前に置き換えます。

4.9.4. GCC Toolset 12 での annobin の詳細

場合によっては、GCC Toolset 12 における annobingcc 間の同期問題により、コンパイルが失敗し、次のようなエラーメッセージが表示されることがあります。

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

この問題を回避するには、プラグインディレクトリーに annobin.so ファイルから 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

architecture はシステムでお使いのアーキテクチャーに置き換えてください。

  • aarch64
  • i686
  • ppc64le
  • s390x
  • x86_64