java-mobile

java на мобильных телефонах — атаки и угрозы

крис касперски, no-email

многие компании активно используют сотовые телефоны в служебных целях, доверяя им не только связь, но и конфиденциальную информацию, совершенно не задумываясь о возможных последствиях. практически все модели телефонов содержат серьезные дефекты в системе безопасности и количество хакерских атак на них неуклоннорастет. наибольшую угрозу представляют java-мидлеты скачиваемые пользователями из различных ненадежных источников в полной уверенности, что «безопасная» java не позволит им сделать ничего дурного. настало время развеять это заблуждение!

За последние несколько лет сотовые телефоны резко «поумнели». Сначала они обзавелись быстрыми процессорами и емкой энергонезависимой памятью, затем в них появились встроенные фото/видеокамеры и протоколы, ориентированные на передачу больших объемов данных через Интернет. Фактически, телефон превратился в миниатюрный компьютер, а компьютеру, как известно, нужны программы и программы вскоре пошли косяками — игры, записные книжки, органайзеры, платежные системы, картографические приложения, средства навигации…

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

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

Информация из записной книжки представляет огромный интерес как для журналистов типа «папараци», так и для лиц, занимающихся промышленным шпионажем, поскольку, позволяет не только установить телефоны влиятельных лиц, но и узнать некоторые «интимные» подробности их жизни, существенно упрощающие «психологические» атаки типа социального инженеринга.

Фотографии, снятые встроенной камерой, это настоящая кладезь информации. Очень часть сотовый телефон используется для оперативной съемки «интересных» событий или технологических процессов, не предназначенных для посторонних глаз, не говоря уже про портреты в стиле «ню», которые (если хорошо покопаться) можно найти практически у каждого. Наличие высокоскоростных сетевых протоколов позволяют зловредным мидлетам скрытно передавать содержимое памяти телефона на какой-нибудь анонимный ftp/smtp-сервер или на другой сотовый телефон.

Наконец, аппарат может быть «порабощен» спаммером, рассылающим SMS-сообщения или даже обыкновенные письма через протокол GPRS. Ну и что с того, что GPRS это медленно?! Ведь трафик все равно не свой, а система защиты в сотовых телефонах намного слабее, чем в персональных компьютерах.

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

С высоты птичьего полета архитектура J2ME для CLDC-устройств выглядит следующим образом (см. рис. 1). Но для начала несколько пояснений касающихся используемой терминологии (наплодили тут аббревиатур, понимаешь!). Сокращение J2ME расшифровывается как «Java 2 Platform, Micro Edition»то есть Java-платформа версии 2, специальная редакция микро-устройств. CLDC, в свою очередь означает: Connected Limited Device Configuration (Конфигурации Коммуникационных Устройств с Ограниченными Ресурсами). В общем, Java для мобильных телефонов, КПК и смартфонов.

J2ME-приложение, называемое мидлетом (от англ. MIDlet), начинает свой жизненный путь с предверификатора (preverifier), анализирующего байт-код на предмет выявления откровенно «левых» вещей.

Проверенный байт-код передается в MIDP — Mobile Information Device Profile (Профиль для Мобильного устройства с Информационными функциями), в сферу компетенции которого входят следующие функции:

  1. жизненный цикл мидлета (инсталляция, удаление, обновление, запуск, остановка, пауза, возобновление работы);
  2. безопасность и авторизация доступа к защищенным функциям (например, коммуникационным);
  3. графический интерфейс (в том числе низкоуровневый, пригодный для программирования игр);
  4. ввод команд пользователя (например, посредством клавиатуры);

Для абстрагирования от конкретного оборудования MIDP обращается к CLDC-библиотеке, экспортирующей все жизненно важные функции (кстати говоря, CLDC версии 1.0 не поддерживала плавающей арифметики и ее — там где она нужна — приходилось эмулировать непосредственно самому мидлету).

Байт-код (включая код библиотеки CLDC) исполняется на виртуальной Java-машине, обозначаемой аббревиатурой KVM (K-Virtual Machine, буква «K» по-видимому никак не расшифровывается), а сама виртуальная машина опирается на API-функции операционной системы (Operating System), натянутой поверх аппаратного обеспечения (Hardware).

Для увеличения производительности, Java-машина оптимизирует код (компонент Java code Compact или, сокращенно, JCC), применяя вполне традиционные алгоритмы оптимизации общие для всех языков. Собственного названия удостоилась лишь одна технология — ROMizing («ромизация»), обеспечивающая упреждающую предзагрузку и связывание (prelink) классов, что замедляет загрузку, но увеличивает производительность мидлета во время его выполнения.

Рисунок 1 схематическое устройство мобильной версии Java-машины

Теперь, разобравшись с основными концепциями, перейдем к реальным атакам на сотовые телефоны, рассмотрев самые интересные (и актуальны из них).

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

Известное изречение гласит: защита как столб — ее трудно перепрыгнуть, но легко обойти. И точно! Хакерской группе «The Phenoelit Hackers group» удалось найти брешь в обороне Siemens S55. Вывести запрос на подтверждение («allow SMS 15142467980 – Yes/No») конструкторы вывели, а вот заблокировать дисплей забыли, в результате чего мидлеты получили возможность перезаписать оригинальный текст, заменив ее каким-нибудь безобидным вопросом в стиле «Wanna Play?» («Ну, что, будем играть или как?»). Пользователь нажимает «Yes» и SMS-сообщение скрытно уходит адресату.

Рисунок 2 подмена оригинального запроса отправки SMS на предложение сыграть в игру

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

Рисунок 3 телефоны Siemens по атакой

А вот у телефонов Motorola V600 и Nokia 3600 в этом отношении все нормально, поскольку они блокирует дисплей перед выводом любых запросов на подтверждение:

Void PermissionDialog(…) запрос на подтверждение отправки SMS { … PermissionForm.setCommandListener(this); блокировка дисплея от изменений

displayManager.preemptDisplay(token, this, form, true);

}

private void SetAnswer(…) отправка SMS { … снятие блокировки с дисплея

displayManager.donePreempting(preemptToken);

notify();

}

Листинг 1 фрагмент Java-кода, выдранный из Motorola V600, обеспечивающий защиту запроса на подтверждение отправки SMS

Когда мидлету требуется сохранить некоторые данные в энергонезависимой памяти, то он это делает не напрямую, а через специальный интерфейс, обеспечивающий управление хранилищами (Record Stores).

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

Физически хранилища представляют собой группы записей (Record), а записи есть ни что иное как обыкновенные массивы байт. Доступ к хранилищем осуществляется по уникальному имени, состоящему из: имени производителя (Vendor Name), имени мидлита (MIDlet Suite Name) и имени записи (Record Store Name). Записи, принадлежащие различным миделетам, могут иметь совпадающие имена и никакой неоднозначности тут не происходит (точно как разные каталоги могут содержать одноименные файлы).

Хранилищами заведует Система Управления Записями — Record Management System или, сокращенно, RMS, гарантирующая что данные одного мидлета не попадут к остальным без его согласия. Программисты, уверенные в непогрешимости защиты, сплошь и рядом помешают в хранилища секретные данные, надеясь, что никакой хакер их не утянет.

Рисунок 4 использование низкоуровневого API для доступа к чужим хранилищам

В действительности, большинство производителей реализуют RMS-системы на языке Java, предоставляя высокоуровневые API-функции (High level MIDP API), вызываемые мидлетами и выполняющие все необходимые проверки (см. рис. 4). Однако, если спуститься на одну ступеньку вглубь, мы обнаружим низкоуровневые API-функции (Low level API), так же доступные мидлетам и позволяющие обращаться к любому хранилищу без каких бы то ни было проверок вообще (в первую очередь следует обратить внимание на класс RecordStoreFile, название которого готовит за себя).

Кстати говоря, хранилища обычно размещаются в одном из файлов и потому доступы для просмотра через штатный проводник или функции файлового ввода/вывода. Теоретически, хранилища должны быть зашифрованы, чтобы никакой мидлет не смог добраться к ним через файловую систему, однако, в некоторых телефонах они хранятся в открытом виде! В частности, на Nokia 3650 хранилища сосредоточены в файле rms.db, находящемся в текущем каталоге мидлета (т.е. лежат там же, где и Jad/Jar-файлы), что делает их легкой жертвой для атаки.

Рисунок 5 незашифрованный файл rms.db на Nokia 3650

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

Единственный выход — скачивать мидлеты _только_ из надежных источников, желательно многократно проверенных на друзьях и знакомых. Конечно, это не защит от атак на 100%, но существенно снизит их вероятность.