Шкідливі базові образи
A lookalike base image on a public registry reaches production and calls home. Trace it back to the FROM line, then fix it with an internal mirror, verified publishers, and signature verification at pull time.
Що таке Шкідливі базові образи?
Будь-хто може опублікувати образ у публічному реєстрі під назвою, схожою на ту, якій ви довіряєте. Без перевірки підпису рядок FROM — це просто рядок тексту, і збірка, що обробляє цей рядок, запустить усе, що завантажить. Ця вправа розглядає ворожий базовий образ, що дістався продакшну: подивіться, як зловмисник закладає його та збирає те, що той надсилає, а потім виправте це за допомогою верифікованих видавців, внутрішнього дзеркала та перевірки підпису під час завантаження.
Що ви дізнаєтесь у Шкідливі базові образи
- Він перетворює назву на те, що фактично віддає реєстр, тому без перевірки ви довіряєте рядку тексту, а не видавцю.
- Це захищає від зміни образу після того, як ви його перевірили, але не від закріплення ворожого образу із самого початку. Вам усе одно потрібно перевірити, хто його опублікував.
- Сканування повідомляє про відомі вразливості; підпис повідомляє, що образ походить від очікуваного видавця й не був підмінений.
- Той образ був легітимним, але застарілим. Цей же образ був ворожим із самого початку, тому патчити його безглуздо, і виправлення стосується походження образу.
Шкідливі базові образи — Кроки навчання
-
Назва, що відрізняється на один символ
Боб нікуди не зламується. Він публікує. У публічному хабі образів будь-хто може завантажити (push) репозиторій, і він завантажив один під простором імен, що читається майже так само, як офіційний базовий образ Node.js. Потім він чекає, доки якась збірка десь помилково не завантажить його.
-
Замасковано під оригінал
Репозиторій Боба з'являється в результатах пошуку одразу під справжнім, з таким самим слоганом і пристойною кількістю завантажень. Єдина різниця — це та частина, яку поспішний інженер пропускає поглядом.
-
Що він насправді постачав
Схожий образ Боба — це не перепакований образ Node з новою етикеткою. Він зібрав його на основі справжнього образу й додав один рядок. Ось Dockerfile базового образу, який він опублікував.
-
Рядок, який виконує всю роботу
Усе, що вище цього рядка, — звичайний базовий образ Node.js. Один RUN, замаскований під невинний коментар, перетворює його на зброю.
-
Подивіться, як спрацьовує корисне навантаження
Базовий образ виглядає і поводиться як звичайний образ Node.js, тому збірка на його основі проходить успішно, а застосунок на ньому запускається. Але доданий Бобом шар завантажує й запускає корисне навантаження в момент старту контейнера. Він одноразово запускає власний базовий образ, щоб переконатися, що навантаження все ще спрацьовує.
-
Скористайтеся входом
Збірка Marlspire вийшла на основі його базового образу, і закладений імплант зв'язався з ним. Бобу більше не потрібно зламуватися: у нього вже є оболонка всередині їхнього продакшн-контейнера. Він доручає їй передати все, до чого вона має доступ.
-
Що зробило це можливим
Один момент на механізм, перш ніж почнеться реагування.
-
Хост повідомляє про майнер
Marlspire використовує моніторинг кінцевих точок на своїх хостах контейнерів. Йому байдуже, що контейнер має робити; він повідомляє про те, що побачив.
-
Перегляньте шари образу
Образ фіксує, як його було зібрано, — по одній команді на шар. Якщо майнер встановлює сам себе, якийсь шар мав виконати команду, що його завантажила. Аліса переглядає історію збірки випущеного образу.
-
Звідки взявся базовий образ
Отрута міститься в базовому образі, тож питання в тому, у якому саме. Аліса перевіряє двох кандидатів у публічному хабі, порівнюючи їх поруч.