Исследование программ в Mac OS X

Еще год назад пользователями компьютеров от Apple были в основном специалисты в области дизайна, верстки, а также фотографы и музыканты. Но прошлый год стал во многом переломным: после того как Apple объявила о том, что теперь она будет выпускать свои компьютеры на базе процессоров Intel, многие обратили внимание на компьютеры от Apple и стали задумываться об использовании их в качестве домашнего компьютера. Обратили внимание на растущую популярность Mac OS X и производители программного обеспечения — и выпустили версии своих продуктов для Mac OS X.

Тем не менее, Mac OS X все же остается чем-то непонятным и загадочным не только для многих пользователей, но и для специалистов в области компьютерной безопасности. Мы постараемся немного помочь таким специалистам разобраться в тех особенностях Mac OS X, которые критичны при исследовании вредоносных программ для данной ОС.

Отметим, что Mac OS X — это Unix-подобная операционная система, обладающая многими характерными чертами, присущими другим Unix-системам, поэтому дальнейший материал будет более понятен читателям, которые имеют опыт общения с такими системами как Linux или FreeBSD. Также читателям будет полезен и опыт исследования программ в любых операционных системах.

Основные особенности Mac OS X

Знание особенностей ОС помогает при анализе программ, в том числе вредоносных. Многие особенности Мас OS X связаны с ее происхождением: Mac OS X создана на основе Unix-систем, что отразилось на дизайне и принципах системы в целом, от Mach она унаследовала межпроцессорное взаимодействие, от BSD — сетевой стек.

Поддержка системных вызовов от Mach- и BSD-систем

Ядро Mac OS X — xnu — основано на ядрах ОС Mach и FreeBSD, но включает в себя части от MkLinux, NetBSD, OpenBSD и некоторые разработки по Mach. Mac OS X поддерживает системные вызовы от Mach- и BSD-систем. Так как ядро OS X основано в равной степени на Mach и FreeBSD, то ядро Mac OS X xnu содержит две таблицы системных вызовов Mach и BSD и поддерживает API для BSD- и Mach-систем.

Среда времени выполнения

Чтобы поддерживать хотя бы часть наследия предшествующих ОС, Mac OS X имеет трехкомпонентную среду окружения времени выполнения:

  1. Dyld Runtime Environment. Среда времени выполнения, основанная на динамическом загрузчике dyld.
  2. CFM Runtime Environment. Наследие OS 9 служит для поддержки приложений, которые не могут быть запущены dyld, но используют возможности Mac OS X. Эта часть реализована в библиотеке Carbon.
  3. Classic Runtime Environment. Служит для запуска старых приложений для OS 9 в OS X.

Таким образом, в Mac OS X существует возможность запуска различных типов приложений, в том числе и для старых версий операционной системы Mac OS.

macho-формат исполняемых файлов

В Mac OS X почти все файлы, содержащие исполняемый код, такие как приложения, библиотеки, ядерные модули, реализованы как файлы формата macho.

Формат macho не является оригинальной разработкой Apple. Он был разработан Open Source Foundation для их операционной системы OSF/1, основанной на mach, и адаптирован Apple для x86 архитектуры в рамках проекта OpenStep.

Файловый формат macho и спецификация ABI (Application Binary Interface) описывают, как исполняемый файл должен быть загружен и запущен ядром. Они сообщают ОС:

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

Поскольку macho является основным форматом исполняемых файлов в Mac OS X, рассмотрим его организацию более подробно.

Как организован macho

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

Заголовок. Первые четыре байта в заголовке определяют так называемый magic number, который идентифицирует файл как 32- или 64-разрядный. Кроме того, они позволяют определить порядок байт для CPU. Заголовок определяет архитектуру, для которой скомпилирован файл. Это позволяет ядру гарантировать запуск файлов только на той платформе, под которую файл был скомпилирован. Иногда бинарный файл может содержать код более чем для одной архитектуры. Этот формат известен как Universal Binaries. В таком случае файл начинается с fat-заголовка.

Команды загрузки. Область команд загрузки содержит список команд, которые сообщают ядру, как загрузить различные сегменты файла. Эти команды описывают, как каждый сегмент выровнен в памяти, какие имеет права доступа и где располагается в памяти.

Сегменты и секции. Исполняемый macho-файл обычно имеет 5 сегментов:

  • __PAGEZERO. Расположен по нулевому виртуальному адресу и не имеет никаких защит. Этот сегмент не имеет области в файле на диске.
  • __TEXT. Содержит данные с доступом только на чтение и исполнение.
  • __DATA. Содержит данные, доступные для записи. Эта секция отмечена как copy-on-write.
  • __OBJC. Содержит данные, используемые для Objective-C среды исполнения.
  • __LINKEDIT. Содержит данные, используемые для установки динамических связей.

Сегменты __TEXT и __DATA содержат ноль или больше секций. Каждая секция содержит определенный тип данных, например, исполняемый код, константы, строки и т.д. Таким образом, исполняемый и неисполняемый код хранятся в одном сегменте отдельно.

Утилиты для анализа программ

Для анализа программ существует два основных подхода: динамический и статический. Динамический анализ подразумевает запуск программного кода под отладчиком или в виртуальной среде и анализ его поведения. Статический анализ программ — это исследование программного кода с помощью дизассемблера без запуска кода.

Какой подход лучше использовать в каждом конкретном случае, зависит от ситуации. Оба способа — не взаимоисключающие, а зачастую и дополняющие друг друга.

Утилиты для динамического анализа программ

Как и большинство Unix-систем, Mac OS X предоставляет много полезных утилит, которые помогают при динамическом анализе приложений и диагностике системы. Многие из них пришли на Mac из Unix, но есть и программы, которые существуют исключительно для Mac OS X. Ниже мы рассмотрим несколько утилит, которые могут быть установлены из дистрибутива Mac OS X.

Все утилиты можно разбить на две категории.

  1. Утилиты, относящиеся к исследованию процессов:

  • fs_usage — предоставляет информацию о системных вызовах относительно активности по отношению к файловой системе;
  • heap — перечисляет все блоки памяти, выделенные в динамической памяти отдельным процессом;

  • lsof — отображает файлы, открытые в различных процессах;

  • top — отображает статистику использования различных ресурсов в системе;
  • vm_stat — отображает статистику использования системой виртуальной памяти;
  • gdb — отладчик, позволяет отлаживать программы удаленно;
  • ddb — отладчик ядра, требует подключения через последовательный порт;
  • ktrace — служит для отслеживания информации о системных событиях на уровне ядра для указанного процесса;
  • kdump — отображает информацию, сгенерированную программой ktrace;
  • sc_usage — отображает статистику указанного процесса, такую как использование процессорного времени, использование системных вызовов и т.д.

  • Сетевые утилиты.
  • Перечисленные ниже сетевые утилиты хорошо известны в мире Unix:

    • netstat — предоставляет различные данные, относящиеся к сетевой подсистеме;

    • tcpdump — отображает сетевой трафик.

    Для Мас OS X доступны и многие другие знакомые пользователям Unix сетевые инструменты, такие как nmap и WireShark.

    Нужно отметить, что большинство программ с открытыми исходными текстами, которые существуют под Unix, могут быть легко собраны под Mac OS X. Опытный Unix-пользователь может создать себе рабочую среду, мало чем отличающуюся от привычной для него Unix.

    Утилиты для статического анализа

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

    Так как Mac OS X в качестве исполняемых файлов использует файлы macho-формата, то статический анализ в Mac OS X имеет свою специфику.

    Так, основной утилитой для анализа файлов macho-формата является программа otool. С ее помощью можно получить такую информацию, как заголовок файла, команды загрузки, точку входа и даже дизассемблировать содержимое секции, содержащей исполняемый код.

    • file — определяет тип файла;

    • otool — служит для анализа macho-файлов;

    • xxd — позволяет осуществить преобразование бинарного файла в шестнадцатеричное представление и обратно;
    • IDAPro — дизассемблер.

    С ростом популярности Mac OS X на Intel многие производители ПО выпустили версии программ для этой платформы. В новой версии 5.1 Mac OS X включена в список поддерживаемых операционных систем и IDAPro.

    Пользователям, «мигрирующим» с Windows, это существенно облегчит жизнь, к тому же иногда использование IDAPro позволяет выполнить некоторые задачи быстрее и проще, чем использование стандартных средств Mac OS X.

    Примеры анализа вредоносных программ

    В качестве примера попробуем проанализировать IM-Worm.OSX.Leap и Virus.OSX.Macarena, используя, в частности, некоторые из перечисленных утилит. Необходимо отметить, что рассматриваемые ниже вредоносные программы являются концептуальными разработками, не имеют деструктивного эффекта и не представляют серьезной угрозы для пользователей. Основным их назначением является демонстрация возможности создания программ подобного рода.

    Анализ IM-Worm.OSX.Leap

    Leap не может распространяться через Интернет — для этого используется iChat. На первом этапе Leap распространяется через приложение iChat как ссылка на файл на ресурсе RapidShare. При этом утверждается, что это screenshot’ы новой версии Mac OS X Leopard. Получатель должен кликнуть по ссылке, подтвердить загрузку файла, распаковать его и затем открыть. После чего инфицированный компьютер пользователя рассылает файл (без какой-либо модификации) по всему контакт-списку через Bonjour.

    Leap распространяется в виде файла с именем latestpics.tgz. и при распаковке в finder выглядит как jpeg-файл.

    Так как Leap использует spotlight, то он работает только в Tiger (версия Mac OS X 10.4.x). Для запуска Leap нужен InputManager, однако InputManager не работает в ситеме для x86. К тому же бинарный файл содержит код только для PowerPC. Как следствие, Leap работает только на компьютерах PowerPC.

    Для начала анализа выясним формат файла latestpics. Запустим утилиту file с аргументом latestpics #file latestpics. Полученные результаты свидетельствуют о том, что мы имеем дело с файлом формата macho.

    Далее с помощью утилиты otool посмотрим заголовок бинарного файла — #otool -h latespics:

    После этого можно посмотреть точку входа Leap. Точка входа в macho определяется с помощью команды #:otool -l latestpics, которая показывает команды загрузки. В данном случае нас интересует команда LC_UNIXTHREAD, в которой отображается содержимое регистров процессора при старте. На PowerPC нас будет интересовать содержимое регистра srr0 — это и есть точка входа.

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

    • _copySelf
    • _infect
    • _infectApps

    Теперь можно посмотреть на код более внимательно. В этом нам опять поможет утилита otool -vt. С помощью этой утилиты можно посмотреть содержимое секции в сегменте __TEXT, в которой и лежит исполняемый код файла latestpics:

    Системным функциям передаются строки, но они зашифрованы с помощью функции _xor:

    В результате расшифровки мы получим следующие строки:

    /usr/bin/tar -zxf /tmp/hook -C /tmp
    /Library/InputManagers

    /bin/rm -rf /Library/InputManagers/apphook

    /bin/mv -f /tmp/apphook /Library/InputManagers
    ~/Library/InputManagers
    /bin/rm -rf ~/Library/InputManagers/apphook
    /bin/mv -f /tmp/apphook ~/Library/InputManagers
    %s/Contents/MacOS/%s /bin/cp ‘%s’ ‘%s/..namedfork/rsrc’
    /bin/cp -f ‘%s’ ‘%s’
    (kMDItemKind == ‘Application’) (kMDItemLastUsedDate >= $time.this_month)  /usr/bin/ditto %s /tmp/latestpics
    /usr/bin/gzip -f -q /tmp/latestpics

    Анализируя полученные строки, мы понимаем, чем занимается IM-Worm.OSX.Leap:

    • копирует себя в /tmp как latestpics;
    • затем создает tgz;
    • извлекает Input Manager, называемый «apphook.bundle», и копирует его в /tmp;
    • если uid 0, то создается каталог /Library/InputManagers/, удаляются любые существующие apphook, копируется новый apphook из /tmp;
    • если uid не 0, то создается ~/Library/InputManagers/;
    • теперь при запуске любого приложения Mac OS X загружается новый apphook в его адресное пространство;
    • после чего при запуске приложения происходит попытка послать latestpics.tgz через iChat.

    Анализ Virus.OSX.Macarena

    Анализ файла начнем с выяснения его формата. Для этого, как и в прошлый раз, будем использовать утилиту file:

    Вывод file говорит о том, что это файл macho-формата.

    После чего с помощью otool можно посмотреть заголовок файла и определить точку входа:

    Если посмотреть внимательно, то привлекает внимание странная точка входа по нулевому адресу. Следующим этапом должен быть анализ кода, начиная от точки входа. Но тут возникает проблема. Дело в том, что дизассемблировать эту часть macho-файла средствами otool невозможно, так как otool позволяет анализировать только код в секции text сегмента __TEXT.

    В данной ситуации нас сможет выручить IDAPro. Но для этого в IDA надо загрузить файл как binary. После чего можно дизассемблировать файл:

    Macarena является первым вирусом, который действительно заражает файлы macho-формата в текущем каталоге.

    При анализе зараженного файла можно отметить следующее.

    Вирус изменяет точку входа на нулевой адрес. По нулевому адресу в macho загружается сегмент __PAGEZERO. Как уже отмечалось ранее при рассмотрении структуры macho, __PAGEZERO не имеет места в файле на диске. Поэтому в файле на диске сам код записывается в конец файла. Такая техника имеет неожиданный эффект: такие приложения как gdb, IDA или otool не показывают код вируса.

    Macarena — достаточно простой вирус. Когда он выполняется, он перебирает файлы в текущей папке и заражает файлы macho-формата для x86 архитектуры. Существуют более новые версии вируса, которые заражают и ppc-файлы, в остальном они аналогичны предыдущим версиям.

    Никакого другого эффекта вирус не имеет.

    Заключение

    Mac OS X с каждым днем приобретает все большую популярность. Хотя сейчас для этой операционной системы существуют только концептуальные программы, с увеличением числа пользователей Mac OS X будет увеличиваться и интерес злоумышленников к ней. В связи с этим все чаще возникает необходимость анализа программ для Mac OS X.

    К счастью, в состав Mac OS X включено много полезного инструментария как для анализа отдельных программ, так и для диагностики системы в целом. Кроме того, появляются программы сторонних производителей, которые также помогают специалистам, равно как и тем, кто просто любит заниматься исследованием программ.

    Публикации на схожие темы

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

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