AppArmorのドキュメントには、環境スクラビングの有無にかかわらず、アプリケーションが他のプログラムを実行できるようにすることが記載されています。明らかに、スクラブされた環境の方が安全ですが、ドキュメントでは、環境のスクラブがどのように行われるかを正確に指定していないようです。
環境スクラブとは何ですか?AppArmorは環境をスクラブするために何をしますか?
「環境スクラビング」とは、バイナリの動作に影響を与えるために使用される可能性のあるさまざまな「危険な」環境変数を削除することです。たとえば、LD_PRELOAD
動的リンカーにコードをプルインさせるために使用できます。プログラム; 一部の変数は、既知の名前のファイルにトレース出力を発生させるように設定できます。等
このスクラビングは通常、セキュリティ対策としてsetuid / setgidバイナリに対して実行されますが、カーネルは、セキュリティモジュールが他の任意のバイナリに対してもそれを有効にできるようにするフックを提供します。
カーネルのELFローダーコードは、このフックAT_SECURE
を使用して、バイナリに渡される情報の「補助ベクトル」にエントリを設定します。(AppArmorコードでのこのフックの実装については、こことここを参照してください。)
ユーザースペースで実行が開始されると、ダイナミックリンカはこの値__libc_enable_secure
を取得し、それを使用してフラグを設定します。同じルーチンに、setuid/setgidバイナリにこのフラグを設定するコードも含まれていることがわかります。(静的にリンクされているバイナリについては、他の場所に同等のコードがあります。)
__libc_enable_secure
ダイナミックリンカコードの本体の多くの場所に影響を与え、特定の環境変数のリストを削除します。