Контакты

Для связи с нами можно использовать:
irc://irc.chatnet.ru:#gfs
icq://546460
email://cobalt[@]gfs-team.ru

Все материалы предоставлены только с ознакомительной целью
ГлавнаяСтатьиПереводыЗлостная криптография, часть вторая
© перевод Cobalt 01.12.2007 статья не оптимизирована

Представляем вашему вниманию перевод статьи Фредерика Рэйнела "Злостная криптография, 
часть вторая". Оригинал статьи на английском расположен тут

С переводом первой части можно ознакомиться тут.

Это вторая из серии статей рассматривающих криптографию как обоюдоострый меч: с одной
стороны она помогает защитить наши данные, а с другой ее негнушаются применять
разработчики вирусов. В этой части продолжается обсуждение бронированных вирусов, и
рассматривается червь Bradley - пример вируса, использующего шифрование, благодаря
чему он не может быть проанализирован. В итоге мы рассмотрим Skype, как пример
приложения с закрытым протоколом и встроенной криптографией.

Введение

В первой части этой статьи обсуждалось понятие криптовирусологии. Были рассмотрены
два примера: слабые стороны SuckIt rootkit и заготовка для SSH червя. Также
нами было введено понятие бронированных вирусов.

Сегодня, во второй части, мы продолжим обсуждение бронированных вирусов (использующих
полиморфизм и метаморфизм), и закончим его рассмотрением червя Bradley, который
не поддается анализу и использует шифрование. Читателю будет предложен Skype
(сейчас принадлежащий eBay), как пример программы с закрытым протоколом и встроенной
криптографией, который может использовать аттакующий для своих целей.

Краткий обзор бронированных вирусов

В первой части было введено понятие бронированных вирусов, так давайте побыстрому
повторим этот материал. Мы с вами видели, что время - решающий фактор как для
вирусов, так и для защиты от них. Методы шифрования используются как в защите
програмного обеспечения так и практически в техже целях во вредоносном програмном
обеспечении (ВПО). Когда вирус использует методы позволяющие избегать, а то и вовсе
блокировать собственный анализ, тогда он называется бронированным. Первый вирус
который подподает под это определение назывался Whale и "жил" в сети где-то
в сентябре 1990 года. В этом вирусе были использованы следующие технологии:

  * Полиморфизм: как исходники, так и бинарники были зашифрованы (около 30
    сложных версий)
  * Невидимость: перехват прерываний, в том числе отладочных, хуки Whale, а также
    располагался в области памяти превышающей известный максимум того времени для
    MS DOS.
  * Бронирование: код менялся в зависимости от архитектуры (8088 или 8086),содержал
    много путанницы (бесполезный код, идентичные условия, избыточный код, и так 
    далее) и имел то, что называется анти-отладка (если обнаружено действие отладки, 
    блокировалась клавиатура и Whale убивал себя)
    
Если эти методики применить сегодня, почти семнадцать лет спустя, можно вообразить
что произойдет когда такой кусок кода достигнет антивирусных компаний.

А сейчас давайте рассмотрим какие методы используют более современные вирусы.

Смена формы (полиморфизм и метаморфизм)

Мне особенно нравится определение вируса, которое ввел Фред Кохен (Fred Cohen):

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

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

Полиморфизм - технология позволяющая закодировать вирус таким образом,
чтобы он каждый раз при копировании создавал отличный от предыдущего код и ключ
для раскодирования (см Рис 1). Как очень устаревший пример, можно привести
инструкцию вычисления правильности выражений ADD, XOR, ... и изменение ключа при
каждом выполнении. Более широкие (и эффективные) методы включают:

  * Изменения порядка декодирования в поколении: изменение порядка узлов на 
    диограмме инструкций (изменение длинны, особенности esp, расшифровка
    инструкций, повторение...)
  * Псевдослучайность - случайный индекс расшифровки: вместо линейной расшифровки
    данных, они расшифровываются в случайном порядке.
  * Различные способы кода - писать один и тотже код разными способами (xor \%eax, 
    \%eax and movl \$0,\%eax)
  * Бесполезный код - вставлять ненужный код между полезным.
  * Смена регистров - используемые регистры не установлены зарание, а меняются
    при каждом выполнении кода.
    

Рис 1, Отлияия полиморфного вируса от обычного
Главный минус полиморфизма в том, что расшифрованный код всегда один и тотже, что увеличивает шансы вируса быть обнаруженным. Во избежание этого, используется метаморфизм. Метаморфизм - технология позволяющая изменять полный код вируса, каждый раз при создании копии (см Рис 2). Полиморфизм можно рассматривать как специальный вид метаморфизма для расшифровки кода. В самом простом случае, метаморфизмом можно называть добавление бесполезного кода между нужными инструкциями. Более широкие (и конечно эффективные методы) приведены ниже: * Изменение кода - изменения порядка ветвлений, блокировка ветвлений. * Вставка исполняемых модификаций: jmp, call и test... * Интеграция кода - код вставляется в другой полезный код и изменяются указатели на данные (примером может служить известный вирус ZMist)
Рис 2, Копирование вируса с другим синтаксисом
Те кто хотят расширить свои знания о метоморфизме могут прочитать статью "Метаморфизм на практике" Вот описание метаморфного двигателя, который составляет практически 90% кода вируса: * Вирусный код дезасимблируется в определенной форме * Удаляются избыточный код и бесполезные функции * Перестановки (перестановки, случайная смена регистров и так далее) выполняется на чистом коде * Вставляются избыточный код и бесполезные функции * Код повторно собирается и вставляется в заражаемые файлы Вот несколько заключительных слов о полиморфизме. Он используется не только в ВПО но и в шелкодах (shellcode). К счастью, проектирование хорошего полиморфного движка, довольно-таки не тривиальная задача. Для ВПО он должен гарантировать что есть существенная разница между копиями ВПО, иначе "определенные точки" могут быть использованы для создания сигнатуры. Это привышает возможности большинства авторов вирусов. Для шелкодов, вычисляющие инструкции могут генерировать запрещенные значения (например неожиданный символ конца строки (0x00) в середине strcpy()) Кроме того, многочисленные NOP которые обычно помещаются непосредственно перед шелкодом и неявляются зашифрованными инструкциями, должны быть также изменены (заметьте, что многие IDS ничего не регестрируют если вы замените NOP на другую инструкцию) Но главная слабость такого подхода в том что в большинстве случаев ключ входит в состав кода и может быть проанализирован человеком или эмулятором. Следующий вопрос которым мы должны задасться: возможно ли создать ВПО без ключа и его декодера? Возможно вы задались бы вопросом, почему бы не сделать это. Это только вопрос тактики. Если нападающий удаляет ключ и ключевое пространство, то правильный ключ не сможет быть восстановлен. Если он удалит дешифровальный цикл, то ключ бесполезен, пока дешифровальщик не догадается какой шифр был использован. Так вирус будет избегать быть обнаруженным (эмуляторами, IDS, AV) и возможно не сможет быть проанализирован. Но тут тоже может быть несколько вариантов. Я потерял мои ключи! Все вычисляющие алгоритмы не эквивалентны. Некоторые очень доступны для крипто- анализа, подобно XOR алгоритму. Однако если автор ВПО использует хороший алгоритм, есть возможность того что ключ не будет расшифрован. Давайте назовем первый случай слабым шифрованием, а второй - сильным. Если автор ВПО удаляет ключ, он должен найти путь позволяющий ему это для его куска кода. Поэтому в дешифровачном цикле, должны присутствовать шаги, для вычисления ключа. Как мы видели, слабый алгоритм легко может быть расшифрован. И так, способ восстановления ключа - исследовать область поиска. Этот вид технологии называется Случайны Расшифровывающий Алгоритм (RDA). Есть два вида RDA: * Детерменированный RDA: вычесление времени всегда одинково (как например в вирусе W32/Crypto) * Недетерменированный RDA: расчет времени не может быть определен (как например в RDA Fighter и W32/IHSix) Давайте вернемся к рассмотрению тактики. Слабое шифрование применяется для того чтобы в конечном итоге быть декодированным, но всеже дает вирусу немного времени для размножения. Также эмулятору требуется много времени если задержки цикла слишком большие. Поэтому следующий вопрос: может ли автор применить сильное шифрование? Bradley Bradley - неподдающийся анализу вирусов. Его общая структура состоит из трех частей (как изображено на Рис 3, где EVP означает вирусное пространство). * Расшифровывающая функция D собирает информацию нужную для восстановления ключа и расшифровки собственного кода. * Кодированный код EVP1 (ключ k1) содержит все анти-анти-вирусные элементы * Кодированный код EVP2 (ключ k2) ответственен за механизмы инфекции и полиморфизма/метаморфизма. * Кодированный код EVP3 (ключ k3) содержит всю необязательную полезную нагрузку.
Рис 3, Структура вируса Bradley
Большинство используемого в Bradley шифровании основано на пространственных ключах, описанных Riordan и Schneier в 1998г. Оно начинается с определения выставления ключа: мобильный агент, развивающийся во враждебном окружении не может иметь встроенный ключ, потому что если он будет захвачен, то обновление ключа может быть проанализировано. И так, идея заключается в том, чтобы строить ключи по запросу, основываясь на окружении мобильного агента. Пусть n является целым числом, соответствующим наблюдаемому окружению, H - хэшфункция, m - хэш наблюдаемой n (которое будет служить значением активации) и k - ключ. Мы можем определить несколько правил для вычесления ключа. Давайте посмотрим несколько примеров: 1. if H(n) == m, then let k = n (проблема: ключ содержиться в открытом тексте). 2. if (H(H(n)) == m, then let k = H(n). Здесь защищенность k равна защищенности H, но возможны варианты. Эти два примера не очень стойки к анализу, но приведены чтобы дать читателю некоторое представление о идее. Какие бывают варианты наблюдаемого окружения? Есть достаточно много элементов которые можно принять за основу, как то: время, значение хэша представленной вебстраницы, хэш RR в DNS-ответе, содержимое файла на цели, информация содержащаяся в почтовом ящике, температура за окном и многое другое. И так, в Bradley, расшифровывающей функции D нужна некоторая информация под контролем напающего, чтобы правильно считать значение активации, а затем ключи. Самая сложная часть в таком ВПО - определить правильное управление ключами. Так, D собирает нужную информацию, в том числе ту которая под контролем нападющего (пусть она называется a. Тогда расчитывается как H(H(n+a)+e1), где e1 означает первые 512 бит зашифрованного кода EVP1 и если оно равно m, то ключ нужный для расшифровки EVP1 - H(n+a). Иначе D отделяет систему от общего вирусного кода. Далее, вложенный ключ k2 вычисляется как k2 = H(c1+k1) (c1 - последние 512 бит чистого кода VP1). И так далее для EVP3 и k3) Стратегия при копировании - изменить все, в том числе значение активации. Это можно сделать обновлением наблюдаемого окружения n, и потом повторно пересчитать m и k. И начиная с зашифрованного кода EVP1, заменять его и вложенные ключи. Это все в деталях оъясняется в "Сильное шифрование бронированных вирусов неподдающихся анализу: вирус Bradley". Заинтересовавшиеся читатели должны в обязательном порядке обратить внимание на эту ссылку. Что там особенно интересно, так это то что там доказывается, что анализ кода защищенного с применением переменных окружения, является задачей с экспоненциально повышающейся сложностью. С оперативной точки зрения, утечка информации ограничивается e1 и сканированием предоставленной информации, но она не может быть восстановлена благодаря использованию функции хэширования. Так даже если этот код будет обнаружен и помещен в лабораторию для изучения, он не сможет быть проанализирован пока эта информация не восстановлена. Конечно эта особенность очень интересна. Но с Bradley нападающий может сделать больше. Если он комбинирует как ключи окружения, так и полиморфизм, он фактически получает хирургический инструмент. Предполагается что ключи окружения зависят также от цели: * Аналитик не имеет никакой возможности определить чем является цель. * Нападающий имеет хороший контроль распространения ВПО: - если цель персона, он может использовать ее адрес электронной почты или даже лучше ее публичный ключ (PGP или SSH для примера, в конце концов публичные ключи создаются именно для идентификации персоны) - если цель "группа" - он может получить специфическую информацию для этой группы, как например доменное имя компании или TLD для страны и тд Аналитики, столкнувшись с вирусом подобным Bradley, должны понимать, как эффективно нападающий может его использовать. Невидимость Один из эффективных путей не быть обнаруженным для ВПО - использование технологий невидимости. Давайте посмотрим как авторы ВПО используют криптографию для улучшения невидимости своего кода. Нет дешифровального цикла? Давайте вернемся к рассмотрению структуры которая была рассмотрена при обсуждении полиморфизма. Мы уже определили что можно избегать включения ключа в код ВПО. Так сейчас мы имеем ключ и кодированные данные которые нужно расшифровать. Поэтому нам надо найти дешифровальный цикл (и кроме того он должен включать полную функцию вычисления обратного). ВПО подобно паразиту, так их авторы стараются сделать его еще более паразитическим: так в этом примере мы будем использовать шифрование предоставляемое зараженной системой (как например CryptoAPI в Windows, или OpenSSL в Unix). Давайте используем CryptoAPI в качестве примера: int main(int argc, char *argv[]) { HCRYPTPROV hCryptProv; HCRYPTHASH hCryptHash; HCRYPTKEY hCryptKey; BYTE szPassword[] = "..."; DWORD i, dwLength = strlen(szPassword); BYTE pbData[] = "..."; CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0); CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hCryptHash); CryptHashData(hCryptHash, szPassword, dwLength, 0); CryptDeriveKey(hCryptProv, CALG_RC4, hCryptHash, CRYPT_EXPORTABLE, &hCryptKey); CryptEncrypt(hCryptKey, 0, TRUE, 0, pbData, &dwLength, dwLength); } Для расшифровки используется замена CryptEncrypt() на CryptDecrypt() и используемый алгоритм меняет значение единственной переменной. Построение шелкода с использованием CryptoAPI делается точно также как и создание обычного шелкода для Windows. Оно начинается с поиска kernel32.dll, а затем GetProcAddress() и LoadLibrary(). Потом надо загрузить advapi32.dll и найти вышеупомянутые функции, а затем обращаться к ним для кодирования и расшифровки кода. Этот подход может быть интересен для многоуровнего шелкода, который потом зашифрует отправляемую автору информацию. Для ВПО используются большие и сложные библиотеки, которые делают сложнее работу эмулятора. Главная проблема этой уловки, в том что последовательность действий легко распознается. Возможности злоупотребления криптографией Исследователи могут рассматривать Skype как естественно бронированное приложение, которое может использоваться для распространения вирусов. Это утверждение может показаться смешным, но мы рассмотрим реальные случаи, когда приложение подобное Skype, со встроенным шифрованием, может послужить источником нешуточной угрозы. Бинарники Skype содержат двухуровневую защиту шифрованием и множество проверок целостности. С точки зрения сети, Skype может обмануть любое средство сетевой защиты тунелируя свой трафик. Он пытается соедениться с сервером авторизации или другими подобными серверами по 80 или 443 порту. Но если эти порты закрыты, он пробует достучатся до других портов TCP и UDP. Кроме того, его протокол полностью закрыт: по нему нет никакой документации. Но самое главное - пользователи очень уверенно устанавливают себе это приложение. Аутентификация базируется на центральном сервере поддержки Skype (и его головной компании eBay). В бинарники встраивают 13 общих ключей имеющих отношение к Skype и серверу авторизации. Когда клиент регистри руется: * Генерируется 1024-х разрядный ключ RSA (p, s) * Генерируется ключ сессии * Пользователь вводит свой пароль Когда вычисления закончены и введены пользовательские данные, Skype логиниться на сервер: RSAskype(k || AES256k(p || MD5( || "\nskyper\n" || )))) Так RSA используется с одним из общих ключей Skype. Так делается чтобы вычислить ключ сессии k. Этот ключ k используется чтобы с помощью AES256 вычислить новый публичный ключ пользователя. И наконец, аутентификационная информация в виде логина и пароля в виде MD5 хэша отсылается на сервер. Отныне, требуется получить только MD5( || "nskypern" || ) чтобы залогиниться как этот пользователь. Вся остальная информация вводиться открыто (ключи Skype). С точки зрения криптографии, главная проблема в том, что возможны повторы. Поэтому если что-то (кроме Skype) может общаться как Skype оно может повторно использовать информацию чтобы авторизоваться как этот пользователь. Теперь давайте посмотрим какие злонамеренные действия может выполнить нападающий при помощи Skype. Если взглянуть изнутри, используется множество типов шифрования, в том числе и сжатие. И ни у одного из них нет описание протокола: никто не сможет обнаружить трафик который генерируется для скрытия ВПО. Однако, в отличии от рассмотренных SSH или SuckIt, нет никакой возможности выполнять какие-либо действия на цели, так как нужен какой-либо баг. При взгляде снаружи, связь между узлами стремится быть прямой, даже если она проксируется другими узлами. К сожалению, это было бы очень удобно для червя. И наконец, непосредственно инфраструктура P2P очень избыточна и изменчива и обеспечивает отличную площадь для развития ВПО. Отсюда, как только будет обнаружена уязвимость в приложении (или библиотеках) Skype, он станет хорошим инструментом для заражения. Давайте представим пример червя для такого случая, который эксплуатировал бы уязвимость в одном UDP или нескольких TCP пакетах (это не фантастика или фикция, смотрите "Silver Needle in the Skype" представленную Black Hat Europe). Червь могбы обойти фаерволы чтобы достич сетей соединенных с Интернет. Конечно для этого тоже можно использовать "безопасный канал", те защищенный и шифрованный протокол для обхода IDS/IPS. Благодаря инфраструктуре P2P и некоторым его особенностям, точность была бы в районе 100%: * Если червь на клиенте, он могбы распространяться по алгоритму "найти друга" и проверять их присутствие в сети * Если червь на суперузле, он мог бы атаковать всех своих клиентов. Можно представить что натворит подобный червь если он окажиться хоть у одного из пяти миллионов пользователей скайп. Произошла бы катастрофа. Действия этого червя могут быть любыми, но для примера он мог бы менять открытые ключи Skype, чтобы пользователь не мог бы соединиться с сервером. Это основная идея частной сети Skype. Если кто-то вычистит двоичный код (другими словами уберет проверку целостности, уровни шифрования), и заменит открытые ключи входящие в бинарники, то он будет иметь под контролем всю частную сеть скайпа. А поскольку скайп имеет свой сертификационный центр, он сможет сделать все что захочет. Надеемся что сообщество разработчиков Skype откроет глаза на безопасность до возникновения этой проблемы. заключение Существует множество других алгоритмов шифрования, позволяющих повысить эффективность нападений. Можно рассмотреть такое понятие как выживаемость ВПО. Разработчик мог бы предусмотреть для своего кода некоторый вид "бессмертия", например использовав его как "Проводник" Windows. Разработчик вынужден был бы сделать свое ВПО ценнее и ближе пользователю так, чтобы даже если бы оно и было обнаружено, пользователь незахотел/несмог бы его удалить, потому что это привело бы к потери критичных для пользователя данных. Примеры этой статьи были взяты из разных областей, от применямого людьми SSH, до SuckIT rootkit. Фактически мы рассмотрели только три свойства: точность, время и невидимость. Мы также увидили что все эти технологии могут быть использованы на практике. Полиморфизм может применяться для защиты кода от анализа, и от обнаружения. Мы должны понимать подходы применяемые нападающими если мы хотим защититься от них. Благодарности Огромное спасибо всем тем, кто помог мне в изучении материалов и написании этой статьи. Тем кто снабжал идеями, коментариями, диетическим печением и многим другим. © Фредерик Рэйнел 2006-05-16



© перевод Cobalt 01.12.2007 статья не оптимизирована

e-Commerce Partners Network
Ник:

Текст:
P Br B I Qute



Код: обновить
Последние комментарии
19.11.2017 01:19:37 Dmitriyvah написал:
byncecopesy SlaltPog Kt ...
Пишем guestbook
18.11.2017 23:02:45 GlebNes написал:
hem unuby Osteotsematte ...
Пишем guestbook
18.11.2017 18:42:56 ViktorTap написал:
Zof edifam Weque ...
Пишем guestbook
Реклама

Тут должна была быть ваша реклама, но мы потеряли глиняную табличку с ее текстом. SapeId: 665044

Rambler's Top100