
Аккуратный Go-сервис на net/http с единственной ручкой /time. Обновляем одну библиотеку через go get, не трогая свой код. После рестарта в сервисе появляется ручка /__injected, которая отдаёт строки из памяти процесса. Мы её не регистрировали — а пакет, который это сделал, формально даже не используется.
Разбираю шаг за шагом, как такое возможно: модель зависимостей Go и коварство //indirect, тихий вход через init(), сканирование кучи и unsafe. Pointer для поиска ServeMux в работающем сервере. И, конечно, как от этого защищаться — от аудита зависимостей до seccomp и read-only ФС.
Весь код — в репозитории, «вредонос» написан в учебных целях. Запускать только в песочнице.
Разобрать «вредоноса»Источник: Хабрахабр
Источник: nullptrdereference
Другие материалы на сайте b.Z - Записки о гаджетах, людях и музыке