Zip-бомбы для защиты сервера
Сегодня бóльшую часть трафика в сети составляют боты. Они используются для обнаружения нового контента. Это читалки RSS-лент, поисковые системы, и боты искусственного интеллекта, которые обучают свои LLM.
Но есть и вредоносные боты. Это спамеры, скраберы контента или хакеры. У моего прежнего работодателя бот обнаружил уязвимость в WordPress и вставил вредоносный скрипт на наш сервер. Затем он превратил машину в ботнет, используемый для DDOS.
В какой-то момент мне пришлось искать способ защититься от этих ботов. Тогда я начал использовать zip-бомбы.
Что такое zip-бомба
Zip-бомба — это относительно небольшой сжатый файл, который может превратиться в очень большой файл после распаковки и способный перегрузить машину.
В своём блоге я часто вижу ботов, которые сканируют уязвимости в системе безопасности, которые я по большей части игнорирую. Но когда я обнаруживаю, что они либо пытаются внедрить вредоносные атаки, либо пытаются получить ответ, я возвращаю им код 200 OK и отправляю ответ в формате gzip. Я варьирую размер файла от 1 МБ до 10 МБ, который они с удовольствием принимают.
В большинстве случаев, когда они это «хавают», я больше никогда о них не слышу. Почему? Да потому, что они «падают» сразу после получения файла.
Как работает zip-бомба
Боты получают файл, читают заголовок, который сообщает им, что это сжатый файл. Поэтому они пытаются распаковать файл размером 1 МБ, чтобы найти нужное содержимое. Но файл расширяется, расширяется и расширяется, пока не заканчивается память и сервер не падает. Файл размером 1 МБ распаковывается в 1 ГБ. Этого более чем достаточно, чтобы сломать большинство ботов. Однако, для тех надоедливых скриптов, которые не хотят останавливаться, я предоставляю им файл размером 10 МБ. Он распаковывается в 10 ГБ и мгновенно убивает их скрипт.
Как создать zip-бомбу
Прежде чем я расскажу вам, как создать zip-бомбу, я должен предупредить вас, что вы потенциально можете сломать и уничтожить свое собственное устройство/машину. Продолжайте на свой страх и риск. Итак, вот как мы создаем zip-бомбу:
dd if=/dev/zero bs=1G count=10 | gzip -c > 10GB.gz
На моем сервере я также добавил промежуточное ПО, которое проверяет, является ли текущий запрос вредоносным или нет. У меня есть список айпишников, внесенных в черный список, которые пытаются неоднократно просканировать весь сайт. У меня есть и другие эвристики для обнаружения спамеров. Многие пытаются рассылать спам со страницы, а затем возвращаются, чтобы проверить, попал ли спам на страницу. Я использую этот шаблон для их обнаружения. Он выглядит примерно так:
if (ipIsBlackListed() || isMalicious()) {
header("Content-Encoding: deflate, gzip");
header("Content-Length: "+ filesize(ZIP_BOMB_FILE_10G)); // 10 MB
readfile(ZIP_BOMB_FILE_10G);
exit;
}
Это все, что требуется. Единственная цена, которую я плачу, — это то, что в некоторых случаях я предоставляю файл размером 10 МБ. Если статья становится вирусной, я уменьшаю размер до 1 МБ, что не менее эффективно.
И еще одно: zip-бомба — это защита от дурака. Ее можно легко обнаружить и обойти. В конце концов, вы можете частично прочитать содержимое. Но для неискушенных ботов, которые вслепую ползают по Сети, нарушая работу серверов, это достаточно хороший инструмент для защиты вашего сервера.