リンカーとライブラリ

セキュリティ

セキュアプロセスには、その依存関係と実行パスを評価し、不当な依存関係の置換またはシンボルの割り込みを防ぐために使用されるいくつかの制約があります。

実行時リンカーは、そのユーザーがスーパーユーザーではなく、実際のユーザーと実効ユーザー ID が同じではない場合、または実際のグループと実効グループ ID が同じではない場合、プロセスをセキュアとして分類します (getuid(2)geteuid(2)getgid(2) および getegid(2) を参照)。

実行時リンカーが認識するデフォルトのトラストディレクトリは、32 ビットのオブジェクトの場合は /usr/lib/secure、64 ビットオブジェクトの場合は /usr/lib/secure/64 です。ユーティリティ crle(1) を使用すれば、セキュアアプリケーション向けに追加のトラストディレクトリを指定できます。この方法を使用する場合には、管理者は、ターゲットディレクトリを悪意のある侵入から適切に保護する必要があります。

LD_LIBRARY_PATH ファミリの環境変数がセキュアプロセス用に有効である場合は (「実行時リンカーによって検索されるディレクトリ」を参照)、この変数によって指定されたトラストディレクトリのみが、実行時リンカーの検索規則を補強するために使用されます。

セキュアプロセスでは、実行パスがフルパスである場合は、アプリケーションまたはその依存関係によって指定された実行パスの指定 (「実行時リンカーによって検索されるディレクトリ」を参照) が使用されます。つまり、パス名の冒頭部分に / が付く場合です。

セキュアプロセスでは、$ORIGIN 文字列の拡張は (「セキュリティ」を参照)、トラストディレクトリに拡張される場合のみ有効です。

追加オブジェクトは、LD_PRELOAD 環境変数 (「追加オブジェクトの読み込み」を参照)、または LD_AUDIT 環境変数 (「実行時リンカーの監査インタフェース」を参照) を使用したセキュアプロセスで読み込まれます。これらのオブジェクトはフルパス名または単純ファイル名で指定しなければなりません。フルパス名は、既知のトラストディレクトリに限定されます。単純ファイル名 (名前に / がついていない) は、前述した検索パスの制約に従って配置され、既知のトラストディレクトリにのみ解決されることになります。

セキュアプロセスでは、単純ファイル名を構成する依存関係は、前述のパス名の制約を使用して処理されます。フルパス名または相対パス名で表示された依存関係は、そのまま使用されます。そのため、セキュアプロセスの開発者は、フルパス名または相対パス名の依存関係として参照されるターゲットディレクトリを、不当な侵入から確実に保護する必要があります。

セキュアプロセスを作成する場合には、依存関係の表示や、dlopen(3DL)パス名の構築に、相対パス名は使用しないことをお勧めします。この制約は、アプリケーションと依存関係すべてに適用されます。