Відкритий Docker-демон

Відкритий 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-демон

Відкритий Docker-демон — Кроки навчання

  1. Читання публічної сторінки статусу

    Bob нікуди не проникав. Він сидить за власним ноутбуком і читає публічну сторінку операційного стану Palliston. Вона покликана запевнити клієнтів, що платформа працює справно, і при цьому називає продакшн-ноди, їхні публічні IP-адреси та Docker-рушій, який працює на кожній з них. Погляньте, що саме вона розкриває, перш ніж Bob скористається цим.

  2. Рядок, який каже забагато

    Досить одного рядка. Публічна IP-адреса продакшн-ноди та факт, що на ній працює Docker, — це все, що потрібно Bob, щоб спробувати найдешевшу з можливих атак.

  3. Постукати в демон

    Docker-демону можна вказати слухати мережевий порт замість лише локального сокета. Коли це зроблено, а TLS вимкнено, він відповідає будь-кому. Bob спрямовує власний Docker CLI на порт 2375 цієї ноди і ставить найнешкідливіше з можливих питань: яка твоя версія. Якщо демон відповідає, гру вже програно.

  4. Прочитати продакшн-флот

    Docker API — це далеко не вузька річ. Він перелічує, запускає, зупиняє та збирає контейнери, і робить усе це від імені root. Перший крок Bob із ним — просто подивитися: що насправді працює на цьому хості.

  5. Змонтувати хост, забрати секрети

    Bob не потрібно зламувати контейнери, що вже працюють. Демон запустить для нього абсолютно новий, і змонтує все, що той попросить. Він просить змонтувати всю кореневу файлову систему хоста у /host, а потім читає продакшн-файл оточення прямо через це монтування. Контейнер належить йому. Хост — під ним. Стіни між ними не було ніколи.

  6. Що зробило це можливим

    Один момент на механізм, перш ніж почнеться реагування.

  7. Демон фіксує в логах незнайомця

    Palliston надсилає логи Docker-демона в центральний колектор. Щоб помітити те, що там з'явилося, не потрібна навіть система виявлення вторгнень: виклики API до демона на ops-node-01 з IP-адреси, яка нікому в Palliston не належить.

  8. Підтвердити, що двері відкриті

    Перш ніж щось змінювати, Alice відтворює те, що описують логи. Якщо неавтентифікований запит версії з її власної машини отримує відповідь, демон відкритий саме так, як і побоювалася Priya.

  9. Відкрити конфігурацію демона

    Поведінка демона задається в одному файлі — /etc/docker/daemon.json. Те, що змусило його слухати мережу без TLS, — це рядок саме тут.

  10. Знайти, що відкрило порт

    Два налаштування, поруч одне з одним, і є всією причиною відкритості. Одне виставляє API в мережу; інше каже йому не перевіряти, хто дзвонить.