hacktricks/linux-hardening/privilege-escalation/docker-security/apparmor.md
2024-02-10 18:14:16 +00:00

16 KiB
Raw Blame History

AppArmor

AWS hackleme becerilerini sıfırdan ileri seviyeye öğrenmek için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)'ı öğrenin!

HackTricks'ı desteklemenin diğer yolları:

Temel Bilgiler

AppArmor, kullanıcılar yerine programlara doğrudan erişim kontrol özelliklerini bağlayarak, zorunlu erişim kontrolünü (MAC) etkin bir şekilde uygulayan, programlara sunulan kaynakları kısıtlamak için tasarlanmış bir çekirdek geliştirmesidir. Bu sistem, genellikle önyükleme sırasında, profilleri çekirdeğe yükleyerek çalışır ve bu profiller, bir programın erişebileceği kaynakları, ağ bağlantıları, ham soket erişimi ve dosya izinleri gibi belirler.

AppArmor profilleri için iki işletim modu vardır:

  • Uygulama Modu: Bu mod, profil içinde tanımlanan politikaları etkin bir şekilde uygular, bu politikalara aykırı olan eylemleri engeller ve syslog veya auditd gibi sistemler aracılığıyla bunları ihlal etmeye yönelik girişimleri kaydeder.
  • Şikayet Modu: Uygulama modunun aksine, şikayet modu, profilin politikalarına aykırı olan eylemleri engellemez. Bunun yerine, bu girişimleri kısıtlamaları uygulamadan politika ihlalleri olarak kaydeder.

AppArmor'ın Bileşenleri

  • Çekirdek Modülü: Politikaların uygulanmasından sorumludur.
  • Politikalar: Program davranışı ve kaynak erişimi için kuralları ve kısıtlamaları belirtir.
  • Ayrıştırıcı: Politikaları çekirdeğe yükler, uygulama veya raporlama için.
  • Araçlar: AppArmor ile etkileşimde bulunmak ve yönetmek için kullanıcı modu programlarıdır.

Profil Yolu

AppArmor profilleri genellikle /etc/apparmor.d/ dizininde kaydedilir. sudo aa-status komutunu kullanarak, bazı profillerle kısıtlanan ikili dosyaları listeleyebilirsiniz. Listelenen her ikili dosyanın yolundaki "/" karakterini bir nokta ile değiştirirseniz, bahsedilen klasördeki apparmor profilinin adını elde edersiniz.

Örneğin, /usr/bin/man için bir apparmor profili, /etc/apparmor.d/usr.bin.man konumunda bulunur.

Komutlar

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

Profil Oluşturma

  • Etkilenen yürütülebilir dosyayı belirtmek için mutlak yol ve joker karakterleri (dosya eşleştirmesi için) kullanılabilir.
  • Dosyalar üzerinde yürütülecek işlemleri belirtmek için aşağıdaki erişim kontrolleri kullanılabilir:
  • r (okuma)
  • w (yazma)
  • m (belleğe haritalama, yürütülebilir olarak)
  • k (dosya kilitleme)
  • l (sabit bağlantı oluşturma)
  • ix (yeni programın politikayı devralarak başka bir programı yürütmesi için)
  • Px (ortamı temizledikten sonra başka bir profil altında yürütme)
  • Cx (ortamı temizledikten sonra bir alt profil altında yürütme)
  • Ux (ortamı temizledikten sonra sınırsız olarak yürütme)
  • Profillerde değişkenler tanımlanabilir ve profilden dışarıdan manipüle edilebilir. Örneğin: @{PROC} ve @{HOME} (profil dosyasına #include <tunables/global> ekleyin)
  • İzin verme kuralları, izin verme kurallarını geçersiz kılmak için kullanılabilir.

aa-genprof

Profil oluşturmaya kolayca başlamak için apparmor size yardımcı olabilir. Apparmor, bir ikili tarafından gerçekleştirilen eylemleri incelemesini ve ardından hangi eylemleri izin vermek veya reddetmek istediğinizi belirlemenizi sağlayabilir.
Sadece şunu çalıştırmanız yeterlidir:

sudo aa-genprof /path/to/binary

Ardından, farklı bir konsolda, genellikle ikili dosyanın gerçekleştireceği tüm eylemleri gerçekleştirin:

/path/to/binary -a dosomething

Ardından, ilk konsolda "s" tuşuna basın ve kaydedilen eylemlerde yoksaymak, izin vermek veya başka bir şey yapmak istediğinizi belirtin. İşiniz bittiğinde "f" tuşuna basın ve yeni profil /etc/apparmor.d/path.to.binary dizininde oluşturulacaktır.

{% hint style="info" %} Yukarı/aşağı ok tuşlarını kullanarak izin vermek/engellemek/istenen seçeneği seçebilirsiniz. {% endhint %}

aa-easyprof

Ayrıca, bir ikili dosyanın apparmor profilinin bir şablonunu da oluşturabilirsiniz:

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
}

{% hint style="info" %} Varsayılan olarak, oluşturulan bir profilde hiçbir şey izin verilmez, bu yüzden her şey reddedilir. Örneğin, /etc/passwd r, gibi satırlar eklemek için /etc/passwd dosyasını okumaya izin vermek için eklemeler yapmanız gerekecektir. {% endhint %}

Yeni profili ardından zorlayabilirsiniz.

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

Günlüklerden bir profil değiştirme

Aşağıdaki araç, günlükleri okuyacak ve kullanıcıya tespit edilen yasaklanmış eylemlerin bazılarını izin vermek isteyip istemediğini soracaktır:

sudo aa-logprof

{% hint style="info" %} Ok tuşları kullanarak neyi izin vermek/engellemek/neyi yapmak istediğinizi seçebilirsiniz. {% endhint %}

Bir Profili Yönetmek

# Create a new profile
sudo aa-genprof /path/to/binary

# Load a profile
sudo apparmor_parser -r -W /etc/apparmor.d/profile

# Unload a profile
sudo apparmor_parser -R /etc/apparmor.d/profile

# Disable a profile
sudo ln -s /etc/apparmor.d/profile /etc/apparmor.d/disable/

# Enable a profile
sudo ln -s /etc/apparmor.d/profile /etc/apparmor.d/enable/

# Check the status of a profile
sudo apparmor_status

Profile Syntax

Profiles are written in a specific syntax. Here is an example of a simple profile:

#include <tunables/global>

/usr/bin/myapp {
  # Deny access to all files
  deny /**,

  # Allow read access to /etc/passwd
  /etc/passwd r,

  # Allow write access to /tmp
  /tmp w,

  # Allow execute access to /usr/bin/myapp
  /usr/bin/myapp x,
}

In this example, the profile denies access to all files except for /etc/passwd, /tmp, and /usr/bin/myapp. The r, w, and x indicate read, write, and execute permissions, respectively.

Profile Inheritance

Profiles can also inherit from other profiles. This allows for the reuse of common rules and simplifies profile management. Here is an example of a profile that inherits from another profile:

#include <tunables/global>

/usr/bin/myapp {
  # Inherit from the base profile
  profile /usr/bin/myapp flags=(attach_disconnected,mediate_deleted) {
    # Additional rules specific to /usr/bin/myapp
    /var/log/myapp.log w,
  }
}

In this example, the profile for /usr/bin/myapp inherits from the base profile and adds an additional rule for write access to /var/log/myapp.log.

Conclusion

AppArmor provides a powerful and flexible way to enforce security policies on Linux systems. By creating and managing profiles, you can control the access and permissions of individual applications, reducing the risk of privilege escalation and unauthorized access.

#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

Günlükler

service_bin adlı yürütülebilir dosyanın /var/log/audit/audit.log dosyasındaki AUDIT ve DENIED günlüklerinin örneği:

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

Bu bilgilere şu şekilde de ulaşabilirsiniz:

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'da Apparmor

Docker'ın varsayılan olarak yüklenen docker-profile profiline dikkat edin:

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

Varsayılan olarak Apparmor docker-default profili, https://github.com/moby/moby/tree/master/profiles/apparmor adresinden oluşturulur.

docker-default profil Özeti:

  • Tüm ağ erişimine izin verilir.
  • Hiçbir yetenek tanımlanmamıştır (Ancak, bazı yetenekler temel kuralların içe aktarılmasıyla gelecektir, örneğin #include <abstractions/base> )
  • /proc dosyalarına yazma izni verilmemiştir
  • Diğer alt dizinler/dosyalar /proc ve /sys dizinlerinde okuma/yazma/kilit/ilişkilendirme/çalıştırma erişimi reddedilmiştir
  • Mount izni verilmemiştir
  • Ptrace, yalnızca aynı apparmor profiliyle sınırlanmış bir işlemde çalıştırılabilir

Bir docker konteyneri çalıştırdığınızda aşağıdaki çıktıyı görmelisiniz:

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

Not: Apparmor, varsayılan olarak konteynere verilen yetenek ayrıcalıklarını bile engelleyecektir. Örneğin, SYS_ADMIN yeteneği verilse bile, /proc içine yazma iznini engelleyebilecektir çünkü varsayılan olarak docker apparmor profili bu erişimi reddeder:

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 kısıtlamalarını atlamak için apparmor'u devre dışı bırakmanız gerekmektedir:

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

Not: Varsayılan olarak AppArmor, SYS_ADMIN yeteneğiyle bile içeriden klasörleri bağlamayı yasaklar.

Not: Docker konteynerine yetenekler ekleyebilir/çıkarabilirsiniz (bu, AppArmor ve Seccomp gibi koruma yöntemleri tarafından hala kısıtlanır):

  • --cap-add=SYS_ADMIN SYS_ADMIN yeteneği verir
  • --cap-add=ALL tüm yetenekleri verir
  • --cap-drop=ALL --cap-add=SYS_PTRACE tüm yetenekleri kaldırır ve sadece SYS_PTRACE yeteneğini verir

{% hint style="info" %} Genellikle, bir docker konteyneri içinde bir ayrıcalıklı yetenek olduğunu fark ettiğinizde ancak saldırının bazı kısımlarının çalışmadığını görürseniz, bunun nedeni docker apparmor'ın bunu engellemesidir. {% endhint %}

Örnek

(buradan alınan örnek)

AppArmor işlevselliğini göstermek için aşağıdaki satırı içeren yeni bir Docker profilü "mydocker" oluşturdum:

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

Profil'i etkinleştirmek için aşağıdaki adımları izlememiz gerekmektedir:

sudo apparmor_parser -r -W mydocker

Profilleri listelemek için aşağıdaki komutu kullanabiliriz. Aşağıdaki komut, yeni AppArmor profilimi listeliyor.

$ sudo apparmor_status  | grep mydocker
mydocker

Aşağıda gösterildiği gibi, "AppArmor" profilinin "/etc/" dizinine yazma erişimini engellediği için "AppArmor" profili değiştirilmeye çalışıldığında hata alırız.

$ docker run --rm -it --security-opt apparmor:mydocker -v ~/haproxy:/localhost busybox chmod 400 /etc/hostname
chmod: /etc/hostname: Permission denied

AppArmor Docker Bypass1

Bir konteynerin hangi apparmor profili çalıştırdığını bulmak için şunu kullanabilirsiniz:

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

Ardından, aşağıdaki satırı çalıştırarak kullanılan kesin profilin bulunmasını sağlayabilirsiniz:

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

Eğer apparmor docker profilini değiştirip yeniden yükleyebilirseniz, sınırlamaları kaldırabilir ve onları "atlayabilirsiniz".

AppArmor Docker Atlatma2

AppArmor, yol tabanlıdır, bu da demektir ki /proc gibi bir dizin içindeki dosyaları koruyor olsa bile, konteynerin nasıl çalıştırılacağını yapılandırabilirseniz, ana bilgisayarın proc dizinini /host/proc içine bağlayabilir ve bu şekilde AppArmor tarafından korunmaz.

AppArmor Shebang Atlatma

Bu hatada, belirli kaynaklarla perl'in çalışmasını engellemenize rağmen, sadece bir kabuk betiği oluşturup ilk satırda #!/usr/bin/perl belirtirseniz ve dosyayı doğrudan çalıştırırsanız, istediğinizi çalıştırabilirsiniz. Örneğin:

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
AWS hacklemeyi sıfırdan kahraman olmak için htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'i desteklemenin diğer yolları: