24.10.2021

Во FreeBSD 13 чуть не оказалась халтурная реализация WireGuard с нарушением лицензии и уязвимостями

Из кодовой базы, на основе которой формировался релиз FreeBSD 13, был со скандалом удалён код с реализацией протокола VPN WireGuard, разработанной по заказу компании Netgate без консультаций с разработчиками оригинального WireGuard, и уже включённой в стабильные выпуски дистрибутива pfSense. После проверки кода Джейсоном Доненфилдом (Jason A. Donenfeld), автором оригинального WireGuard, выяснилось, что предложенная для FreeBSD реализация WireGuard представляла собой образец низкосортного кода, изобилующего переполнениями буфера и нарушающего лицензию GPL.

В реализации были найдены катастрофические огрехи в коде криптографии, была пропущена часть протокола WireGuard, присутствовали ошибки, приводившие к краху ядра и обходу методов защиты, для входных данных использовались буферы фиксированного размера. О качестве кода много говорит наличие заглушек вместо проверок, всегда возвращающих значение «true», а также забытые отладочные printf с выводом параметров, используемых для шифрования, и применение функции sleep для предотвращения состояний гонки.

Некоторые части кода, такие как функция crypto_xor, в нарушение лицензии GPL, были перенесены из реализации WireGuard, разработанной для Linux. В итоге Джейсон Доненфилд вместе с Кайлом Эвансом (Kyle Evans) и Мэттом Данвуди (Matt Dunwoodie, автор порта WireGuard для OpenBSD), взялись за переделку проблемной реализации и за неделю полностью заменили весь код разработчика, нанятого Netgate. Переделанный вариант выпущен отдельным набором патчей, размещён в репозитории проекта WireGuard и пока не вошёл в состав FreeBSD.

Интересно, что изначально ничто не предвещало беды, компания Netgate, которая желала получить возможность использования WireGuard в дистрибутиве pfSense, наняла Мэттью Мэйси (Matthew Macy), хорошо разбирающегося в ядре и сетевом стеке FreeBSD, участвующего в исправлении ошибок и имеющего опыт разработки сетевых драйверов для данной операционной системы. Мэйси был предоставлен свободный график без дедлайнов и промежуточных проверок. Разработчики, пересекавшиеся с Мэйси при работе над FreeBSD, характеризовали его как талантливого и профессионального программиста, допускающего не больше ошибок чем другие и адекватно реагирующего на критику. Плачевное качество кода реализации WireGuard для FreeBSD стало для них неожиданностью.

После 9 месяцев работы в декабре прошлого года Мэйси без завершения рецензирования и тестирования сторонними участниками добавил свою реализацию в ветку HEAD, которая использовалась для формирования релиза FreeBSD 13. Разработка была выполнена без связи с разработчиками оригинального WireGuard и портов для OpenBSD и NetBSD. В феврале компания Netgate интегрировала WireGuard в стабильный выпуск pfSense 2.5.0 и начала поставку в межсетевых экранах на его основе. После выявления проблем код WireGuard был удалён из pfSense.

В добавленном коде были выявлены критические уязвимости, которые были использованы в 0-day эксплоитах, но Netgate первое время не признавала наличие уязвимостей и пыталась обвинить разработчика оригинального WireGuard в нападках и предвзятости, что негативно отразилось на её репутации. Разработчик порта вначале отвергал претензии к качеству кода и считал их преувеличенными, но после демонстрации ошибок, обратил внимание на то, что действительно важной проблемой является отсутствие должного рецензирования качества кода во FreeBSD, ведь проблемы оставались не замеченными многие месяцы (представители Netgate указали, что публичное рецензирование было запущено ещё в августе 2020 года, но отдельные разработчики FreeBSD отметили, что в Phabricator рецензирование было закрыто Мэйси без выполнения и с игнорированием комментариев). Команда FreeBSD Core Team отреагировала на инцидент обещанием модернизировать процессы проверки кода.

Мэттью Мэйси, разработчик проблемного порта для FreeBSD, прокомментировал ситуацию тем, что совершил большую ошибку взявшись за работу, будучи не готовым реализовать данный проект. Получившийся результат Мэйси объясняет эмоциональным выгоранием и результатом проблем, возникших из-за постковидного синдрома. При этом Мэйси не нашёл решимости отказаться от уже взятых на себя обязательств и попытался довести проект до конца.

На состояние Мэйси также мог повлиять недавний тюремный срок, который он получил за незаконные действия в попытке выселения жильцов из купленного им дома, не желающих съезжать добровольно. Вместо с женой они подпилили балки перекрытия и проломали отверстия в полах, чтобы сделать дом непригодным для проживания, а также подделали угрожающие письма от имени жильцов. Для того, чтобы избежать ответственности за совершённые действия, Мэйси с женой сбежал в Италию, но был экстрадирован в США и отсидел более четырёх лет в тюрьме.

Источник.