AppArmor
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
AppArmorは、プログラムごとのプロファイルを通じてプログラムに利用可能なリソースを制限するために設計されたカーネル拡張機能です。これにより、アクセス制御属性がユーザーではなくプログラムに直接結び付けられることで、Mandatory Access Control (MAC)が効果的に実装されます。このシステムは、プロファイルをカーネルにロードすることによって機能し、通常はブート時に行われ、これらのプロファイルはプログラムがアクセスできるリソース(ネットワーク接続、生ソケットアクセス、ファイル権限など)を決定します。
AppArmorプロファイルには2つの運用モードがあります:
強制モード:このモードは、プロファイル内で定義されたポリシーを積極的に強制し、これらのポリシーに違反するアクションをブロックし、syslogやauditdなどのシステムを通じて違反の試みをログに記録します。
コンプライアンスモード:強制モードとは異なり、コンプライアンスモードはプロファイルのポリシーに反するアクションをブロックしません。代わりに、これらの試みをポリシー違反としてログに記録しますが、制限は強制しません。
カーネルモジュール:ポリシーの強制を担当します。
ポリシー:プログラムの動作とリソースアクセスに関するルールと制限を指定します。
パーサー:ポリシーをカーネルにロードして強制または報告します。
ユーティリティ:AppArmorとのインターフェースを提供し、管理するためのユーザーモードプログラムです。
AppArmorプロファイルは通常、_/etc/apparmor.d/_に保存されます。
sudo aa-status
を使用すると、いくつかのプロファイルによって制限されているバイナリをリストできます。リストされた各バイナリのパスの「/」をドットに変更すると、指定されたフォルダー内のAppArmorプロファイルの名前が得られます。
例えば、_/usr/bin/manのためのAppArmorプロファイルは、/etc/apparmor.d/usr.bin.man_にあります。
影響を受ける実行可能ファイルを示すために、絶対パスとワイルドカードがファイルを指定するために許可されています。
バイナリがファイルに対して持つアクセスを示すために、以下のアクセス制御を使用できます:
r (読み取り)
w (書き込み)
m (実行可能なメモリマップ)
k (ファイルロック)
l (ハードリンクの作成)
ix (新しいプログラムがポリシーを継承して別のプログラムを実行する)
Px (環境をクリーンアップした後、別のプロファイルの下で実行)
Cx (環境をクリーンアップした後、子プロファイルの下で実行)
Ux (環境をクリーンアップした後、制限なしで実行)
変数はプロファイル内で定義でき、プロファイルの外部から操作できます。例えば: @{PROC} と @{HOME} (プロファイルファイルに #include <tunables/global> を追加)
許可ルールを上書きするための拒否ルールがサポートされています。
プロファイルの作成を簡単に始めるために、apparmorが役立ちます。apparmorがバイナリによって実行されるアクションを検査し、許可または拒否したいアクションを決定できるようにすることが可能です。 実行するだけで済みます:
その後、別のコンソールでバイナリが通常実行するすべてのアクションを実行します:
次に、最初のコンソールで "s" を押し、記録されたアクションで無視、許可、またはその他を選択します。終了したら "f" を押すと、新しいプロファイルが /etc/apparmor.d/path.to.binary に作成されます。
矢印キーを使用して、許可/拒否/その他を選択できます
バイナリの apparmor プロファイルのテンプレートを作成することもできます:
デフォルトでは、作成されたプロファイルでは何も許可されていないため、すべてが拒否されます。例えば、バイナリが/etc/passwd
を読み取ることを許可するには、/etc/passwd r,
のような行を追加する必要があります。
その後、enforceコマンドを使用して新しいプロファイルを適用できます。
次のツールはログを読み取り、ユーザーに検出された禁止されたアクションのいくつかを許可するかどうかを尋ねます:
矢印キーを使用して、許可/拒否/その他の選択を行うことができます
実行可能ファイル service_bin
の /var/log/audit/audit.log からの AUDIT および DENIED ログの例:
この情報は次のコマンドを使用して取得することもできます:
dockerのdocker-profileプロファイルがデフォルトで読み込まれることに注意してください:
デフォルトでは、Apparmor docker-default プロファイルは https://github.com/moby/moby/tree/master/profiles/apparmor から生成されます。
docker-default プロファイルの概要:
ネットワークへのすべてのアクセス
能力は定義されていません(ただし、基本的なベースルールを含めることでいくつかの能力が得られます。つまり、#include <abstractions/base>)
/procファイルへの書き込みは許可されていません
/procおよび**/sysの他のサブディレクトリ**/ファイルへの読み取り/書き込み/ロック/リンク/実行アクセスは拒否されます
マウントは許可されていません
Ptraceは、同じ apparmor プロファイルによって制限されたプロセスでのみ実行できます
docker コンテナを実行すると、次の出力が表示されるはずです:
注意してほしいのは、apparmorはデフォルトでコンテナに付与されたcapabilities権限さえもブロックするということです。例えば、SYS_ADMIN権限が付与されていても/proc内への書き込み権限をブロックすることができるのは、デフォルトのdocker apparmorプロファイルがこのアクセスを拒否するためです。
あなたはその制限を回避するためにapparmorを無効にする必要があります:
デフォルトでは、AppArmorはコンテナが内部からフォルダをマウントすることを禁止します。SYS_ADMIN権限があってもです。
capabilitiesをdockerコンテナに追加/削除することができます(これはAppArmorやSeccompのような保護方法によって制限されます):
--cap-add=SYS_ADMIN
で SYS_ADMIN
権限を付与
--cap-add=ALL
ですべての権限を付与
--cap-drop=ALL --cap-add=SYS_PTRACE
ですべての権限を削除し、SYS_PTRACE
のみを付与
通常、dockerコンテナ内で特権のある権限が利用可能であることを発見したが、エクスプロイトの一部が機能していない場合、これはdockerのapparmorがそれを防いでいるためです。
(こちらからの例)
AppArmorの機能を示すために、次の行を追加した新しいDockerプロファイル「mydocker」を作成しました:
プロファイルを有効にするには、次の手順を実行する必要があります:
プロファイルをリストするには、次のコマンドを実行できます。以下のコマンドは、私の新しいAppArmorプロファイルをリストしています。
以下に示すように、AppArmorプロファイルが「/etc」への書き込みアクセスを防止しているため、「/etc/」を変更しようとするとエラーが発生します。
コンテナが実行しているapparmorプロファイルを見つけるには、次のコマンドを使用します:
次に、以下の行を実行して使用されている正確なプロファイルを見つけることができます:
In the weird case you can modify the apparmor docker profile and reload it. あなたは制限を削除し、「バイパス」することができます。
AppArmorはパスベースです。これは、たとえそれが**/proc
のようなディレクトリ内のファイルを保護しているとしても、コンテナの実行方法を構成できる場合、ホストのprocディレクトリを/host/proc
にマウント**することができ、AppArmorによって保護されなくなることを意味します。
このバグでは、特定のリソースでperlの実行を防いでいる場合でも、最初の行に**#!/usr/bin/perl
**を指定したシェルスクリプトを作成し、ファイルを直接実行することで、あなたが望むものを実行できる例を見ることができます。例えば:
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)