23 февраля 2017 года сотрудники компании Google и Центра математики и информатики в Амстердаме представили первый алгоритм генерации коллизий для SHA-1. Эта находка стала результатом двухлетнего исследования, которая началась вскоре после публикации в 2013 году работы криптографа Марка Стивенса из Центра математики и информатики в Амстердаме о теоретическом подходе к созданию коллизии SHA-1. Он же в дальнейшем продолжил поиск практических методов взлома. Теперь вместе с коллегами из Google он опубликовал научную работу, в которой описаны общие принципы генерации документов с блоками сообщений, подверженных коллизиям SHA-1 (атака SHAttered).
Сразу стало понятно, насколько опасной может быть атака, ведь устаревшая криптографическая хеш-функция SHA-1 до сих пор широко используется, в том числе в приложениях и протоколах безопасности, включая TLS и SSL, PGP, SSH, S/MIME, IPsec. Хеши SHA-1 применяются в разных системах управления версиями Git, Mercurial и других для верификации содержимого и выявления повреждения данных (см. комментарий Торвальдса по поводу коллизий в Git). Хеши SHA-1 используются даже в игровой приставке Wii для проверки подписи во время загрузки. Использование SHA-1 по закону требуется некоторыми правительственными организациями. И самое интересное для темы данной статьи — хеши SHA-1 применяются в пиринговом сетевом протоколе BitTorrent для обмена файлами через Интернет.
Вкратце, как работает BitTorrent, а именно, как устроен торрент-файл.
Для раздачи файла через торренты на первом шаге нужно сгенерировать из этого файла (DATA) специальный торрент-файл с расширением .torrent (DATA.torrent). Оригинальный файл разбивается на определённое количество сегментов (chunks), для каждого из них вычисляется хеш SHA-1. Все полученные хеши соединяются вместе и хранятся в торрент-файле в строке
pieces
под общим ключом словаря. Длина этой строки равна 20 * количество кусков.Когда кто-то пытается скачать файл (DATA) через BitTorrent, сначала ему надо скачать торрент-файл DATA.torrent и распарсить его. Основываясь на информации из этого файла, клиент ищет пиров и скачивает сегменты оригинального файла (DATA). Чтобы защититься от пиров, которые пытаются подсунуть вредоносные данные, клиент сверяет каждый сегмент с его хешем из торрент-файла. Если хеш в торрент-файле не совпадает с хешем SHA1 в скачиваемом фрагменте, то плохой фрагмент отвергается.
Теперь вектор атаки становится понятен.
Злоумышленник может создать исполняемый файл, который при исполнении не делает ничего запрещённого и выглядит безобидно, но меняет путь исполнения команд в зависимости от содержимого региона SHATTER. При проверке антивирусами оригинальный файл не вызовет подозрений, потому что вредоносная часть хранится в зашифрованном блобе и никогда не запускается на исполнение.
И вот здесь начинается самое интересное.
Атака BitErrant
Если злоумышленник может создать два блоба данных с одинаковыми хешами SHA1, то при некоторых условиях можно сгенерировать два исполняемых файла с различными данными внутри. Но оба файла будут соответствовать одному и тому же торрент-файлу.
Если все условия соблюдены, то мы получаем два исполняемых файла, в которых одну часть можно заменить на другую. Если заменить её, то изменится путь исполнения команд и сработает вредоносный код.
Конкретно такую «переменную» функциональность исполняемого файла можно на практике реализовать благодаря протоколу BitTorrent. Принцип простой: мы начинаем сидирование через торренты «хорошим» файлом, а затем в определённый момент подменяем его «плохим», эффективно меняя фрагмент данных у тех, кто скачивает этот файл в сети пиров.
Демонстрация и инструментарий
biterrant_poc.zip
В архиве два исполняемых файла EXE с различной функциональностью (во вредоносном файле реализована начинка Meterpreter для фреймворка Metasploit, которая в данном случае начинает прослушивать все интерфейсы).
Пароль для расшифровки архива: biterrant.io
SHA1: eed49a31e0a605464b41df46fbca189dcc620fc5
Хороший файл на VirusTotal, плохой файл там же.
Автор атаки BitErrant разработал соответствующий инструментарий — фреймворк для генерации исполняемых файлов с одинаковыми .torrent. С помощью этого фреймворка можно помещать произвольную нагрузку в зашифрованную часть исполняемого файла и получить параметры для её вызова, которые затем помещаются в исполняемую часть файла. Потом на ваш выбор указываете невинные функции для подменяемой части хорошего файла. Затем питоновский скрипт генерирует два исполняемых файла — хороший и плохой — которые соответствуют одному файлу .torrent.
Пока что никто не применяет данную атаку для распространения файлов через официальные торрент-трекеры. Да и даже «хорошие» файлы с изменяемой функциональностью выглядят подозрительно для некоторых антивирусов. Так что опасность этой атаки не стоит воспринимать слишком серьёзно.
Чтобы защититься от этой атаки, достаточно всегда проверять общий хеш скачиваемого файла и сверять его с хешем файла, который стоит на раздаче, вот и всё. Между прочим, есть даже опция включать общий хеш MD5 файла прямо в торрент-файл, тогда данная атака станет неосуществима. В большинстве случаев никто эту опцию не использует.