検索

4.9. Annobin プロジェクト

download PDF

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

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.