Red Hat Training
A Red Hat training course is available for RHEL 8
4.8. 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.8.1. annobin プラグインの使用
次のセクションでは、以下を行う方法を説明します。
-
annobin
プラグインの有効化 -
annobin
プラグインにオプションを渡します。
4.8.1.1. annobin プラグインの有効化
次のセクションでは、gcc
および clang
を使用して annobin
プラグインを有効にする方法を説明します。
手順
gcc
でannobin
プラグインを有効にするには、以下を使用します。$ gcc -fplugin=annobin
gcc
でannobin
プラグインを見つることができない場合は、以下を使用します。$ gcc -iplugindir=/path/to/directory/containing/annobin/
/path/to/directory/containing/annobin/ は、
annobin
を含むディレクトリーへの絶対パスに置き換えます。annobin
プラグインを含むディレクトリーを検索するには、以下を使用します。$ gcc --print-file-name=plugin
clang
でannobin
プラグインを有効にするには、以下を使用します。$ clang -fplugin=/path/to/directory/containing/annobin/
/path/to/directory/containing/annobin/ は、
annobin
を含むディレクトリーへの絶対パスに置き換えます。
4.8.1.2. annobin プラグインへのオプションの指定
次のセクションでは、gcc
および clang
を使用して annobin
プラグインにオプションを渡す方法を説明します。
手順
gcc
を使用してannobin
プラグインにオプションを渡すには、以下を使用します。$ gcc -fplugin=annobin -fplugin-arg-annobin-option file-name
option は
annobin
コマンドライン引数に、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
option は
annobin
コマンドライン引数に、/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.8.2. annocheck プログラムの使用
次のセクションでは、annocheck
を使用して検証する方法を説明します。
- ファイル
- ディレクトリー
- RPM パッケージ
-
annocheck
の追加ツール
annocheck
は、ELF オブジェクトファイルのディレクトリー、アーカイブ、および RPM パッケージを再帰的にスキャンします。ファイルは ELF 形式である必要があります。annocheck
は、他のバイナリーファイルタイプの処理に対応していません。
4.8.2.1. annocheck を使用したファイルの検証
次のセクションでは、annocheck
を使用して ELF ファイルを検証する方法を説明します。
手順
ファイルを検証するには、以下を使用します。
$ annocheck file-name
file-name は、ファイル名に置き換えます。
ファイルは ELF 形式である必要があります。annocheck
は、他のバイナリーファイルタイプの処理に対応していません。annocheck
は、ELF オブジェクトファイルなどの静的ライブラリーを処理します。
関連情報
-
annocheck
および使用可能なコマンドラインオプションに関する情報は、annocheck
の man ページを参照してください。
4.8.2.2. annocheck を使用したディレクトリーの検証
次のセクションでは、annocheck
を使用してディレクトリー内の ELF ファイルを検証する方法を説明します。
手順
ディレクトリーをスキャンするには、以下を使用します。
$ annocheck directory-name
directory-name は、ディレクトリー名に置き換えます。
annocheck
は、ディレクトリー、ディレクトリー内のサブディレクトリー、アーカイブおよび RPM パッケージの内容を自動的に検査します。
annocheck
は ELF ファイルのみを検索します。その他のファイルタイプは無視されます。
関連情報
-
annocheck
および使用可能なコマンドラインオプションに関する情報は、annocheck
の man ページを参照してください。
4.8.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.8.2.4. annocheck の追加ツールの使用
annocheck
には、バイナリーファイルを検証する複数のツールが含まれます。コマンドラインオプションを使用してこれらのツールを有効にできます。
次のセクションでは、以下を有効にする方法を説明します。
-
built-by
ツール -
notes
ツール -
section-size
ツール
複数のツールを同時に有効にできます。
強化チェッカーはデフォルトで有効になっています。
4.8.2.4.1. built-by
ツールの有効化
annocheck
built-by
ツールを使用して、バイナリーファイルを構築したコンパイラーの名前を検索できます。
手順
built-by
ツールを有効にするには以下を使用します。$ annocheck --enable-built-by
関連情報
-
built-by
ツールの詳細は、コマンドラインオプション--help
を参照してください。
4.8.2.4.2. notes
ツールの有効化
annocheck
notes
ツールを使用して、annobin
プラグインが作成したバイナリーファイルに保存されたノートを表示できます。
手順
notes
ツールを有効にするには、以下を使用します。$ annocheck --enable-notes
このノートは、アドレス範囲順に表示されます。
関連情報
-
notes
ツールの詳細は、コマンドラインオプション--help
を参照してください。
4.8.2.4.3. section-size
ツールの有効化
annocheck
section-size
ツールを使用すると、名前付きセクションのサイズを表示できます。
手順
section-size
ツールを有効にするには、以下を使用します。$ annocheck --section-size=name
name は、名前付きセクションの名前に置き換えます。出力は、特定のセクションに限定されます。累積結果は、最後に生成されます。
関連情報
-
section-size
ツールの詳細は、コマンドラインオプション--help
を参照してください。
4.8.2.4.4. 強化チェッカーの基本
強化チェッカーはデフォルトで有効になっています。コマンドラインオプション --disable-hardened
で、強化チェッカーを無効にできます。
4.8.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.8.2.4.4.2. 強化チェッカーの無効化
次のセクションでは、強化チェッカーを無効にする方法を説明します。
手順
強化チェッカーがないファイルでノートをスキャンするには、以下を使用します。
$ annocheck --enable-notes --disable-hardened file-name
file-name は、ファイルの名前に置き換えます。
4.8.3. 冗長する annobin ノートの削除
annobin
を使用すると、バイナリーのサイズが増えます。annobin
でコンパイルしたバイナリーのサイズを縮小するには、冗長な annobin
ノートを削除できます。冗長する annobin
ノートを削除するには、binutils
パッケージに含まれる objcopy
プログラムを使用します。
手順
冗長な
annobin
ノートを削除するには、以下を使用します。$ objcopy --merge-notes file-name
file-name は、ファイルの名前に置き換えます。
4.8.4. GCC Toolset 12 での annobin の詳細
場合によっては、GCC Toolset 12 における annobin
と gcc
間の同期問題により、コンパイルが失敗し、次のようなエラーメッセージが表示されることがあります。
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