Привілейовані контейнери

Привілейовані контейнери

A container runs as root with the host filesystem mounted, so code execution inside it becomes control of the host. Perform the escape, then fix it with a non-root user, dropped capabilities, and no privileged flag.

Що таке Привілейовані контейнери?

За замовчуванням контейнер не є межею безпеки. Процес, що працює від root усередині контейнера, — це root і для ядра хоста, а привілейований контейнер з підключеним хостовим томом може записувати будь-де на машині, на якій він працює. У цій вправі розглядається втеча з контейнера: подивіться, як зловмисник перетворює виконання коду всередині контейнера на контроль над хостом, а потім виконайте справжнє виправлення — непривілейований користувач, скинуті можливості (capabilities) та файлова система root лише для читання.

Що ви дізнаєтесь у Привілейовані контейнери

Привілейовані контейнери — Кроки навчання

  1. Оболонка в контейнері

    Боб атакує Vosswark, логістичну платформу, чий медіасервіс змінює розмір і перекодовує завантажені клієнтами файли. Незалатана бібліотека обробки зображень у цьому сервісі дала йому віддалене виконання коду, і тепер у нього є оболонка, що працює всередині нього. Як він потрапив усередину — не найцікавіша частина. Цікаво те, що йому дозволяє зробити далі контейнер.

  2. Хто я і що я можу

    Два питання визначають, чи стане цей плацдарм глухим кутом, чи дверима: від якого користувача працює процес і що ядро дозволить робити цьому користувачу. Один файл відповідає на обидва.

  3. Що насправді дав режим privileged

    Привілейований режим означає, що звичайні обмеження не застосовуються. Боб перевіряє найцінніше, що може з цього випливати: чи було щось від хоста передано контейнеру напряму.

  4. Забрати ключ хоста

    Контейнер був лише засобом досягнення мети. Те, що потрібно Бобу, знаходиться на машині під ним, в одному каталозі, який перетворює один скомпрометований хост на плацдарм у всьому парку машин.

  5. Що зробило втечу можливою

    Момент на розбір механізму, перш ніж підбити підсумки завданої шкоди.

  6. Залишити спосіб повернутися

    Прочитати ключ — це крадіжка. Записати на хост — це закріплення (persistence). Оскільки том підключено не лише для читання, Боб може дописати свій власний публічний ключ до authorized_keys хоста, і відтоді вкрадений ключ йому взагалі не потрібен. Додавання нічого не виводить, точно так само, як і в справжній оболонці. Ця тиша і є суттю: ніщо тут не виглядає як атака.

  7. Порахуйте, чого досяг один контейнер

    Тепер Боб має власний ключ хоста і підкинув поруч свій. Медіаобробник був сервісом низької цінності, що обробляв завантаження клієнтів. Але, з огляду на конфігурацію, він також був маршрутом до кожної машини, яка довіряє цьому ключу, і дверима, які Боб може відчинити знову в будь-який момент.

  8. Хост фіксує читання файлу

    Vosswark використовує моніторинг цілісності файлів на своїх хостах. Йому байдуже, який саме контейнер щось зробив; він повідомляє, що власний ключовий матеріал хоста було прочитано.

  9. Погляньте, як його було запущено

    Dockerfile описує, що всередині образу. Він нічого не каже про прапорці, з якими було запущено контейнер, а саме в них і криється цей інцидент. Відповісти на це може лише хост.

  10. Відкриття Dockerfile

    Виправити потрібно дві частини, і вони живуть у різних файлах. Образ визначає, від чийого імені працює процес; розгортання визначає, до чого цьому процесу дозволено торкатися. Почніть з образу.