Більшість шкідливих релізів Composer виявляють та видаляють протягом перших двох днів після появи. Heimdall, плагін від Encore Digital Group, використовує цю особливість: він просто змушує ваш проєкт зачекати. Ви встановлюєте кількість днів, і плагін блокує інсталяцію версій, молодших за цей термін. Назва відсилає до скандинавського вартового Геймдалля, який охороняв міст до Асґарду. У цій метафорі мостом є шлях між Packagist та вашою директорією vendor/.
# Налаштування мінімального віку package
Конфігурація додається у блок extra.heimdall у вашому composer.json. Ключ minimum_age визначає кількість днів:
{
"extra": {
"heimdall": {
"minimum_age": 7
}
}
}
Тепер package, випущений три дні тому, не буде встановлено. Composer автоматично обере найсвіжішу версію, що відповідає критерію віку, і продовжить роботу. Якщо параметр minimum_age не вказано, плагін ніяк не впливатиме на процес.
# Довірені vendors та packages
Жорстке правило для всіх dependencies може створювати незручності — наприклад, затримувати ваші власні розробки або термінові security patches. Heimdall дозволяє створювати винятки для конкретних вендорів або пакетів:
{
"extra": {
"heimdall": {
"minimum_age": 7,
"trusted": {
"vendors": [
"encoredigitalgroup"
],
"packages": [
"acme/widgets"
]
}
}
}
}
Усе, що потрапляє до списку довірених вендорів або в trusted.packages, оминає перевірку віку. Решта релізів усе одно матиме «відстоятися».
# Фільтрація перед роботою solver
Heimdall працює на етапі PluginEvents::PRE_POOL_CREATE, тобто ще до запуску dependency solver. Надто нові версії просто видаляються зі списку кандидатів, тому solver їх навіть не розглядає. Як результат — ви отримуєте звичайний результат інсталяції замість помилки постфактум, а resolution залишається детермінованим.
Потрібно разово обійти правило? Команда composer install --no-plugins вимкне Heimdall разом з іншими плагінами.
# Встановлення
Для роботи потрібен PHP 8.4 або новіше та Composer 2.0 чи пізніших версій:
composer require encoredigitalgroup/heimdall
Composer запитає дозволу на запуск плагіна. Погоджуйтесь, додайте блок extra.heimdall, і політика запрацює під час наступної інсталяції чи оновлення.
# Порівняння з нативними інструментами Composer
Останнім часом Composer та Packagist суттєво посилили безпеку supply chain. У Composer 2.10 з’явився блок конфігурації policy для обробки security advisories, закинутих пакетів та шкідливого ПЗ. Packagist інтегрував систему виявлення malware Aikido та заборонив непомітне переписування стабільних версій через re-tagging. Проте всі ці заходи працюють лише тоді, коли про проблему вже стало відомо.
Компрометований release завдає найбільшої шкоди саме у перші години — до того, як з’явиться офіційне попередження чи malware-прапорець. Heimdall не чекає на репорти, він орієнтується лише на дату публікації. Packagist також згадував цей підхід у своєму звіті щодо безпеки supply chain, де мінімальний вік релізу фігурує у списку запланованих функцій.
Composer планує впровадити такий функціонал нативно. У документації вже зарезервовано назву minimum-release-age, а PR #12692 додає cooldown policy саме для таких випадків. На момент написання статті реліз цієї фічі очікується у Composer 2.11. Heimdall дозволяє реалізувати цей підхід уже зараз, до того ж він працює на версіях Composer від 2.0.
Дізнатися більше, переглянути сирці та повну інструкцію можна у репозиторії Heimdall на GitHub.