Відкритий Docker-демон
A Docker daemon answering on the network without TLS is remote root on the host. Take a machine through the exposed API, then lock it down with TLS, client certificates, and a scoped socket proxy.
Що таке Відкритий Docker-демон?
API Docker еквівалентний правам root і постачається без будь-якої автентифікації. Демон, прив'язаний до мережевого порту без TLS, дозволяє будь-кому, хто може до нього достукатися, запускати контейнери, монтувати хост і читати будь-що на машині. Монтування сокета демона в контейнер надає цьому контейнеру ту саму владу. Ця вправа охоплює обидва випадки: подивіться, як зловмисник захоплює хост через відкритий демон, а потім захистіть його за допомогою TLS, клієнтських сертифікатів та обмеженого проксі для сокета.
Що ви дізнаєтесь у Відкритий Docker-демон
- Будь-хто, хто може дотягнутися до API, може запустити контейнер, який монтує файлову систему хоста, що дає повний доступ на читання та запис до машини.
- Ні. Сокет — це той самий еквівалентний root API, тому будь-яка компрометація цього контейнера стає компрометацією хоста.
- TLS із взаємною автентифікацією за клієнтськими сертифікатами або обмежений проксі, що дозволяє лише конкретні виклики API, потрібні тому, хто звертається.
- Та атака спершу потребує виконання коду всередині контейнера. Ця ж — віддалена й неавтентифікована, тому зловмиснику не потрібне жодне початкове закріплення.
Відкритий Docker-демон — Кроки навчання
-
Читання публічної сторінки статусу
Bob нікуди не проникав. Він сидить за власним ноутбуком і читає публічну сторінку операційного стану Palliston. Вона покликана запевнити клієнтів, що платформа працює справно, і при цьому називає продакшн-ноди, їхні публічні IP-адреси та Docker-рушій, який працює на кожній з них. Погляньте, що саме вона розкриває, перш ніж Bob скористається цим.
-
Рядок, який каже забагато
Досить одного рядка. Публічна IP-адреса продакшн-ноди та факт, що на ній працює Docker, — це все, що потрібно Bob, щоб спробувати найдешевшу з можливих атак.
-
Постукати в демон
Docker-демону можна вказати слухати мережевий порт замість лише локального сокета. Коли це зроблено, а TLS вимкнено, він відповідає будь-кому. Bob спрямовує власний Docker CLI на порт 2375 цієї ноди і ставить найнешкідливіше з можливих питань: яка твоя версія. Якщо демон відповідає, гру вже програно.
-
Прочитати продакшн-флот
Docker API — це далеко не вузька річ. Він перелічує, запускає, зупиняє та збирає контейнери, і робить усе це від імені root. Перший крок Bob із ним — просто подивитися: що насправді працює на цьому хості.
-
Змонтувати хост, забрати секрети
Bob не потрібно зламувати контейнери, що вже працюють. Демон запустить для нього абсолютно новий, і змонтує все, що той попросить. Він просить змонтувати всю кореневу файлову систему хоста у /host, а потім читає продакшн-файл оточення прямо через це монтування. Контейнер належить йому. Хост — під ним. Стіни між ними не було ніколи.
-
Що зробило це можливим
Один момент на механізм, перш ніж почнеться реагування.
-
Демон фіксує в логах незнайомця
Palliston надсилає логи Docker-демона в центральний колектор. Щоб помітити те, що там з'явилося, не потрібна навіть система виявлення вторгнень: виклики API до демона на ops-node-01 з IP-адреси, яка нікому в Palliston не належить.
-
Підтвердити, що двері відкриті
Перш ніж щось змінювати, Alice відтворює те, що описують логи. Якщо неавтентифікований запит версії з її власної машини отримує відповідь, демон відкритий саме так, як і побоювалася Priya.
-
Відкрити конфігурацію демона
Поведінка демона задається в одному файлі — /etc/docker/daemon.json. Те, що змусило його слухати мережу без TLS, — це рядок саме тут.
-
Знайти, що відкрило порт
Два налаштування, поруч одне з одним, і є всією причиною відкритості. Одне виставляє API в мережу; інше каже йому не перевіряти, хто дзвонить.