Переполнение буфера, нарушения лицензий и плохой код обращение к FreeBSD 13

40 000 строк некорректного кода почти вошли в ядро ​​FreeBSD. мы исследуем, как.

Джим Солтер. 26 марта 2021 г., 10:00 UTC

буфер, freebsd

Поэтому, когда Джим Томпсон, генеральный директор Netgate, производящей маршрутизаторы на базе FreeBSD, решил, что FreeBSD пора воспользоваться такой же поддержкой WireGuard в ядре, что и Linux, он предложил Мэйси контракт. Мэйси перенес бы WireGuard в ядро ​​FreeBSD, где Netgate могла бы затем использовать его в популярном дистрибутиве маршрутизатора pfSense. Контракт был предложен без сроков и этапов; Мэйси просто нужно было делать работу по собственному графику.

С уровнем опыта Мэйси. в частности, с кодированием ядра и сетевыми стеками. проект выглядел как беспроигрышный вариант. Но почти сразу все пошло наперекосяк. Разработчик-основатель WireGuard Джейсон Доненфельд не слышал о проекте, пока он не появился в списке рассылки FreeBSD, и Мэйси, похоже, не заинтересовала помощь Доненфельда, когда ее предложили. Примерно через девять месяцев разработки на неполной ставке Мэйси поместил свой перенос. в основном непроверенный и недостаточно протестированный. прямо в раздел HEAD репозитория кода FreeBSD, где его планировалось включить в FreeBSD 13.0-RELEASE.

Эта неожиданная фиксация подняла ставки для Доненфельда, чей проект в конечном итоге будет оцениваться по качеству любой производственной версии под названием WireGuard. Доненфельд выявил многочисленные проблемы с кодом Macy, но вместо того, чтобы возражать против выпуска порта, Доненфельд решил исправить проблемы. Он сотрудничал с разработчиком FreeBSD Кайлом Эвансом и Мэттом Данвуди, разработчиком OpenBSD, который работал над WireGuard для этой операционной системы. Эти трое заменили почти весь код Macy в безумном недельном спринте.

READ  Где Находится Буфер Обмена В Телефоне Htc

Это очень плохо обошлось с Netgate, спонсировавшей работу Macy’s. Netgate уже взяла бета-код Macy из релиз-кандидата FreeBSD 13 и запустила его в производство в версии 2.5.0 pfSense. Модернизация погрузчика, выполненная Доненфельдом и его сотрудниками, наряду с резкой характеристикой Доненфельдом кода Macy’s, поставила перед компанией серьезную проблему с общественностью.

Публичный ответ Netgate включал обвинения в «иррациональной предвзятости против mmacy и Netgate» и безответственное раскрытие «ряда эксплойтов нулевого дня». несмотря на почти одновременное заявление Netgate о том, что реальных уязвимостей не существует.

Этот боевой ответ Netgate вызвал повышенное внимание многих источников, которые раскрыли удивительные элементы собственного прошлого Мэйси. Он и его жена Николь были арестованы в 2008 году после двух лет попыток незаконного выселения жильцов из небольшого многоквартирного дома в Сан-Франциско, купленного парой.

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

Неудивительно, что история Мэйси как арендодателя преследовала его в профессиональном плане, что способствовало его собственному невниманию к обреченному порту WireGuard.

«Я даже не хотел заниматься этой работой». в конце концов сказал нам Мэйси. «Я был истощен, провел много месяцев с синдромом пост-COVID. В течение многих лет я страдал от словесных оскорблений со стороны недееспособных и полу-недействующих в проекте, чья одна большая проблема для меня заключается в том, что они не преступников. Я ухватился за возможность покинуть проект в декабре. Я просто почувствовал моральное обязательство довести [порт WireGuard] до финиша. Так что вы должны простить меня, если мои последние усилия были немного нерешительными. «

READ  Google представит Pixel 4 и другое новое оборудование 15 октября

Это признание дает ответ на вопрос, почему такой опытный и квалифицированный разработчик может создавать некачественный код, но поднимает гораздо более серьезные вопросы о процессе и процедуре в самом основном комитете FreeBSD.

Как так много некачественного кода удалось так далеко превратить в крупную операционную систему с открытым исходным кодом? Где была проверка кода, которая должна была его остановить? И почему и основная команда FreeBSD, и Netgate казались более сосредоточенными на том факте, что код подвергался пренебрежению, чем на его фактическом качестве??

Качество кода

Первая проблема заключается в том, действительно ли в коде Macy были серьезные проблемы. Доненфельд сказал, что да, и определил ряд серьезных проблем:

  • Сон, чтобы смягчить состояние гонки
  • Функции проверки, которые просто возвращают истину
  • Катастрофические криптографические уязвимости
  • Кусочки протокола wg остались нереализованными
  • Паника ядра
  • Обходы безопасности
  • Операторы printf глубоко в криптографическом коде
  • «Эффектные» переполнения буфера
  • Лабиринты Linux → FreeBSD ifdefs

Но Netgate утверждал, что Доненфельд переборщил со своей негативной оценкой. Они утверждали, что исходный код Macy был не так уж и плох.

READ  Apple продолжает новый кампус в Остине, Apple все еще смотрит на Северную Каролину

Несмотря на отсутствие в штате разработчиков ядра, Ars смогла проверить по крайней мере некоторые утверждения Доненфельда напрямую, быстро и без внешней помощи. Например, для поиска функции проверки, которая просто возвращала истину, а операторы printf были погребены глубоко в криптографических циклах, не требовалось ничего сложнее, чем grep.

Пустая функция проверки

Чтобы подтвердить или опровергнуть утверждение о пустой функции проверки. той, которая всегда «возвращает истину», а не фактически проверяет переданные ей данные. мы искали экземпляры return true или return (true) в коде Macy if_wg, как проверено. в FreeBSD 13.0-HEAD.

Это достаточно небольшое количество возвратов, чтобы можно было легко проверить вручную, поэтому мы затем использовали grep, чтобы найти те же данные, но с тремя строками кода, идущими непосредственно перед и после каждого возврата true:

Среди допустимых вариантов использования return true. мы обнаружили одну пустую функцию проверки в module / module.c:

Вероятно, стоит упомянуть, что эта пустая функция проверки не похоронена на дне огромной массы кода. module.c в том виде, в котором он написан, составляет всего 863 строки кода.

Мы не пытались преследовать использование этой функции дальше, но, похоже, она предназначена для проверки того, принадлежит ли источник и / или место назначения пакета к списку разрешенных IP-адресов WireGuard, который определяет, какие пакеты могут быть маршрутизированы по данному WireGuard. туннель.