Wednesday, November 9, 2011

Сигнатурные антивирусы, прощайте

Продолжая потихоньку сражаться с проблемой, решил, таки посмотреть, что же там качают...

Приведу фрагмент странички, хостящей зловред:
Вот, что-то никогда не доводилось взглянуть, а как все интересно!
a - массив чудовищной длины, фактически байтов, которые там раскиданы по порядку, известному разработчику (в данном примере - обратный порядок).
Из этого "набора" потом в переменную s набирается побайтовым "выкусыванием", собственно, код, который затем выполняется в eval(s).

Какому-нибудь сканеру вредоносности кода, чтобы увидеть вредоносность надо его собрать, а чтобы его собрать надо знать алгоритм по которому он разбросан...

Тему можно дальше развивать до бесконечности:
- также набирать, скажем индекс "выкусывания",
- также набирать "опасные" команды, типа eval, substr, тп
- можно сильно усложнить алгоритм "выкусывания"
- ... человеческая фантазия безгранична ...
Полиморфизм, однако.

Можно попробовать что-то вроде песочницы, т.е. фактически выполнить код, как это сделал бы браузер. Делать это можно, если недолго (антивирус должен работать незаметно!). Но, можно же вставить искусственные задержки (sleep) , можно вставить естественные задержки, скажем, в цикле пытаться что-то поделать небыстрое, ... - пользователь замучится ждать, пока антивирус собирет - не вариант.

Печально что мой, не изощренный мозг, ограниченного горе-программиста с ходу придумывает такое количество схем обфускации, практически полностью убивающих идею обнаружения зловреда до его поражения жертвы, что же говорить о высококлассных профи :-(

Опыт показывает, что все эти сэмплы практически не детектятся никем из Virustotal, пока в соответствующие поддержки не пришлешь сэмплы и они не выпустят экстры. Что уж в этих экстрах - не разбирался, но судя по тому, что ровно такая же штука (с небольшими изменениями) срабатывает снова и снова, складывается недоброе впечатление что там чуть ли не сравнение по MD5 :-(

PS: я посмотрел в некий .class (использовал javap), там тоже белиберда и substr-ы (java/lang/String.substring). По ходу та же техника....

2 comments:

Taras Zlonov said...

Подскажите, а как задержки помогут против "песочницы"? Если они совсем большие, то у пользователя и сама страница ведь не откроется. Или я что-то не так понял?

Sergey Soldatov said...

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

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

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

Сколько в браузере пользователя показывается та или иная страничка зависит от конструкции странички, от ее контента. Например, если страничка фреймованная или с активным контентом, она может быть очень долго загружена в браузер: интерактивность будет достигаться активными объектами и фреймами. Если на страниче много текста, то также может пройти ни одна минута, пока пользователь ее покинет.

Новомодные технологии, типа Ajax и подобные позволяют вообще не выполнять обновление всей странички => некоторые ее "части" будут висеть очень долго.