Ви працюєте в кібербезпеці компанії? Хочете побачити вашу компанію рекламовану на HackTricks? або хочете мати доступ до останньої версії PEASS або завантажити HackTricks у PDF? Перевірте ПЛАНИ ПІДПИСКИ!
Відкрийте для себе Сім'ю PEASS, нашу колекцію ексклюзивних NFT
Коли ви запускаєте контейнер з привілейованими правами, ви вимикаєте наступні заходи захисту:
Монтування /dev
У привілейованому контейнері всі пристрої можна отримати доступ до /dev/. Тому ви можете вийти за допомогою монтування диска хоста.
# docker run --rm -it alpine shls/devconsolefdmqueueptmxrandomstderrstdouturandomcorefullnullptsshmstdinttyzero
# docker run --rm --privileged -it alpine shls/devcachefilesmapperportshmtty24tty44tty7consolemempsauxstderrtty25tty45tty8coremqueueptmxstdintty26tty46tty9cpunbd0ptsstdouttty27tty47ttyS0[...]
Файлові системи ядра лише для читання
Файлові системи ядра надають механізм для процесу зміни поведінки ядра. Однак, коли мова йде про процеси контейнера, ми хочемо запобігти їм вносити будь-які зміни до ядра. Тому ми монтуємо файлові системи ядра як тільки для читання всередині контейнера, забезпечуючи, що процеси контейнера не можуть змінювати ядро.
# docker run --rm --privileged -it alpine shmount|grep'(ro'
Маскування файлових систем ядра
Файлова система /proc є вибірково записуваною, але з метою безпеки певні частини захищені від запису та читання шляхом накладання на них tmpfs, що гарантує, що процеси контейнера не зможуть отримати доступ до чутливих областей.
tmpfs - це файлова система, яка зберігає всі файли у віртуальній пам'яті. tmpfs не створює жодних файлів на вашому жорсткому диску. Тому якщо відмонтувати файлову систему tmpfs, всі файли, які в ній знаходяться, будуть втрачені назавжди.
# docker run --rm -it alpine shmount|grep/proc.*tmpfstmpfson/proc/acpitypetmpfs (ro,relatime)tmpfson/proc/kcoretypetmpfs (rw,nosuid,size=65536k,mode=755)tmpfson/proc/keystypetmpfs (rw,nosuid,size=65536k,mode=755)
# docker run --rm --privileged -it alpine shmount|grep/proc.*tmpfs
Linux можливості
Двигуни контейнерів запускають контейнери з обмеженою кількістю можливостей, щоб контролювати те, що відбувається всередині контейнера за замовчуванням. Привілейовані мають всіможливості доступні. Щоб дізнатися більше про можливості, прочитайте:
# docker run --rm -it alpine shapkadd-Ulibcap; capsh--print[...]Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=eip
Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
[...]
# docker run --rm --privileged -it alpine shapkadd-Ulibcap; capsh--print[...]Current:=eipcap_perfmon,cap_bpf,cap_checkpoint_restore-eipBounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read
[...]
Ви можете маніпулювати можливостями, доступними для контейнера, не запускаючи його в режимі --privileged, використовуючи прапорці --cap-add та --cap-drop.
Seccomp
Seccomp корисний для обмеження системних викликів (syscalls), які може викликати контейнер. За замовчуванням профіль seccomp увімкнено при запуску контейнерів Docker, але в привілейованому режимі він вимкнений. Дізнайтеся більше про Seccomp тут:
# docker run --rm -it alpine shgrepSeccomp/proc/1/statusSeccomp:2Seccomp_filters:1
# docker run --rm --privileged -it alpine shgrepSeccomp/proc/1/statusSeccomp:0Seccomp_filters:0
# You can manually disable seccomp in docker with--security-optseccomp=unconfined
Також слід зауважити, що коли Docker (або інші CRIs) використовуються в кластері Kubernetes, фільтр seccomp вимкнений за замовчуванням
AppArmor
AppArmor - це покращення ядра для обмеження контейнерів до обмеженого набору ресурсів з профілями для кожної програми. Коли ви запускаєте з прапорцем --privileged, цей захист вимкнений.
# You can manually disable seccomp in docker with--security-optapparmor=unconfined
SELinux
Запуск контейнера з флагом --privileged вимикає мітки SELinux, що призводить до успадкування мітки контейнерним двигуном, зазвичай unconfined, надаючи повний доступ, схожий на контейнерний двигун. У режимі без кореня використовується container_runtime_t, тоді як у режимі кореня застосовується spc_t.
# You can manually disable selinux in docker with--security-optlabel:disable
Чого Не Впливає
Простори Імен
Простори імен НЕ піддаються впливу прапорця --privileged. Навіть якщо вони не мають увімкнених обмежень безпеки, вони не бачать всі процеси на системі або мережу хоста, наприклад. Користувачі можуть вимкнути окремі простори імен, використовуючи прапорці двигуна контейнера --pid=host, --net=host, --ipc=host, --uts=host.
# docker run --rm --privileged -it alpine shps-efPIDUSERTIMECOMMAND1root0:00sh18root0:00ps-ef
За замовчуванням, контейнерні двигуни не використовують простори користувачів, за винятком безкореневих контейнерів, які потребують їх для монтування файлової системи та використання кількох UID. Простори користувачів, які є невід'ємними для безкореневих контейнерів, не можуть бути вимкнені і значно підвищують безпеку, обмежуючи привілеї.
Ви працюєте в кібербезпеці? Хочете побачити вашу компанію в рекламі на HackTricks? або хочете мати доступ до останньої версії PEASS або завантажити HackTricks у PDF? Перевірте ПЛАНИ ПІДПИСКИ!
Дізнайтеся про Сім'ю PEASS, нашу колекцію ексклюзивних NFT