Показаны сообщения с ярлыком Мир как IT. Показать все сообщения
Показаны сообщения с ярлыком Мир как IT. Показать все сообщения

понедельник, 1 января 2018 г.

Уязвимости в прошивках австралийских животных


В Австралии последние 60 тысяч лет живут племена хакеров. Только ломают они не ИТ-системы, а прошивки животных. Начнём с истории бумеранга.

На заливных лугах около Дарвина, Северные территории
Боевой бумеранг не должен возвращаться — это знает каждый абориген. Бумеранг нужен, чтобы разводить костёр трением, ломать ноги страусу, перепиливать сухожилия, стучать двумя друг об друга для музыки и делать ещё тысячу бытовых вещей. Для того, чтобы охотиться на летающих птиц, боевой бумеранг практически бесполезен – проще закидать их камнями или палками. Или бросить с 50-100 метров с помощью вумеры копьё из стебля травы с каменным наконечником, если птица особо жирная.

Проблема с птицами в том, что они имеют очень чёткий алгоритм реакции на угрозы. Вот кусочек псевдокода (естественно, я сейчас невероятно грубо упрощаю):

— Сгенерировать случайное число от 1 до 11.
— Если это 1-10 – смотреть вниз и искать еду до клевка.
— Если это 11 — осмотреться. 

Таким образом, когда у вас на болоте сидит стая птиц в 50-60 голов, 5-6 птиц играют роль радара, обозревая небо и окрестности, а остальные в это время едят. Причём насыщаются все одновременно, без выделенных часовых – никакого ролевого распределения, просто отличное распараллеливание процессов. 

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

Тут надо отвлечься и сказать, что на высоте они могут окружить хищника и очень подпортить ему нервы. Вообще, многие птицы имеют стайный алгоритм нападения на птиц-хищников — окружают стаей и летают вокруг предполагаемого противника. Это очень быстро узнают многие владельцы дронов, но это отдельная песня. Дело в том, что они так пугают хищника и заставляют его сдвинуться на другую территорию для охоты. Кроме того, стая показывает молодняку, как выглядит хищник – это часть обучения, то, что не пишется в ДНК. Поколения спустя может произойти генотипизация такого поведения, но в большинстве случаев это высокоуровневый код и база данных, а не прошивка. 

В случае тревоги с земли стая поднимается как можно выше сразу. Это тоже наиболее эффективный манёвр уклонения.

Аборигенов тревога с земли совершенно не устраивала. Вы успеваете попасть в одну птицу. Потом, если повезёт — во вторую, и то уже в последний момент. А дальше стая далеко вверху, и всё племя будет жрать две жалкие тушки. Я не знаю, как дело шло дальше, но могу попытаться предположить, что они заметили, как стая себя ведёт при атаке хищника. Он летит сверху, имеет плохую возможность для горизонтального манёвра — птицы уходят вбок. И если сидеть в засаде с нужной стороны, то положить можно уже 5-6 птиц. Вторая ветка исследований – что будет, если пугать их с разных сторон тем же копьём — куда они полетят? 

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

Что получается? Вы с друзьями садитесь в засаду и запасаетесь камнями и копьями из метровых стеблей травы. Хакер выдвигается чуть вперёд и бросает бумеранг. Он облетает стаю, заходит им в тыл и начинает лететь над головами птиц. Птицы думают, что это хищник – благо распознавание образов у них настроено на ультранормальный сигнал любого быстро движущегося объекта примерно треугольной формы (это легко проверить с помощью воздушных змеев). Результат – стая взлетает по пологой кривой и пролетает в метре над головами ваших друзей с камнями и копьями. В итоге всё племя кушает вечером вкусное нежное мясо. 

Сегодня такие бумеранги делают вручную примерно за две недели. Как аборигены доточили их до идеальной формы крыла — это, конечно, численные методы. Точнее, метод последовательного тыка, когда абориген трёт дерево камнем, думает, потом кидает бумеранг. Смотрит, как он летит, снова трёт – и так две недели. 

Аборигены, хоть и находятся в каменном веке (и находились там до появления первой бутылки рома в руках англичан), всё же умеют отлично передавать знания. В результате бумеранг распространился по континенту даже в те племена, где на птиц не охотятся. 

В итоге в обычном племени 2-3 хакерских бумеранга и по боевому на каждого мужчину, а в северном (где много птиц) – примерно по одному хакерскому и ровно по одному боевому на мужчину. Боевой, кстати, похож на топор, не возвращается и делается большим и тяжелым, чтобы сломать ноги страусу или кенгуру

Боевой бумеранг, одна из версий. Весит как стальной топор, аборигены делают его из самого плотного дерева. Чаще всего это акациевое «железное дерево».

Обратите внимание: многим утверждениям про бумеранг явно не хватает академической точности. Письменные европейские источники часто противоречат друг другу, а аборигены Австралии не доверяют знания никому, кто не прошёл обряд инициации (это удалось только четверым белым). Поэтому здесь я во многом опираюсь на полученные локальные данные ad hoc, которые могут быть неточными. 

Вторая иллюстрация — про крокодила. Значит, напоминаю: эти забавные зверьки умеют целенаправленно охотиться за людьми. Они быстрее человека в воде и на суше. Если вы попадёте к такому персонажу в челюсти – уже не выберетесь, разве что сможете локализовать мозг и воткнуть туда со всей дури нож. Шансы, как показывает австралийская статистика, крайне низкие. Чтобы вы понимали глубину проблемы, покажу короткое видео про их скорость (18 километров в час):



В эпизоде крокодил больше короткий, чем зелёный. Чаще всего вам будут встречаться зверьки чуть побольше, 4-6 метров длиной. Они такие же резвые, не сомневайтесь.

Так вот. Я не знаю, что именно заставило аборигенов так сделать в условиях растущих рядом в изобилии бананов, но они хакнули и крокодила тоже. Первое – нужно было узнать, что у него очень слабая мышца, которая поднимает челюсть. То есть закрывает рот он как удар вагоном поезда, а вот открывает – с трудом. У многих птиц похожая же проблема с клевками – движение вниз из-за силы тяжести, а вверх – мышцами (поэтому у птиц на орбитальных станциях были проблемы). Второе: крокодил нуждается в чётком температурном коридоре от 19 до 39 градусов Цельсия (плюс-минус в зависимости от вида). И вот они иногда вылезают на берег спать и греться. Есть определённые моменты, когда они сбрасывают недостаточно много тепла, и от этого тормозят. Аборигены подкрадываются сзади, прыгают на одинокого крокодила и быстро обматывают ему морду сухожилиями кенгуру. 80% боевого потенциала животного сразу убирается. Остаются только лапы и хвост (что тоже немало), но это уже не так страшно. Плюс крокодил на суше в непонятной ситуации старается уйти в воду, а не отмахаться – а ему не дают вплоть до того удара копьём, который пройдёт в мозг. 

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



Я упомянул жилы кенгуру. Этих зверей они тоже отлично ловили. Делалось это так: находился водопой у скал, куда приходит стадо кенгуру. Затем на скалы рядом высаживались несколько местных пацанов, которые наблюдали за тем, как стадо приходит пить воду. За каждого входящего кенгуру брался камень. Нужно минимум два человека, чтобы наблюдать – и чтобы камней потом было одинаковое количество, иначе охота не делается. 

Когда все кенгуру входили в зону водопоя, пацаны звали охотников. Те прятались рядом и ждали, пока кенгуру уйдут. Дело в том, что если просто взять и начать охоту – да, можно поймать 5-6 зверей, и всем будет мясо. Но остальные кенгуру перепугаются и уйдут с этого водопоя. А запасать мясо на жаре аборигены не умеют. 

Нужна была механика охоты, когда кенгуру не будут бояться — то есть смогут потом возвращаться к водопою снова и снова. 

Итак, один за одним кенгурухи выходят с водопоя. Пацаны убирают камни. Когда остаётся двое – пацаны сигналят охотникам ещё раз. Они ждут, пока уйдёт ещё один, и окружают последнего. Если поймать только его, то никто не увидит, а сам последний никому не расскажет. Вот его и забирают в гости в племя. Правда, по частям. 

Вообще, аборигены очень крутые в плане сельского хозяйства. То есть его у них как бы нет (база – собирательство), но при этом они очень прошаренные. Например, на уровне лингвистики во многих племенах привязаны понятия «две ягоды, одна для племени, одну оставить», — они всегда оставляют возможность вырасти тому, что собирают. Или та же история с индуцированными пожарами (до естественных) – это они открыли, что можно инициировать обновление буша и взрастание новых полезных им злаков. То есть они ухаживают за той землёй, где их племя – то, что мы бы сегодня назвали экологичным отношением. 

В отгороженной территории (где те, кто не учит английский язык и где строго запрещён алкоголь и порнография) у них натуральный каменный век. Что особенно интересно для нас – нет абстрактного мышления. Причём на том уровне, что два эвкалипта будут называться одним словом, три эвкалипта – другим (это другой объект), а две акации и три акации – тоже новые слова, не имеющие общего со счётом. То есть каждый счётный объект до понятия «много» – это новое слово. В этом плане мне запомнился выучивший английский парень, объясняющий, какие у него тут рядом водятся крокодилы:

— В этой реке водятся шестиметровые крокодилы. Пятиметровые крокодилы. Четырёхметровые крокодилы, — он сосредоточился, чтобы никого не пропустить, — трёхметровые крокодилы. Двухметровые крокодилы. И ещё однометровые крокодилы!

Вы неправильно пишете животных


Животные – это платформы с очень ограниченной памятью, вычислительными способностями и возможностями модификаций. Разработчикам энимал-сцены приходится выдавать практически гениальные низкоуровневые алгоритмы. Правда, большое количество хардкода вызывает характерные проблемы с отсутствием проверки в экзотических условиях. Та же фильтрация входных данных делается очень и очень криво.

Уязвимость рекурсивных алгоритмов навигации муравья: спираль смерти
Не знаю, кто писал большую часть птиц, но я хочу обратить внимание на особенность, позволяющую провести инъекцию произвольного яйца в гнездо. Дело в том, что птица проверяет только расположение и количество яиц, но не их хэши. В 20% случаев кукушка, эксплуатирующая этот баг, может внести яйцо с сохранением контрольной суммы, чего вполне достаточно для повышения прав в гнезде. 

Но пойдём далее. Я не знаю, кто разрабатывал архитектуру ящериц, но они бегают в одном процессе, а дышат в другом. При этом платформа не поддерживает многозадачность, поэтому костыль с максимальной длиной бега в 4-6 секунд просто эпичен. 

Да, ещё о птицах, чтобы два раза не вставать. У них насквозь кривой модуль распознавания «свой-чужой». Что позволяет провести animal-in-the-middle-атаку с помощью подстановки звука птенца. Всё, что примерно совпадает по размерам и при этом передаёт открытую часть ключа, нужно покормить. Похожий баг есть у некоторых грызунов, что позволяет предположить проблемы с общей библиотечной функцией.

Теперь муравьи. Муравьёв довольно легко зациклить. Навигационный блок у них совмещён с системой приоритетов ОС, поэтому при построении циклического маршрута образуется «спираль смерти», затягивающая всё больше и больше ресурсов муравейника – и всё это зависает на 3-4 дня, пока муравьи не погибнут от истощения или что-то снаружи не поменяет навигацию. 


Спираль будет забирать всё больше муравьёв из доступных источников, пока приоритеты не поменяет внешнее событие или муравьи не умрут
А вот страус – вершина оптимизации. То, как именно в него впихнули пищеварение, вообще достойно войти в «Жемчужины программирования». Чтобы эта птичка нормально переваривала пищу, разработчик придумал заставить его натурально жрать камни. При беге камни трясутся и перемалывают зёрна. Теперь самое весёлое. Чтобы не писать отдельный код для поедания камней, страусу просто взяли и отключили центральный сектор зрения (как зайцу, но там это известный минорный баг). Поэтому когда страус целится в зерно, он попадает только в 30-50% случаев. Что легко позволяет набирать нужное количество камней, да ещё и с запасом. Именно поэтому страусы, запущенные на чистой виртуальной машине в зоопарке, испытывали проблемы с пищеварением до появления поддержки камней на уровне гипервизора. Кстати, коровы тоже жрут гвозди и иногда гравий, но это не в архитектуре, а просто техническая ошибка обратной совместимости.

Да, и ещё. Очень хорошая вещь – повторное использование кода. Часть функционала с камнями потом накатили на крокодила – чтобы ему нырялось лучше. Ныряется действительно лучше. 

Проблемы энергопотребления решаются не менее гениально. С рептильной платформой всё ещё более-менее нормально (там просто нет долгих высокоуровневых процессов), и крокодил может сидеть сутки без движения до поимки мяса. А вот с теми же крупными хищниками всё пожёстче мобильных ОС. На 20 часов в сутки лев снимает все активные процессы и уходит в спящий режим. Примерно 4 часа он находится в активном режиме – рычит, размножается, сёрфит по саванне и находит новую зарядку в антилопе или зебре. 

Дельфину вообще не всегда удаётся включать оба ядра мозга – только тогда, когда нужно делать что-то важное. Если вам встретился тормозящий дельфин – проверяйте, оба ли глаза открыты. Только один? Значит, он в спящем режиме и работает на одном ядре с пониженной тактовой частотой. 

Медведь не всегда корректно выходит из hibernate-режима. Это же, кстати, касается некоторых растений, но там баг не так опасен. Растения легко перезапустить. И да, учитесь у тех, кто писал альбатроса. Альбатрос вообще спит в воздухе. 

Теперь черепаха. Ей вместо того, чтобы прописать нормальный алгоритм обхода препятствий, захардкодли рефлекс убирания головы в панцирь. Теперь даже если она натыкается на крокодила, тот со своим молниеносным броском не успевает откусить ей голову. Побочный эффект – черепаха легко уворачивается от ножа мясника. Скорость обработки инструкций процессора не сравнится со скоростью работы интерпретируемого высокоуровневого кода у повара. Черепаху не обгонишь, критичные функции переписаны на ассемблере.

Белый медведь – отличный пример работы с солнечной энергией. Медведь прозрачный в УФ по меху и чёрный на коже. Это уже торжество инженера.

Жираф – сплошной костыль. Нет, в целом, понятно, что требования заказчика по высоте кроны несколько раз повышались по мере развития проекта. Но вот то, что вошло в релиз по водопоям и было пропущено на приёмке – это нонсенс. Жираф тупо не достаёт головой до воды(!) в обычном режиме. Ему приходится жутко вывернуться и почти сесть на шпагат, чтобы попить. Ясное дело, анонимусы-хищники этим нагло пользуются. Детёныша вообще пришлось укреплять – он в стабильном релизе падает с полутора метров при рождении. 

Морской свинке и ряду рыб косо прописали задержки на прерываниях. Если обычное животное по очереди опрашивает прерывания вроде «нет ли опасности», «не надо ли попить», «не надо ли поесть», «не надо ли начать размножаться», «не надо ли лечь спать» и «не надо ли выполнять нестандартную процедуру» — и всё это без видимого переключения — то морские свинки делают sleep(1000); после каждой операции. Видимо, осталось с отладки и вошло в релиз. 

Хорошей идеей было накатить код сборщика мусора в ОЗУ от золотой рыбки на белку – garbage collector с высокой вероятностью очищает и неиспользуемые указатели на места размеченных орехов и семечек. В результате благодаря белке вырастает много новых деревьев. 

Вот индийскую кобру точно писал фанат Starcraft. Потому что, задумайтесь, где ещё можно встретить юнита, плюющегося ядом на два с половиной метра точно в глаз террану. 

Ну и раз начали о нерациональности – вспомним того же осьминога. Километры нервной ткани просто потому, что кому-то было интересно написать его на brainfuck. Да если использовать эти отдельные модули управления присосками, ту же ткань – может получиться вообще ЦОД на колёсиках. 

Или вот взять того же пингвина – летать не умеет, зато плавает и весело прыгает на полметра в высоту. Написали его в качестве учебного примера для объяснения принципов полиморфизма, а потом почему-то забыли закомментировать подключение библиотек с ним в основном релизе. 

Тлей и других насекомых, а также ряд животных точно писал бешеный фанат рекурсии. Светлая мысль рождать некоторых уже беременными – просто вынос мозга для тестеров. Зато слонёнок деплоится 22 месяца — вот что значит не влезть в кэш процессора. 

Кстати, пасхалка с бегемотом получилась смешная. Люди боятся львов, носорогов, змей – но только этот обаятельный толстяк целенаправленно бегает за человеком. И, внезапно, со скоростью до 30 км/ч. То есть догоняет даже велосипедистов. 

У некоторых кошек не убрали аппаратный байпасс в районе шкирки. Стоит взять взрослую систему за это место, так сразу отключается двигательная активность. Что породило опасный баг с прищепкой, которым часто пользуются скрипткидди. 

У курицы расслабленная лапа «защёлкнута», поэтому если поставить курицу на ветку, дождаться, пока она уснёт, а потом легко и быстро перевернуть, сработает рефлекс – и у вас будет курица, спящая вниз головой на дереве. Главное – подготовить почву и рассказать всей деревне про вампиров за день до зрелища такого курятника. 

У собак и ряда других хищников и падальщиков косо прописано распознавание добычи. В одном из условий AND случайно заменили на OR, и вот результат — известный баг с запуском приоритетного процесса с атакой на пятно лазерной указки. 

В общем, вы наверняка и сами можете продолжить.

P.S. Обратите внимание, что большая часть описанных уязвимостей до сих пор не исправлена.