Меня зовут Рик Батлер, а это Карл Кошер, и мы хотим поговорить с вами о чтении, создании, загрузке и использовании кода на SIM-картах.
Этот проект начался в прошлом году, когда я узнал о мероприятии Tourcamp 2012, хакерском лагере на побережье штата Вашингтон, таком как DEFCON на месте.
Никаких отелей, проживание в палатках на открытом воздухе, это был уже второй лагерь, первый мне очень понравился, я пригласила друзей и мы решили поехать туда.
Это мероприятие было посвящено запуску сети GSM в нескольких районах США, и моей задачей было раздобыть для этого несколько SIM-карт.
Я ничего не знал о том, что такое SIM-карты, поэтому мне пришлось провести небольшое исследование и выяснить следующее:
- SIM, или Модуль идентификации абонента, представляет собой модуль идентификации мобильного абонента;
- SIM-карта имеет идентификационный ключ IMSI и симметричный ключ Ki;
- имеет встроенный модуль безопасности, не позволяющий извлекать или клонировать ключи;
- они используются операторами GSM, а в настоящее время также LTE (сеть Verizon 4G);
- также может запускать приложения.
Оказывается, давным-давно, когда не было ни айфонов, ни андроидов, приложения располагались на сим-карте.
Телефон представлял собой простую звонилку - из него можно было вынуть симку и вставить ее в другой телефон вместе со всеми своими контактами, программами и так далее.
Некоторые операторы, например Telcom, были владельцами SIM-карт, контролируя установленные на них приложения.
Десятилетие спустя все радикально изменилось.
Сегодня SIM-карта — это крошечный карманный компьютер, которым вы не можете управлять.
Однако многие принципы работы середины 90-х сохранились до сих пор, и я попытался понять, как это все работает. У меня была прекрасная возможность поиграть с SIM-картами в лагере, и я подумал, что было бы неплохо получить карты, на которых можно запускать приложения.
Это была непростая задача, потому что есть много операторов, которые хотят продать примерно 500 тысяч таких карт, а нам нужно было только 500. Большинство операторов заставляют вас подписывать соглашение о неразглашении, чего мы не хотели делать, поскольку собирались рассказать им все, что узнаем, изучая эти карточки.
Некоторые карты, которые мы обнаружили, поддерживали приложения, но не поддерживали GSM, и это нас не устраивало.
Также было слишком мало документации по их программированию.
Нам потребовалось немало времени, чтобы обобщить всю найденную информацию, но мы узнали много интересного о технологии программируемых SIM-карт. Сим-карты, которые нам в итоге удалось получить, обладали такими характеристиками.
У них был свой процессор AVR, не похожий на Arduino, с 64 КБ памяти и крохотными 6 КБ ОЗУ.
Они назывались JavaCard и работали на частоте от 20 до 30 МГц, поэтому у этих миникомпьютеров были свои ограничения.
На основе этих сим-карт мы придумали собственную сотовую сеть для нашего лагеря.
Я хотел, чтобы люди, которые придут в лагерь, выберут палатку, зарегистрируются и получат график, получат наши SIM-карты на входе для использования в общей внутренней сети под названием Shadytel.
Так мы раздали более 400 из наших 500 карточек, и у каждого появился свой номер мобильного телефона.
Наша экспериментальная сеть имела следующие возможности:
- все звонки и текстовые сообщения были бесплатными;
- люди за пределами лагеря могут позвонить вам на мобильный телефон, используя префикс 1-337-422-4364 перед вашим номером;
- Вы можете создать свой собственный кодировщик SMS, используя наш API, размещенный на В сети ;
- SIM-карта поддерживает программное обеспечение JavaCard v.2.1.1. и апплеты STK, и на том же сайте вы можете узнать о создании собственных апплетов;
- для вызова службы 911 требовалось использовать другую сеть, поскольку наш Shadytel не поддерживает такой вызов.
Кроме того, в нашей сети появилась возможность бесплатно звонить куда угодно, так что вы могли позвонить даже своей маме в Австралию.
Наша сеть была очень функциональной и совсем не дорогой, у нас даже была лицензия Федеральной комиссии по связи США (FCC), поэтому наша сеть работала совершенно легально.
Давайте рассмотрим, что позволяют приложения или апплеты, которые мы запрограммировали на SIM-картах.
Они работали на процессоре SIM-карты независимо от телефона, поэтому он даже «не видел», что происходит, и в зависимости от используемой операционной системы подключались напрямую к BaseBand (в случае iPhone).
Приложения можно было устанавливать удаленно на карту в режиме «тихой установки» с помощью носителя.
Что такое «перевозчик», я объясню чуть позже.
Сегодня большинство операторов SIM-карт поддерживают такие приложения.
Наши карты поддерживали несколько приложений, которые были выбраны с помощью AID и управлялись стандартным приложением выбора карт Card Manager. По сути, поддержка GSM «SIM» — это просто приложение на физической интегральной карте (UICC).
Вот что могут делать наши апплеты:
- выполнять обычные функции сотовых телефонов с помощью программного интерфейса ОС – отображать текст, меню, воспроизводить мелодии звонка, читать входящие сообщения;
- работа с современными «смартфонами» (и «тупыми» тоже);
- загрузить URL;
- отправлять SMS, инициировать звонки и услуги обмена данными;
- получать и реализовывать такие события, как подключение и отключение вызовов, а также выполнять еще около 200 функций, доступных обычным SIM-картам;
- взаимодействовать с другими SIM-картами;
- выполнять произвольные AT-команды на телефоне для управления GSM-модемом.
Сейчас Карл расскажет вам, как работают наши приложения.
Мы использовали следующие технологии:
- SmartCard – физическое соединение между SIM-картой и телефоном, как и любая смарт-карта;
- Java Card – программирование на Java для смарт-карт, являющийся самым простым способом написания приложений, появилось в начале 90-х годов;
- SIM Toolkit (STK) API — интерфейс взаимодействия приложений и интерфейс операционной системы смартфона, позволяющий карте «общаться» с телефоном, получая и передавая от него события;
- GlobalPlatform — стандарт загрузки и управления приложениями на SIM-карте, разработанный создателями системы VISA.
Особенностью смарт-карт является несъемность ключей и процедура шифрования-дешифрования, благодаря которой можно использовать персональные данные, такие как пароли и логины, для доступа к банковской системе, ЭЦП и доступа к спутниковому телевидению.
За это отвечает параметр CLS. Ниже приведены инструкции по обработке информации INS. Пакеты APDU представляют собой поток байтов, который описывается параметрами P1 и P2, а также дополнительными записями, такими как длина данных LC, сами данные и расширение длины LE. На следующем слайде вы видите JavaCard. Это Java и в то же время не совсем Java, потому что здесь нет никакого мусора, никаких букв, строк, многомерных массивов.
Если вам повезет, вы сможете найти несколько типов данных int. Структура этих карт чрезвычайно проста.
Само собой, здесь нет стандартных API, типов файлов или тем, от проверки можно избавиться, но есть некоторые исключения.
Выборки и классы переменных хранятся в памяти EEPROM, имеющей ограниченное количество циклов записи, примерно 500 тысяч.
Поэтому в зависимости от типа карты могут возникнуть проблемы с обновлением этих переменных.
Расскажу, как мы создавали свои приложения для смарт-карт. Доступно несколько специализированных коммерческих IDE, но мы можем обойтись и без них, поскольку, во-первых, мы хотели сделать наши приложения максимально открытыми для всех, а во-вторых, эти коммерческие инструменты стоят около 3000 долларов.
С сайта Oracle мы скачали бесплатный редактор Java Card Development Kit. Если вы используете Eclipse, вам необходимо удалить с карты стандартную библиотечную систему JRE (Java Runtime) и добавить библиотеку Java Card, которая поможет описывать классы и тому подобное.
Кроме того, мы сами написали несколько программ, облегчающих работу.
Приложение STK работает следующим образом:
- приложение загружается на карту;
- приложение регистрируется с помощью SIM Toolkit API;
- телефон сообщает СТК о своих возможностях, а СТК сообщает телефону о зарегистрированном приложении.
Вот как выглядит наш код.
Java позволяет установить класс карты двумя стандартными методами: созданием и регистрацией класса с помощью Java Runtime и установкой класса с помощью набора инструментов SIM. Последний способ используется, когда какое-то событие нужно перенести на карту с телефона.
На следующем слайде показано, как выглядит приложение, которое мы создали для Tourcamp. После активации карты вы сможете выбрать одну из доступных сетей.
При перезагрузке и подключении к нашей сети вас спросят, хотите ли вы включить шифрование, и это еще одна интересная особенность нашего приложения.
Он позволяет сохранять подсказки на защищенном устройстве, чтобы их невозможно было оттуда получить.
Мы также внедрили маркеры вторжений, которые сообщают вам, были ли эти запросы просмотрены кем-либо, и позволяют просматривать контент удаленно, о чем я расскажу позже.
Предупреждаю, что программный код нашего приложения выглядит довольно некрасиво.
Если вы помните, здесь нет ни строк, ни групп, поэтому мы вынуждены создавать массивы отдельных байтов с отдельными символами.
Это довольно болезненный процесс, но мы его пережили.
Далее мы программно описали процедуру самостоятельной регистрации приложения с помощью SIM Toolkit, процесс выбора программы в меню телефона, вывода подсказок на экран и другой функционал.
Мы постарались все записать, как могли, выглядит ужасно, но работает. Полное описание программы представлено на нашем сайте, поэтому вам не нужно запоминать то, что показано на этих слайдах.
Теперь наш репортаж продолжится с Ориком.
Самый простой способ — использовать старую кодировку Java версии 1.1 и версию совместимости кода 1.3. После создания файлов классов необходимо перекодировать их для Java Card. Для этого используйте конвертер, доступный в нашем SDK. Вам также понадобятся некоторые идентификаторы приложений (буквально на одну минуту), каталог экспорта API и так далее.
Эти файлы должны быть понятны ОС телефона, поэтому они выполнены в формате .
jar.
Мы также разработали специальную программу Makefiles, которая доступна В сети .
Конвертер создает файл CAP, который представляет собой Zip-архив компонентов CAP (код Java Card).
Одним из важных вопросов, на который нужно было ответить перед началом работы над проектом, был вопрос о том, как взаимодействовать с SIM-картой.
Нам нужен был картридер.
Они бывают двух типов: для подключения к порту PCSC (PC/Smart Card API) и для подключения к последовательному порту.
Первые обычно универсальны, поэтому для работы с SIM-картой стандартного размера необходимо иметь переходник, а вторые гораздо меньше и используются специально для SIM-карт.
Функциональной разницы между ними нет, но вариант PCSC более удобен в использовании.
Он использует официальное программное обеспечение, разработанное специально для API и упрощающее его использование на вашем компьютере.
Кроме того, существует множество приложений с открытым исходным кодом для работы с SIM-картами, использовать которые проще с опцией PCSC. Все картридеры одинаковы, поэтому я использовал самый дешевый SCR3500, купленный на eBay за 8 долларов.
Итак, мы написали этот ужасно выглядящий код, затем прогнали его через компилятор Java и преобразовали в CAP-файл.
Далее мы попытались поместить его на SIM-карту, для чего использовали популярный GPSshell Tool, но ничего не получилось.
Продавец сим-карты посоветовал нам еще одну программу с простым и удобным интерфейсом, которую нигде не удалось найти, а затем пообещал продать ее нам за 600 долларов, хотя этой программы у него тоже не было.
Поэтому мы использовали программу под названием SIM Alliance Loader, на слайде ниже показано ее окно.
Мы использовали первую версию этой программы, но теперь доступна и вторая версия.
SIM Alliance — группа, занимающаяся разработкой программного обеспечения для работы с SIM-картами.
SIM Alliance Loader представляет собой адаптацию Java-приложения для Windows и предназначен для специалистов, знающих, что они делают.
Но если разобраться в вопросе, перенос приложения на сим-карту займет буквально пару минут. Однако, учитывая, что у нас было около тысячи карт, которые мы хотели подготовить для Tourcamp, такая технология записи заняла бы слишком много времени, поэтому мы решили использовать что-то более производительное.
Вот почему мы обратились к Глобальной платформе — стандарту для загрузки, установки и управления приложениями на карте Java Card. В зависимости от приложения это программное обеспечение позволяет использовать протоколы и команды, а также шифрование и аутентификацию.
Также он позволяет выполнять некоторые внешние процедуры без участия SIM-карты, например, проверку двоичных кодов наших апплетов.
В ходе работы выяснилось, что все приложения загружаются и авторизуются в приложении Issuer Security Domain (ISD) — системе аутентификации Global Platform. На практике это означает, что вы не сможете загрузить на карту приложение, если вы не разработали его самостоятельно, но есть исключения, описанные в работе Карстена Ноула.
Пустые SIM-карты Global Platform имеют приложение ISD по умолчанию, но нашим картам гораздо сложнее получить к нему доступ, поскольку у них по умолчанию установлено приложение GSM и нет даже возможности доступа к приложению Global Platform. Кратко опишу процедуру установки нашего приложения на сим-карту.
Процесс состоит из двух этапов: команда ЗАГРУЗИТЬ (загрузка массива двоичных кодов) и команда УСТАНОВКА (создание экземпляра приложения на SIM-карте).
Отдельные компоненты CAP объединяются и отправляются на карту блоками с помощью команды LOAD. В этом процессе участвуют три типа идентификатора приложения (AID):
- Идентификаторы приложений, связанные с загрузочным файлом;
- модульные AID, связанные с основным классом карты;
- отдельные AID, используемые при выборе определенного параметра.
Единственный способ «общаться» приложения Global Platform с нашей SIM-картой — это механизм передачи данных «по воздуху», то есть с помощью SMS-сообщений.
На самом деле мы не отправляли традиционные СМС, а просто генерировали команды на карте с помощью СМС-пакетов.
Это был долгий и достаточно трудоемкий процесс.
Для стандарта GSM 03.48 он заключался в использовании CAT-оболочки (AoC2), позволяющей совершать с картой нужные нам действия.
Первый этап процесса включает загрузку SMS PP (D1), который, в свою очередь, состоит из идентификации устройства и пакета данных транспортного протокола SMS TPDU.
SMS TPDU включает заголовок и пользовательские данные.
Пользовательские данные также включают в себя заголовок, пакет команд, подзаголовок (настройки безопасности, выбор приложения).
Он, в свою очередь, использует 3-байтовый идентификатор TAR (я удивлен, что PowerPoint выдержал такую ерунду).
На этом внутренний лимит данных заканчивается, и в самом конце списка находится тот самый APDU, который так нужен нашей Глобальной Платформе.
Таким образом, весь этот громоздкий механизм служит для передачи крошечного объема данных.
На случай, если вы не хотите этого делать, есть другой механизм удаленной отправки APDU на SIM-карту.
Для отправки SMS с командами установки требуется использование сотовой связи, что требует сетевой аутентификации.
Однако Карстен Ноул описывает метод, когда ошибки шифрования позволяют получить ключи симметричного алгоритма шифрования DES методом перебора, то есть без аутентификации в сети.
Загрузочный скрипт Shadysim написан на Python и работает на OSX, Linux и Windows. На следующем слайде показано, как это выглядит. Загрузка осуществляется с помощью ПК, к которому подключен картридер с SIM-картой.
На следующем слайде показаны параметры, которые необходимо задать для установки приложения на карту.
Здесь задается основной класс карты, резервируется физическая и оперативная память, определяется размер текстового меню, которое будет отображаться на экране смартфона, пишется команда на запуск Toolkit и так далее.
Вы можете ввести любые другие параметры, используя шестнадцатеричный код. Наконец, с помощью параметра -t вводится список приложений, позволяющий обновить телефонную книгу.
Как мы узнаем, что наше приложение работает? Рик расскажет вам об этом.
На следующем слайде показано, как выглядит работающее приложение.
Слева — скриншот программы, работающей на Python, посередине — меню настроек iPhone с пунктом «SIM-приложения» и иконкой нашей программы на вкладке «Приложения» для смартфонов под управлением Android.
Карл рассказал вам, насколько сложно программировать, но тестировать было не проще.
Для того, чтобы проверить, работает ли наша программа, нам пришлось сделать следующее:
- выключить телефон;
- извлеките сим-карту, а еще лучше — аккумулятор;
- вставьте SIM-карту в картридер;
- загрузить новый код;
- извлеките карту из картридера;
- вставьте его обратно в телефон и вставьте аккумулятор;
- дождитесь, пока телефон загрузится;
- проверьте, работает ли код.
Как можно ускорить и упростить эту процедуру? Для этого можно использовать эмулятор Android для SIM-карт. Существует открытый ресурс SEEK, который представляет собой Android SDK. Он включает в себя патчи для получения доступа к SIM-карте или SD-карте через USB-кардридер PCSC и предотвращает конфликты несовместимости SIM-карт при подключении к компьютеру и телефону.
Вы запускаете эмулятор Android на своем компьютере и тестируете свою карту без использования смартфона.
Можно ли использовать смартфон в качестве кард-ридера? Карл ответит на этот вопрос.
Дело в том, что большинство радиоинтерфейсов не позволяют осуществлять прямую связь с SIM-картой.
Эту проблему можно решить с помощью протокола удаленного доступа к SIM-карте.
Этот метод существует в Европе под названием «удаленный доступ к SIM-карте через Bluetooth».
Это профиль со встроенной функцией аутентификации.
Ему нужно написать приложение, которое сможет отправлять и получать APDU. Однако в некоторых случаях этот метод может превратить ваш смартфон в «кирпич», поэтому не стоит устанавливать этот профиль на все смартфоны подряд. Я хотел бы познакомить вас с будущими направлениями наших разработок.
Комплект STK — отличный инструмент, но он имеет ограничения в использовании.
Возникает вопрос, возможно ли создать SMS-ботнет? Ведь SIM-карты предназначены для общения через сотовую сеть и не требуют операционных систем для обмена информацией, поэтому их можно объединить в общую сеть.
Интеграция Android-приложений с апплетами SIM-карт также открывает широкие возможности, например, хранение безопасных приватных SSH-ключей для авторизации на SIM-карте и безопасные транзакции с электронной валютой BitCoin. У нас есть идея использовать Android-приложения по технологии ОТА — «обновление программ по воздуху», используя для этого SMS-пакеты.
Еще одно направление — улучшение функций NFS, об этом вам расскажет Рик.
Например, используя однопроводной протокол SWP, можно будет установить прямое соединение между SIM-картой и контроллером NFS. Это означает, что ваша SIM-карта сможет работать напрямую, без помощи операционной системы телефона, так же, как работают банковские карты VISA или MasterCard.
SIM-карта сможет работать как элемент безопасности или использоваться в мобильных платежных системах ИГИЛ.
Это американская система, которая внедряется очень медленно, она сочетает в себе мобильный банкинг и мобильную связь телекоммуникационных компаний, и наша идея может быть для них полезна.
SIM-карта также может помочь восстановить утраченный контроль над магазином мобильных приложений.
Использование SIM-карты в качестве элемента безопасности возможно благодаря следующим свойствам:
- Сегодня процессор SIM-карты находится внутри большинства мобильных устройств под управлением Android;
- SIM-карта обычно является частью контроллера NFS;
- Элемент безопасности использует ту же технологию, что и SIM-карты;
- SIM-карту можно использовать для электронного кошелька Google Wallet.
При желании вы можете скачать наше приложение В сети , для работы вам потребуются определенные устройства стоимостью не более 20 долларов, например картридер.
Там же вы сможете найти слайды этой презентации, скрипты для апплетов, программу Makefiles для Java Card, патчи для эмулятора Android и много других полезных вещей.
Спасибо, что остаетесь с нами.
Вам нравятся наши статьи? Хотите увидеть больше интересных материалов? Поддержите нас, разместив заказ или порекомендовав друзьям, Скидка 30% для пользователей Хабра на уникальный аналог серверов начального уровня, который мы придумали для вас: Вся правда о VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps от 20$ или как правильно расшарить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40 ГБ DDR4).
Dell R730xd в 2 раза дешевле? Только здесь 2 x Intel Dodeca-Core Xeon E5-2650v4 128 ГБ DDR4 6x480 ГБ SSD 1 Гбит/с 100 ТВ от 249 долларов США в Нидерландах и США! Прочтите об этом Как построить корпоративную инфраструктуру класса, используя серверы Dell R730xd E5-2650 v4 стоимостью 9000 евро за копейки? Теги: #информационная безопасность #github #программирование #Конференции #SIM-карты
-
Быстрый Конвертер Wmv Для Быстрого Времени
19 Oct, 24 -
Вышла Вторая Альфа Kubuntu Hardy
19 Oct, 24 -
С Днем Защитника Отечества
19 Oct, 24 -
Хороший Неттоп От Ripple.
19 Oct, 24