Всем привет!
Достаточно интересную уязвимость обнаружил Автор статьи. Все началось с того, что он решил написать политику, которая бы «выбирала» ресурсы с параметром
deletionTimestamp (кто знает зачем такая политика, но…). В итоге оказалось, что Kyverno игнорирует подобные запросы.Можно ли как-то использовать это? Чтобы ответить на этот вопрос надо понимать, что происходит при операции
DELETE — это очень подробно и доступно описано в статье. И все равно поначалу ничего не получалось – изменить что-либо в .spec почти нельзя, а некоторые изменения и о вовсе игнорируются при удалении ресурса.Однако, не все ограничивается
pod и их «обертками». В итоге Автор остановился на Service и реализовал следующий алгоритм:🍭 Создал вполне легитимный
Service типа ClusterIP🍭 Добавил несуществующий finalizer, чтобы удаление происходило бесконечно
🍭 В момент удаления изменил тип сервиса на
NodePort. При этом блокирующая (Enforce) политика Kyverno не обратила на это внимание🍭 Получил доступ через «созданный» NodePort
Таким образом, через finalizers успешно был реализован обход enforce-политики Kyverno. В версиях 1.10+ указанный недостаток уже устранен. Очень рекомендуем статью к прочтению, чтобы лучше разобраться в том, как работает Kubernetes и Kyverno ☺️