4.4. 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.4.1. annobin プラグインの使用 リンクのコピーリンクがクリップボードにコピーされました!
次のセクションでは、以下を行う方法を説明します。
-
annobinプラグインの有効化 -
annobinプラグインにオプションを渡します。
4.4.1.1. annobin プラグインの有効化 リンクのコピーリンクがクリップボードにコピーされました!
次のセクションでは、gcc および clang を使用して annobin プラグインを有効にする方法を説明します。
手順
gccでannobinプラグインを有効にするには、以下を使用します。$ gcc -fplugin=annobingccで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.4.1.2. annobin プラグインへのオプションの指定 リンクのコピーリンクがクリップボードにコピーされました!
次のセクションでは、gcc および clang を使用して annobin プラグインにオプションを渡す方法を説明します。
手順
gccを使用してannobinプラグインにオプションを渡すには、以下を使用します。$ gcc -fplugin=annobin -fplugin-arg-annobin-option file-nameoption は
annobinコマンドライン引数に、file-name はファイル名に置き換えます。たとえば、
annobinが何を実行しているかについての追加情報を表示するには、次のコマンドを使用します。$ gcc -fplugin=annobin -fplugin-arg-annobin-verbose file-namefile-name は、ファイルの名前に置き換えます。
clangを使用してannobinプラグインにオプションを渡すには、以下を使用します。$ clang -fplugin=/path/to/directory/containing/annobin/ -Xclang -plugin-arg-annobin -Xclang option file-nameoption は
annobinコマンドライン引数に、/path/to/directory/containing/annobin/ は、annobinを含むディレクトリーへの絶対パスに置き換えます。たとえば、
annobinが何を実行しているかについての追加情報を表示するには、次のコマンドを使用します。$ clang -fplugin=/usr/lib64/clang/10/lib/annobin.so -Xclang -plugin-arg-annobin -Xclang verbose file-namefile-name は、ファイルの名前に置き換えます。
4.4.2. annocheck プログラムの使用 リンクのコピーリンクがクリップボードにコピーされました!
次のセクションでは、annocheck を使用して検証する方法を説明します。
- ファイル
- ディレクトリー
- RPM パッケージ
-
annocheckの追加ツール
annocheck は、ELF オブジェクトファイルのディレクトリー、アーカイブ、および RPM パッケージを再帰的にスキャンします。ファイルは ELF 形式である必要があります。annocheck は、他のバイナリーファイルタイプの処理に対応していません。
4.4.2.1. annocheck を使用したファイルの検証 リンクのコピーリンクがクリップボードにコピーされました!
次のセクションでは、annocheck を使用して ELF ファイルを検証する方法を説明します。
手順
ファイルを検証するには、以下を使用します。
$ annocheck file-namefile-name は、ファイルの名前に置き換えます。
注記ファイルは ELF 形式である必要があります。
annocheckは、他のバイナリーファイルタイプの処理に対応していません。annocheckは、ELF オブジェクトファイルなどの静的ライブラリーを処理します。
4.4.2.2. annocheck を使用したディレクトリーの検証 リンクのコピーリンクがクリップボードにコピーされました!
次のセクションでは、annocheck を使用してディレクトリー内の ELF ファイルを検証する方法を説明します。
手順
ディレクトリーをスキャンするには、以下を使用します。
$ annocheck directory-namedirectory-name は、ディレクトリー名に置き換えます。
annocheckは、ディレクトリー、ディレクトリー内のサブディレクトリー、アーカイブおよび RPM パッケージの内容を自動的に検査します。注記annocheckは ELF ファイルのみを検索します。他のファイルタイプは無視されます。
4.4.2.3. annocheck を使用した RPM パッケージの検証 リンクのコピーリンクがクリップボードにコピーされました!
次のセクションでは、annocheck を使用して RPM パッケージの ELF ファイルを検証する方法を説明します。
手順
RPM パッケージをスキャンするには、以下を使用します。
$ annocheck rpm-package-namerpm-package-name は、RPM パッケージ名に置き換えます。
annocheckは、RPM パッケージ内のすべての ELF ファイルを再帰的にスキャンします。注記annocheckは ELF ファイルのみを検索します。他のファイルタイプは無視されます。debug info RPM が含まれる RPM パッケージをスキャンするには、以下を使用します。
$ annocheck rpm-package-name --debug-rpm debuginfo-rpmrpm-package-name は RPM パッケージの名前に、debuginfo-rpm はバイナリー RPM に関連付けられた debug info RPM の名前に置き換えます。
4.4.2.4. annocheck の追加ツールの使用 リンクのコピーリンクがクリップボードにコピーされました!
annocheck には、バイナリーファイルを検証する複数のツールが含まれます。コマンドラインオプションを使用してこれらのツールを有効にできます。
次のセクションでは、以下を有効にする方法を説明します。
-
built-byツール -
notesツール -
section-sizeツール
複数のツールを同時に有効にできます。
強化チェッカーはデフォルトで有効になっています。
4.4.2.4.1. built-by ツールの有効化 リンクのコピーリンクがクリップボードにコピーされました!
annocheck built-by ツールを使用して、バイナリーファイルを構築したコンパイラーの名前を検索できます。
手順
built-byツールを有効にするには以下を使用します。$ annocheck --enable-built-bybuilt-byツールの詳細は、コマンドラインオプション--helpを参照してください。
4.4.2.4.2. notes ツールの有効化 リンクのコピーリンクがクリップボードにコピーされました!
annocheck notes ツールを使用して、annobin プラグインが作成したバイナリーファイルに保存されたノートを表示できます。
手順
notesツールを有効にするには、以下を使用します。$ annocheck --enable-notesこのノートは、アドレス範囲順に表示されます。
notesツールの詳細は、コマンドラインオプション--helpを参照してください。
4.4.2.4.3. section-size ツールの有効化 リンクのコピーリンクがクリップボードにコピーされました!
annocheck section-size ツールを使用すると、名前付きセクションのサイズを表示できます。
手順
section-sizeツールを有効にするには、以下を使用します。$ annocheck --section-size=namename は、名前付きセクションの名前に置き換えます。出力は、特定のセクションに限定されます。累積結果は、最後に生成されます。
section-sizeツールの詳細は、コマンドラインオプション--helpを参照してください。
4.4.2.4.4. 強化チェッカーの基本 リンクのコピーリンクがクリップボードにコピーされました!
強化チェッカーはデフォルトで有効になっています。コマンドラインオプション --disable-hardened で、強化チェッカーを無効にできます。
4.4.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.4.2.4.4.2. 強化チェッカーの無効化 リンクのコピーリンクがクリップボードにコピーされました!
次のセクションでは、強化チェッカーを無効にする方法を説明します。
手順
強化チェッカーがないファイルでノートをスキャンするには、以下を使用します。
$ annocheck --enable-notes --disable-hardened file-namefile-name は、ファイルの名前に置き換えます。
4.4.3. 冗長する annobin ノートの削除 リンクのコピーリンクがクリップボードにコピーされました!
annobin を使用すると、バイナリーのサイズが増えます。annobin でコンパイルしたバイナリーのサイズを縮小するには、冗長な annobin ノートを削除できます。冗長する annobin ノートを削除するには、binutils パッケージに含まれる objcopy プログラムを使用します。
手順
冗長な
annobinノートを削除するには、以下を使用します。$ objcopy --merge-notes file-namefile-name は、ファイルの名前に置き換えます。