Pull to refresh
8K+
6
Дмитрий Титов@nullptrdereference

User

21
Rating
3
Subscribers
Send message

Как незаметная indirect-зависимость в Go дописала ручку в ваш HTTP-сервер

Level of difficultyMedium
Reading time13 min
Reach and readers12K

Аккуратный Go-сервис на net/http с единственной ручкой /time. Обновляем одну библиотеку через go get, не трогая свой код. После рестарта в сервисе появляется ручка /__injected, которая отдаёт строки из памяти процесса. Мы её не регистрировали — а пакет, который это сделал, формально даже не используется.

Разбираю шаг за шагом, как такое возможно: модель зависимостей Go и коварство //indirect, тихий вход через init(), сканирование кучи и unsafe. Pointer для поиска ServeMux в работающем сервере. И, конечно, как от этого защищаться — от аудита зависимостей до seccomp и read-only ФС.

Весь код — в репозитории, «вредонос» написан в учебных целях. Запускать только в песочнице.

Разобрать «вредоноса»

Information

Rating
423-rd
Location
Россия
Date of birth
Registered
Activity

Specialization

Бэкенд разработчик, Архитектор программного обеспечения
Ведущий
From 10,000 $
Linux
PostgreSQL
Docker
MySQL
REST
Golang
Apache Kafka
WebSockets