Вы неправильно пишите животных Milfgard. habrahabr
Самая страшная из пород собак
Животные – это платформы с очень ограниченной памятью, вычислительными способностями и возможностями модификаций. Разработчикам энимал-сцены приходится выдавать практически гениальные низкоуровневые алгоритмы. Правда, большое количество хардкода вызывает характерные проблемы с отсутствием проверки в экзотических условиях. Та же фильтрация входных данных делается очень и очень криво.
Не знаю, кто писал большую часть птиц, но я хочу обратить внимание на особенность, позволяющую провести инъекцию произвольного яйца в гнездо . Дело в том, что птица проверяет только расположение и количество яиц, но не их хэши. В 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. Обратите внимание, что большая часть описанных уязвимостей до сих пор не исправлена.