Привілейовані контейнери
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 лише для читання.
Що ви дізнаєтесь у Привілейовані контейнери
- Ізоляція контейнера — це набір функцій ядра, а не межа безпеки. Root у контейнері — це root у ядрі хоста, тому будь-яка прогалина в цій ізоляції одразу стає придатною для експлуатації.
- Фактично всі capabilities та доступ до пристроїв хоста, що усуває більшу частину того, що відокремлює контейнер від хоста.
- Запускати від імені не-root користувача, скидати capabilities та припинити передавати --privileged і монтування хоста.
- Зловмисник, який отримав виконання коду, не може записати в контейнер інструменти чи механізми закріплення, тому розвинути отримане закріплення значно складніше.
Привілейовані контейнери — Кроки навчання
-
Оболонка в контейнері
Боб атакує Vosswark, логістичну платформу, чий медіасервіс змінює розмір і перекодовує завантажені клієнтами файли. Незалатана бібліотека обробки зображень у цьому сервісі дала йому віддалене виконання коду, і тепер у нього є оболонка, що працює всередині нього. Як він потрапив усередину — не найцікавіша частина. Цікаво те, що йому дозволяє зробити далі контейнер.
-
Хто я і що я можу
Два питання визначають, чи стане цей плацдарм глухим кутом, чи дверима: від якого користувача працює процес і що ядро дозволить робити цьому користувачу. Один файл відповідає на обидва.
-
Що насправді дав режим privileged
Привілейований режим означає, що звичайні обмеження не застосовуються. Боб перевіряє найцінніше, що може з цього випливати: чи було щось від хоста передано контейнеру напряму.
-
Забрати ключ хоста
Контейнер був лише засобом досягнення мети. Те, що потрібно Бобу, знаходиться на машині під ним, в одному каталозі, який перетворює один скомпрометований хост на плацдарм у всьому парку машин.
-
Що зробило втечу можливою
Момент на розбір механізму, перш ніж підбити підсумки завданої шкоди.
-
Залишити спосіб повернутися
Прочитати ключ — це крадіжка. Записати на хост — це закріплення (persistence). Оскільки том підключено не лише для читання, Боб може дописати свій власний публічний ключ до authorized_keys хоста, і відтоді вкрадений ключ йому взагалі не потрібен. Додавання нічого не виводить, точно так само, як і в справжній оболонці. Ця тиша і є суттю: ніщо тут не виглядає як атака.
-
Порахуйте, чого досяг один контейнер
Тепер Боб має власний ключ хоста і підкинув поруч свій. Медіаобробник був сервісом низької цінності, що обробляв завантаження клієнтів. Але, з огляду на конфігурацію, він також був маршрутом до кожної машини, яка довіряє цьому ключу, і дверима, які Боб може відчинити знову в будь-який момент.
-
Хост фіксує читання файлу
Vosswark використовує моніторинг цілісності файлів на своїх хостах. Йому байдуже, який саме контейнер щось зробив; він повідомляє, що власний ключовий матеріал хоста було прочитано.
-
Погляньте, як його було запущено
Dockerfile описує, що всередині образу. Він нічого не каже про прапорці, з якими було запущено контейнер, а саме в них і криється цей інцидент. Відповісти на це може лише хост.
-
Відкриття Dockerfile
Виправити потрібно дві частини, і вони живуть у різних файлах. Образ визначає, від чийого імені працює процес; розгортання визначає, до чого цьому процесу дозволено торкатися. Почніть з образу.