Секрети в шарах образів
A private package-index token is baked into a public container image and survives the RUN that deletes it. Read it out of the layer history like an attacker would, then rotate the credential and rebuild so the secret never enters a layer.
Що таке Секрети в шарах образів?
Секрет не зникає з образу, коли Dockerfile видаляє його. Шари образу можна лише додавати, тому облікові дані, передані в одній команді RUN, назавжди записуються в цей шар, а наступна команда RUN, яка видаляє файл, лише додає новий шар зверху. У цій вправі розглядається токен приватного індексу пакетів, запечений у публічний образ: подивіться, як зловмисник зчитує його прямо з історії шарів і використовує, а потім виконайте справжнє виправлення. Спочатку відкличте облікові дані, щоб зробити витік значення непридатним, а потім перезберіть образ так, щоб секрет узагалі ніколи не потрапляв у шар.
Що ви дізнаєтесь у Секрети в шарах образів
- Так. Шари можна лише додавати, тому шар, що додав токен, досі його містить, а видалення лише додає новий шар зверху.
- Замінити облікові дані, бо скомпрометоване значення залишається дійсним, доки його не відкликати, незалежно від того, що ви зробите з образом.
- Вона обрізає стовпець CREATED BY, тому довга команда RUN обрізається ще до тієї частини, що містить облікові дані.
- Секретне монтування BuildKit або багатоетапна збірка, завдяки чому облікові дані доступні під час збірки, але ніколи не записуються в шар, що постачається.
Секрети в шарах образів — Кроки навчання
-
Оцінка цілі
Сьогодні Боб атакує Cindralt, платіжну компанію, чий сервіс розрахунків постачається у вигляді образу контейнера. Він починає з того, з чого може почати будь-хто: власного реєстру контейнерів компанії. Опублікований образ — зручна ціль для атаки. Це точнісінько той артефакт, що працює у продакшені, а завантажити його нічого не коштує.
-
Завантажити може будь-хто
Репозиторій опубліковано для анонімного завантаження. Для багатьох компаній це свідомий вибір, а не вразливість сама по собі, але це означає, що артефакт доступний Бобу на тих самих умовах, що й власним серверам збірки Cindralt.
-
Завантаження образу
Боб завантажує тег, який реєстр позначає як latest. На його машину потрапляє побайтова копія того, що Cindralt запускає в продакшені, включно з кожним шаром, створеним у процесі збірки.
-
Читання історії збірки
Кожен образ несе в собі команди, якими його було зібрано. Бобу не потрібно запускати контейнер чи щось розпаковувати: історія шарів — це метадані, і вона надходить разом із завантаженням. На перший погляд ця збірка виглядає акуратною. Хтось навіть прибрав за собою після встановлення залежностей.
-
Запит повної команди
Таблиця за замовчуванням побудована так, щоб влізти в термінал, а не щоб показувати правду. Боб запитує команди збірки окремо, без жодного обрізання. Команда встановлення записала облікові дані у файл конфігурації, і вони досі лежать у шарі, який ця команда створила.
-
Чому видалення не допомогло
Момент на розбір механізму, перш ніж Боб використає знайдене.
-
Перевірка, що відкриває токен
Цінність облікових даних визначається тим, до чого вони дають доступ. Боб запитує в індексу пакетів Cindralt, кому належить цей токен і що йому дозволено робити. Відповідь гірша, ніж один сервіс. Токен дозволяє публікувати будь-який пакет, проти якого збирається Cindralt, і він ніколи не закінчується.
-
Чого вартий цей токен
Бобу більше не потрібно торкатися серверів Cindralt. Маючи права публікації на кожен пакет, проти якого збирається компанія, наступну версію будь-якої внутрішньої бібліотеки може створити він, і її завантажить кожна збірка, яка запуститься після цього.
-
Індекс фіксує публікацію
Індекс пакетів Cindralt логує кожен автентифікований виклик. Уночі він зафіксував використання токена ci-publisher з адреси, яка нікому в компанії не належить.
-
Підтвердження за образом
Аліса самостійно перевіряє це твердження на опублікованому артефакті, використовуючи саме те, що мав би сторонній зловмисник: публічний тег і стандартний клієнт Docker.