AppArmor

Reading time: 10 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Informations de base

AppArmor est un amĂ©lioration du noyau conçue pour restreindre les ressources disponibles aux programmes via des profils par programme, mettant en Ɠuvre efficacement le ContrĂŽle d'AccĂšs Obligatoire (MAC) en liant les attributs de contrĂŽle d'accĂšs directement aux programmes plutĂŽt qu'aux utilisateurs. Ce systĂšme fonctionne en chargeant des profils dans le noyau, gĂ©nĂ©ralement au dĂ©marrage, et ces profils dictent quelles ressources un programme peut accĂ©der, telles que les connexions rĂ©seau, l'accĂšs aux sockets bruts et les permissions de fichiers.

Il existe deux modes opérationnels pour les profils AppArmor :

  • Mode d'application : Ce mode applique activement les politiques dĂ©finies dans le profil, bloquant les actions qui violent ces politiques et enregistrant toute tentative de violation via des systĂšmes comme syslog ou auditd.
  • Mode de plainte : Contrairement au mode d'application, le mode de plainte ne bloque pas les actions qui vont Ă  l'encontre des politiques du profil. Au lieu de cela, il enregistre ces tentatives comme des violations de politique sans appliquer de restrictions.

Composants d'AppArmor

  • Module du noyau : Responsable de l'application des politiques.
  • Politiques : SpĂ©cifient les rĂšgles et restrictions pour le comportement des programmes et l'accĂšs aux ressources.
  • Analyseur : Charge les politiques dans le noyau pour application ou rapport.
  • Utilitaires : Ce sont des programmes en mode utilisateur qui fournissent une interface pour interagir avec et gĂ©rer AppArmor.

Chemin des profils

Les profils AppArmor sont généralement enregistrés dans /etc/apparmor.d/
Avec sudo aa-status, vous pourrez lister les binaires qui sont restreints par un certain profil. Si vous pouvez changer le caractÚre "/" par un point dans le chemin de chaque binaire listé, vous obtiendrez le nom du profil AppArmor dans le dossier mentionné.

Par exemple, un profil apparmor pour /usr/bin/man sera situé dans /etc/apparmor.d/usr.bin.man

Commandes

bash
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

Création d'un profil

  • Afin d'indiquer l'exĂ©cutable affectĂ©, les chemins absolus et les jokers sont autorisĂ©s (pour le globbing de fichiers) pour spĂ©cifier des fichiers.
  • Pour indiquer l'accĂšs que le binaire aura sur les fichiers, les contrĂŽles d'accĂšs suivants peuvent ĂȘtre utilisĂ©s :
  • r (lecture)
  • w (Ă©criture)
  • m (carte mĂ©moire comme exĂ©cutable)
  • k (verrouillage de fichier)
  • l (crĂ©ation de liens durs)
  • ix (pour exĂ©cuter un autre programme avec la nouvelle politique hĂ©ritĂ©e)
  • Px (exĂ©cuter sous un autre profil, aprĂšs nettoyage de l'environnement)
  • Cx (exĂ©cuter sous un profil enfant, aprĂšs nettoyage de l'environnement)
  • Ux (exĂ©cuter sans confinement, aprĂšs nettoyage de l'environnement)
  • Des variables peuvent ĂȘtre dĂ©finies dans les profils et peuvent ĂȘtre manipulĂ©es depuis l'extĂ©rieur du profil. Par exemple : @{PROC} et @{HOME} (ajoutez #include <tunables/global> au fichier de profil)
  • Les rĂšgles de refus sont prises en charge pour remplacer les rĂšgles d'autorisation.

aa-genprof

Pour commencer facilement à créer un profil, apparmor peut vous aider. Il est possible de faire en sorte que apparmor inspecte les actions effectuées par un binaire et vous laisse ensuite décider quelles actions vous souhaitez autoriser ou refuser.
Il vous suffit d'exécuter :

bash
sudo aa-genprof /path/to/binary

Ensuite, dans une console différente, effectuez toutes les actions que le binaire effectuera généralement :

bash
/path/to/binary -a dosomething

Ensuite, dans la premiÚre console, appuyez sur "s" puis dans les actions enregistrées, indiquez si vous souhaitez ignorer, autoriser ou autre. Lorsque vous avez terminé, appuyez sur "f" et le nouveau profil sera créé dans /etc/apparmor.d/path.to.binary

note

En utilisant les touches fléchées, vous pouvez sélectionner ce que vous souhaitez autoriser/refuser/autre

aa-easyprof

Vous pouvez également créer un modÚle de profil apparmor d'un binaire avec :

bash
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

Notez qu'en créant un profil, par défaut, rien n'est autorisé, donc tout est refusé. Vous devrez ajouter des lignes comme /etc/passwd r, pour autoriser la lecture binaire de /etc/passwd, par exemple.

Vous pouvez ensuite appliquer le nouveau profil avec

bash
sudo apparmor_parser -a /etc/apparmor.d/path.to.binary

Modification d'un profil Ă  partir des journaux

L'outil suivant lira les journaux et demandera à l'utilisateur s'il souhaite autoriser certaines des actions interdites détectées :

bash
sudo aa-logprof

note

En utilisant les touches fléchées, vous pouvez sélectionner ce que vous souhaitez autoriser/refuser/quoi que ce soit

Gestion d'un profil

bash
#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

Logs

Exemple de journaux AUDIT et DENIED de /var/log/audit/audit.log de l'exécutable service_bin :

bash
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

Vous pouvez Ă©galement obtenir ces informations en utilisant :

bash
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

Apparmor dans Docker

Notez comment le profil docker-profile de docker est chargé par défaut :

bash
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

Par défaut, le profil docker-default d'Apparmor est généré à partir de https://github.com/moby/moby/tree/master/profiles/apparmor

Résumé du profil docker-default :

  • AccĂšs Ă  tout le rĂ©seau
  • Aucune capacitĂ© n'est dĂ©finie (Cependant, certaines capacitĂ©s proviendront de l'inclusion de rĂšgles de base, c'est-Ă -dire #include <abstractions/base>)
  • L'Ă©criture dans tout fichier /proc n'est pas autorisĂ©e
  • D'autres sous-rĂ©pertoires/fichiers de /proc et /sys se voient refuser l'accĂšs en lecture/Ă©criture/verrouillage/lien/exĂ©cution
  • Le montage n'est pas autorisĂ©
  • Ptrace ne peut ĂȘtre exĂ©cutĂ© que sur un processus qui est confinĂ© par le mĂȘme profil apparmor

Une fois que vous exécutez un conteneur docker, vous devriez voir la sortie suivante :

bash
1 processes are in enforce mode.
docker-default (825)

Notez que apparmor bloquera mĂȘme les privilĂšges de capacitĂ©s accordĂ©s au conteneur par dĂ©faut. Par exemple, il sera capable de bloquer la permission d'Ă©crire dans /proc mĂȘme si la capacitĂ© SYS_ADMIN est accordĂ©e car par dĂ©faut, le profil apparmor de docker refuse cet accĂšs :

bash
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

Vous devez désactiver apparmor pour contourner ses restrictions :

bash
docker run -it --cap-add SYS_ADMIN --security-opt seccomp=unconfined --security-opt apparmor=unconfined ubuntu /bin/bash

Notez qu'en par dĂ©faut, AppArmor va Ă©galement interdire au conteneur de monter des dossiers de l'intĂ©rieur mĂȘme avec la capacitĂ© SYS_ADMIN.

Notez que vous pouvez ajouter/enlever des capacités au conteneur docker (cela sera toujours restreint par des méthodes de protection comme AppArmor et Seccomp):

  • --cap-add=SYS_ADMIN donne la capacitĂ© SYS_ADMIN
  • --cap-add=ALL donne toutes les capacitĂ©s
  • --cap-drop=ALL --cap-add=SYS_PTRACE supprime toutes les capacitĂ©s et donne uniquement SYS_PTRACE

note

En gĂ©nĂ©ral, lorsque vous dĂ©couvrez que vous avez une capacitĂ© privilĂ©giĂ©e disponible Ă  l'intĂ©rieur d'un conteneur docker mais qu'une partie de l'exploit ne fonctionne pas, cela sera parce que docker apparmor l'empĂȘchera.

Exemple

(Exemple de ici)

Pour illustrer la fonctionnalitĂ© d'AppArmor, j'ai crĂ©Ă© un nouveau profil Docker “mydocker” avec la ligne suivante ajoutĂ©e:

deny /etc/* w,   # deny write for all files directly in /etc (not in a subdir)

Pour activer le profil, nous devons faire ce qui suit :

sudo apparmor_parser -r -W mydocker

Pour lister les profils, nous pouvons exécuter la commande suivante. La commande ci-dessous liste mon nouveau profil AppArmor.

$ sudo apparmor_status  | grep mydocker
mydocker

Comme montrĂ© ci-dessous, nous obtenons une erreur lorsque nous essayons de changer “/etc/” car le profil AppArmor empĂȘche l'accĂšs en Ă©criture Ă  “/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

Vous pouvez trouver quel profil apparmor exécute un conteneur en utilisant :

bash
docker inspect 9d622d73a614 | grep lowpriv
"AppArmorProfile": "lowpriv",
"apparmor=lowpriv"

Ensuite, vous pouvez exécuter la ligne suivante pour trouver le profil exact utilisé :

bash
find /etc/apparmor.d/ -name "*lowpriv*" -maxdepth 1 2>/dev/null

Dans le cas Ă©trange oĂč vous pouvez modifier le profil docker apparmor et le recharger. Vous pourriez supprimer les restrictions et "les contourner".

Contournement AppArmor Docker2

AppArmor est basĂ© sur le chemin, cela signifie que mĂȘme s'il peut protĂ©ger des fichiers Ă  l'intĂ©rieur d'un rĂ©pertoire comme /proc, si vous pouvez configurer comment le conteneur va ĂȘtre exĂ©cutĂ©, vous pourriez monter le rĂ©pertoire proc de l'hĂŽte Ă  l'intĂ©rieur de /host/proc et il ne sera plus protĂ©gĂ© par AppArmor.

Contournement Shebang AppArmor

Dans ce bug, vous pouvez voir un exemple de la façon dont mĂȘme si vous empĂȘchez perl d'ĂȘtre exĂ©cutĂ© avec certaines ressources, si vous crĂ©ez simplement un script shell spĂ©cifiant dans la premiĂšre ligne #!/usr/bin/perl et que vous exĂ©cutez le fichier directement, vous pourrez exĂ©cuter ce que vous voulez. Par exemple :

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

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks