Приветствую всех!

Думаю, многим из вас доводилось слышать такое утверждение, что SIM-карта — по сути полноценный специализированный компьютер. А раз симка — это компьютер, то, очевидно, должен быть и софт для него. Как насчёт попробовать что-нибудь написать и заставить это работать прямо на карте? Давайте разбираться.



Итак, в сегодняшней статье поговорим про эту довольно редко упоминающуюся сторону сотовой связи. Узнаем, как писать приложения, чтобы они запускались на всех телефонах, от Nokia 3310 до последних айфонов. Попутно выясним, как загружать их в SIM-карты и насколько сложно это сделать, и, конечно же, напишем наш первый апплет. Традиционно будет много интересного.

Суть такова


По уже сложившейся традиции каждый год десятого января я выкатываю пост про сотовые сети. И если раньше я традиционно рассказывал про антенны, трансиверы, базовые станции, то в этот раз мы взглянем на достаточно редко рассматриваемую составляющую мобильной связи: SIM-карты и всё, что с ними связано.

Если вы хотя бы немного интересовались сотовой связью, то наверняка знаете, что симка — не просто чип EEPROM в виде карточки, а по сути полноценная система на чипе, имеющая собственные процессор, память, ПЗУ, периферийный контроллер и другие составляющие. И мне всегда было интересно, кто же всё-таки пишет софт, работающий на таком компьютере, как это вообще происходит и как он развёртывается на SIM. До этого всё моё знакомство с карточками ограничивалось лишь таковыми с магнитной полосой и (немного) бесконтактными EMV.


VasiliyLiGHT понимает, о чём я

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

Краткое введение в контактные смарт-карты


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



Думаю, многие из вас замечали, что симка, будучи ещё не извлечённой из пластиковой карты, по размером в точности соответствует банковской карте (а любители ретро-телефонов вспомнят про полноразмерные карточки, применявшиеся в первых GSM-трубках). Точно такими же свойствами обладают карты доступа, электронные пропуска и многио чего ещё. Так вот, это неслучайно. SIM-карта — частный случай контактной смарт-карты, а практически все они соответствуют стандарту ISO7816. Он определяет распиновку карты, расположение чипа на ней, протокол обмена и многое другое.

При начале работы с картой считыватель активирует питание и подаёт сигнал сброса. В ответ на это карточка отсылает ATR (Answer to Reset) — строку байт, позволяющую хосту определить, что это за карта и что она делает. После установления соединения считыватель может общаться с картой при помощи команд APDU (Application Protocol Data Unit). Что это за команды и какие они передают данные, зависит от того, для чего предназначена карта и какие на ней есть приложения.

Что же это за приложения? Зависит от смарт-карты. Их можно поделить на два типа:

  • Native. Внутри стоит по сути обычный микроконтроллер (чаще всего это мелкий PIC с микросхемой памяти, так же может быть и какая-то дополнительная периферия типа криптопроцессора) с контроллером интерфейса ISO7816. Соответственно, программисту требуется вручную обрабатывать приходящие к нему APDU. Такими были первые симки, а также старые чиповые банковские карты по типу «Золотой короны» (они, к слову говоря, были на процессорном ядре MC68000). Эти смарт-карты тоже представляют некоторый интерес, но о них поговорим как-нибудь потом.
  • JavaCard. Эти экземпляры устроены куда сложнее. Они имеют в себе куда более мощное процессорное ядро, память со своей файловой системой и много чего ещё. Но что самое главное — на них запускается Java-машина (ввиду необходимости тотальной экономии ресурсов довольно серьёзно урезанная, если сравнивать с ПК, J2ME и другими девайсами), позволяющая писать приложения (апплеты, они же кардлеты) на куда более высокоуровневом языке. Эти приложения загружаются в память карты и вызываются оттуда хостом. При этом разработчику уже не нужно заниматься ерундой типа работы напрямую с контроллером интерфейса, здесь всё гораздо проще. Именно о таких картах мы и поговорим.

Приложения могут быть абсолютно любыми, на усмотрение разработчика. В некоторых областях есть свои стандарты, например, карты EMV. Для GSM такой тоже есть, и называется он STK.

SIM Toolkit




Для обывателя приложения SIM не ассоциируются ни с чем хорошим. Именно благодаря этой функции работает «меню SIM» в телефоне. Это тот самый раздел, где неловкое нажатие (особенно если телефон дали детям), и вот вы уже подписаны на кучу «занимательных фактов» 18+, анекдоты, какие-то новости и прочую ересь. Но, само собой, одним лишь меню функционал STK не ограничивается. Именно благодаря ему (точнее, одному из приложений) при вставке симки в новый телефон запрашивается конфигурация точек доступа для интернета, именно STK позволяет выводить всплывающие поверх экрана уведомления о новых услугах (чем одно время очень бесил Tele2), именно с его использованием написаны более низкоуровневые приложения, реализующие все остальные функции симки. Также установленные приложения могут вообще не иметь никакого отношения к сотовой связи, вот, например, работа с квалифицированной электронной подписью при помощи заранее заряженной симки. Нечто подобное могут предоставить имеющие контракт с оператором банки и иные организации. И, наконец, именно SIM Toolkit реализует основную функцию симки — хранение ключей и авторизацию в сети. Реализация STK одинакова для всех телефонов, поэтому для разработчика апплетов не имеет значения, в какую трубку вставлена симка. Как нетрудно догадаться, этим софтом мы сегодня и будем заниматься.

Что нужно, чтобы записать свой софт на симку?


Перейдём к самому главному: что же нужно, чтобы запустить своё приложение? До детального знакомства с данной темой я представлял, что там наверняка будет куча непреодолимых для обывателя нюансов типа так и не слитой документации под NDA или необходимости раздобыть какие-то спецкарты и не менее редкий софт для работы с ними, но, как оказалось, порог вхождения не самый высокий — понадобится знать Java на уровне чуть большем, чем «Hello, world!», иметь представление о том, что такое Python, и уметь работать с консолью в линуксе. Из железа понадобится раздобыть считыватель смарт-карт, а также симку с известными административными ключами. Само собой, для «рабочей» карты никто таких ключей не даст, а известны они лишь оператору, который её выдал. Поэтому, как и в опытах с LTE, понадобятся программируемые. Выбор их довольно таки уныл.



Первый вариант — уже упоминавшийся Gialer. Нужна именно версия с поддержкой JavaCard, базовая не подойдёт.



Второй вариант — не менее знаменитый в узких кругах Sysmocom. Их симки поддерживают JavaCard даже в самой дешёвой версии. Есть достаточно много различных их модификаций, подойдёт практически любая (кроме eSIM, конечно).
По сути в этом и есть вся сложность — достать подобные артефакты под силу далеко не каждому. Но у меня они есть, так что приступим к экспериментам.

Обзор оборудования


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



А вот и наша симка. Это довольно старая модель sysmoUSIM-SJS1. Она не имеет ряда функций, присущих новым симкам (в частности, в ней нет поддержки SUCI, нужной для работы 5G), но сейчас это не так важно.



Обратная сторона.



Считыватель смарт-карт и плата-переходник, всё те же, что и в прошлых опытах.



Также понадобятся телефоны, в которых мы будем тестировать нашу карточку. Вот, например, легендарный Siemens CX75.





А вот старенький смартфон ZTE.



Ещё немного трубок.

Ставим софт


Теперь очередь софта. Казалось бы, всё просто: скачиваем то, что было в тех инструкциях, выполняем команды, и в путь. Но, сами понимаете, будь оно так, не было бы и этой статьи. Osmocom советует скачать некий shadysim.py, но есть проблема: он очень старый и не обновлялся уже давно, чего не скажешь о зависимостях. Написанный ещё для Python2 скрипт собирает сотню ошибок при попытке его запустить и упорно оказывается работать. Можно, конечно, попробовать закинуть его на более старую систему и попробовать там, но есть способ лучше: один товарищ портировал его на Python3, где на момент написания статьи он отлично стартует. Поэтому будем пробовать. Само собой, для опытов понадобится машина с Linux. Я использовал Linux Mint, но подойдёт и любой другой дистрибутив.
Итак, ставим зависимости и клонируем пропатченный софт:

sudo apt-get install python3 python3-pip pcscd libpcsclite-dev pcsc-tools
pip3 install setuptools pyscard pycryptodome
git clone https://github.com/cheeriotb/osmocom-sim-tools

Далее очередь софта для разработки под JavaCard:

sudo apt-get install openjdk-11-jdk openjdk-11-jre ant
git clone https://gitea.osmocom.org/sim-card/hello-stk

Здесь мы накатываем JDK (обязательно JDK 11, с поздними версиями апплет не компилируется), а из репозитория Osmocom клонируем JavaCard SDK и тестовую программу.

Пишем первую программу


Ну что же, самое время попробовать что-то собрать и запустить! Итак, в папке HelloSTK находим HelloSTK.java, который имеет следующий вид:

package org.toorcamp.HelloSTK;

import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;

import sim.toolkit.EnvelopeHandler;
import sim.toolkit.ProactiveHandler;
import sim.toolkit.ToolkitConstants;
import sim.toolkit.ToolkitException;
import sim.toolkit.ToolkitInterface;
import sim.toolkit.ToolkitRegistry;

public class HelloSTK extends Applet implements ToolkitInterface, ToolkitConstants {
	// DON'T DECLARE USELESS INSTANCE VARIABLES! They get saved to the EEPROM,
	// which has a limited number of write cycles.
	private byte helloMenuItem;
	
	static byte[] welcomeMsg = new byte[] { 'W', 'e', 'l', 'c', 'o', 'm', 'e', ' ',
                                            't', 'o', ' ', 'T', 'o', 'o', 'r', 'C',
                                            'a', 'm', 'p', ' ', '2', '0', '1', '2' };
	
	static byte[] menuItemText = new byte[] { 'H', 'e', 'l', 'l', 'o', ',', ' ', 'S', 'T', 'K'};
	
	private HelloSTK() {
		// This is the interface to the STK applet registry (which is separate
		// from the JavaCard applet registry!)
		ToolkitRegistry reg = ToolkitRegistry.getEntry();
	
		// Define the applet Menu Entry
		helloMenuItem = reg.initMenuEntry(menuItemText, (short)0, (short)menuItemText.length,
				PRO_CMD_SELECT_ITEM, false, (byte)0, (short)0);
	}
	
	// This method is called by the card when the applet is installed. You must
	// instantiate your applet and register it here.
	public static void install(byte[] bArray, short bOffset, byte bLength) {
		HelloSTK applet = new HelloSTK();
		applet.register();
	}
	
	// This processes APDUs sent directly to the applet. For STK applets, this
	// interface isn't really used.
	public void process(APDU arg0) throws ISOException {
		// ignore the applet select command dispached to the process
		if (selectingApplet())
			return;
	}

	// This processes STK events.
	public void processToolkit(byte event) throws ToolkitException {
		EnvelopeHandler envHdlr = EnvelopeHandler.getTheHandler();

		if (event == EVENT_MENU_SELECTION) {
			byte selectedItemId = envHdlr.getItemIdentifier();

			if (selectedItemId == helloMenuItem) {
				showHello();
			}
		}
	}
	
	private void showHello() {
		ProactiveHandler proHdlr = ProactiveHandler.getTheHandler();
		proHdlr.initDisplayText((byte)0, DCS_8_BIT_DATA, welcomeMsg, (short)0, 
				(short)(welcomeMsg.length));
		proHdlr.send();
		return;
	}
}

Разберёмся, что тут происходит. Сам код лёгок для пониманию даже для тех, кто никогда не писал на Java, но кое-что я всё же опишу.

Сразу после того, как апплет оказался на карте, он не готов к работе. Перед этим его нужно зарегистрировать, для чего вызывается специальный метод register. Также имеется функция, обрабатывающая APDU, но в STK она почти не используется. И наконец самое главное: обработчик событий STK. В данном примере нет ничего особенного, просто отображение текста, если был выбран пункт меню.



Теперь собираем его командой ant.



После этого мы получим апплет (с расширением *.cap), готовый к закидыванию на карту.



Если при попытке сборки выдаётся ошибка, значит, у вас установлена более новая версия JDK, с которой скачанный JavaCard SDK несовместим. Чтобы выбрать нужную, вводим команду:

sudo update-alternatives --config java

Теперь остаётся только выбрать нужный из списка:



Мне неведомо, каким образом производится отладка коммерческих приложений для сим-карт, так как каких-либо эмуляторов SIM ToolKit я не нашёл. Есть, конечно, софт типа jCardSim, но поддержки STK он не имеет, её надо дописывать самостоятельно. Нечто более близкое к истине было в составе Gemalto Developer Suite, но в Web Archive софта не сохранилось, а все найденные на просторах ссылки вели либо на вирусы, либо на откровенный мусор вроде сайта informer.com. Конечно, я не настоящий сварщик джавист и, возможно, есть более актуальные способы отладки таких приложений, нежели проприетарное ПО десятилетней давности, так что если у кого-то есть такой софт и он готов им поделиться, то я обязательно дополню эту статью.

KIK, KIc и KID


Теперь разберёмся с самым интересным — с тем, как апплеты попадают в память симки. Происходит это при помощи защищённых пакетов — APDU особой структуры, которые посылает либо телефон (при конфигурации по воздуху), либо считыватель смарт-карт, куда вставлена симка. Для проведения каких-либо операций нужно знать административные ключи. У обычных симок они известны только оператору, поэтому использовать их нам не получится. Так что время узнать, как обстоят дела у программируемых. Если у вас симки Gialer, то конфигурация (а также установка апплетов) производится при помощи их софта, в случае с Sysmocom все данные присылают при заказе (о чём говорит надпись Key material has been sent to the e-mail address entered during webshop order на новых симках). Если ключей у вас нет, то получить их заново нельзя. Ещё, кстати, давным-давно Sysmocom продавал чуть дешевле свои симки без предоставления административных ключей. Такой вариант нам сегодня тоже не подойдёт, если у вас именно такие, то придётся заказать новые.

Связанных с этим важнейшим процессом ключей всего три:

  • KIc. Этот ключ — самый важный. Им шифруется содержимое защищённого пакета.
  • KID. Проверочный ключ, служит для выполнения трёх операций, именуемых RC/CC/DS (Redundancy Check/Cryptographic Checksum/Digital Signature).
  • KIK. Чем-то он напоминает KLK в платёжных терминалах (хотя и отличается от него по назначению). Этим ключом шифруются KIc и KID для их безопасной передачи. В новых версиях стандарта он называется DEK (Data Encryption Key).

Благодаря последнему ключу есть возможность загружать приложения и файлы по воздуху. То есть если у оператора изменятся какие-то настройки, он, обладая административными ключами, обновит эти данные в симке по сети, визит абонента для этого не требуется.
Процессов доступа к данным симки всего два — RFM (Remote File Management) и RAM (Remote Applet Management). В ходе первого производится добавление или изменение файлов в ФС карты, во втором — загружаются, устанавливаются или удаляются апплеты.



А вот и структура защищённого пакета.



Эти самые пакеты оператор может передавать через GPRS, USSD или служебные SMS. Для пользователя при этом всё абсолютно прозрачно, этот процесс для него незаметен.

Загружаем апплет


Теперь вернёмся к тому самому скрипту shadysim.py. Он-то и поможет нам загрузить наше приложение в память карточки.



Если запустить его без подключенного считывателя, то должна появиться ошибка вроде этой.



Втыкаем картридер в комп. Чтобы убедиться, что он работает, вводим:

pcsc_scan

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

python3 shadysim.py --pcsc -l HelloSTK.cap -i HelloSTK.cap \
          --enable-sim-toolkit --module-aid d07002ca44900101 \
          --instance-aid d07002CA44900101 \
          --nonvolatile-memory-required 0100 \
          --volatile-memory-for-install 0100 \
          --max-menu-entry-text 15 \
          --max-menu-entries 05 --kic KIc1 \
          --kid KID1

Здесь имя файла — тот самый апплет, который нам нужен. Этот скрипт его сразу и загружает (то есть копирует апплет в память симки) и устанавливает (регистрирует и активирует его). Не менее важным параметром является AID — код приложения (Application ID), по которому его можно однозначно определить (его можно задать в файле build.xml, здесь при загрузке указываем его же). Если попробовать установить два приложения с одинаковыми AID, то карта выдаст ошибку. Само собой, KIc и KID нужно заменить на свои данные. У симки может быть несколько групп таких ключей, выбираем первую.

Не будет лишним напомнить, что все административные ключи и коды имеют свойства, аналогичные таковым у PIN и PIN2. Если неверно ввести какой-либо из них три раза, то карта либо сдохнет, либо потеряет часть своих функций (к примеру, если вы заблокируете ключ ADM, то больше никогда не сможете изменять IMSI, Ki, OPc и прочие подобные данные). Проверяйте правильность введённых данных перед тем, как что-то выполнять.

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



Время тестировать. Первое января, пятый час ночи. Город засыпает, мафия тоже хочет спать. Ну а пока что достаём симку и втыкаем её в телефон.



Включаем его, и, если апплет успешно установился, на телефоне должно будет стать активным меню SIM.





Ну что же, оно работает!



Точно так же можно вставить карточку в любой другой телефон и убедиться, что там всё тоже запускается.



И на третьем телефоне тоже. Всё потому, что приложение работает на самой симке, а телефон лишь посылает ему команды.

Удаляем апплет


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

python3 shadysim.py --pcsc --list-applets --kic KIC1 --kid KID1

После выполнения команды в консоли отобразится нечто вроде этого:



Последний AID в списке и есть наш HelloSTK. Выше идут системные приложения.

Удаляется он довольно просто:

python3 shadysim.py --pcsc -d AID   --kic KIC  --kid KID

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

Ошибки


Как известно, только в туториалах вроде этого весь код пишется шутя и работает с первого раза. Поэтому стоит поговорить и об ошибках.



Если после выполнения скрипта вы наблюдаете вот такую строчку в конце, значит, что-то пошло не так. Увы, мне не удалось найти детальную документацию о том, что значит каждый код ошибки (ни на сайте Osmocom, ни в руководстве от Sysmocom этого нет). Но некоторую закономерность удалось обнаружить:

  • 6985 — дублирующийся AID. Проще говоря — попытка установить апплет, который уже установлен. Устраняется сносом старого апплета и накатыванием нового.
  • 6A88 — отсутствующий AID. Обычно происходит при удалении апплета, которого нет.
  • 6A86 — ошибка в параметрах. Помогало переустановить апплет.
  • 6438 — вероятно, ошибка обмена. Выйти из неё удалось лишь при помощи переустановки апплета с использованием другого считывателя.

Если кто-то знает, где найти более детальное описание, буду рад с ним ознакомиться.

Что же в итоге?


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

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

Такие дела.



Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале



Ссылки:

Читайте также:

Комментарии (72)


  1. enamchuk
    10.01.2025 09:58

    Возможно ли из обычных SIM, которые операторы связи выдают абонентам, удалить приложение?


    1. gmini
      10.01.2025 09:58

      видимо, ключи надо, а они только у оператора


      1. MaFrance351 Автор
        10.01.2025 09:58

        Именно.


        1. NickDoom
          10.01.2025 09:58

          А как-то зафаерволлить, вставив свой контроллер с ТСПУ и DPI между симкой и самим GSM-радиомодулем? Чтобы общались только на дозволенные темы, но не подписывали на анекдоты про тёщу 18+.


          1. Nick0las
            10.01.2025 09:58

            Зафайерволить можно. Для этого в разрыв между телефоном и SIM необходимо включить свой микроконтроллер который будет пропускать команды только по белому списку. И никаких обращений к SIM Toolkit. Когда-то я планировал разрабатывать такой файервол для реализации аппаратного мультисим но с монтажом возникли проблемы и проект заглох.


            1. MaFrance351 Автор
              10.01.2025 09:58

              Хмм. А ведь, помню, были такие приблуды, куда можно вставить две симки, а она их автоматически переключает (обычно при каждой перезагрузке телефона). Нечто вроде такого хотели сделать?


              1. Nick0las
                10.01.2025 09:58

                Были такие и с выключением и сим меню. Симки ставились на выносных шлейфах. Далеко не ко всем телефнам подходило. Думал сделать подобное чтобы две симки максимально обрезать и впаять а микроконтроллер их переключал через STK. По высоте немного не помещалось и СИМ тогда не все можно было обрезать чтобы два чипа влезли на площадь Mini-Sim (классический формат 15x25mm с обрезанным углом) и проект заглох на этапе эскизов.


            1. NickDoom
              10.01.2025 09:58

              Хе… хе, хе, хе…

              МВУХАХАХАХАХА!!!

              Ну всё, надо готовить материал для суперзлодейского телефона! :-D

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


              1. inkelyad
                10.01.2025 09:58

                о можно ведь поставить второй телефон повыше

                Вообще, вроде бы сейчас все не совсем паршивые смарты умеют некий Bluetooth SIM access profile.
                Эта штука используется, как я понимаю, например, в Android auto и предназначена для того, чтобы сотовый модем в машине мог воспользоваться SIM-кой, стоящей в телефоне

                Свежая версия за пайволлом, но предыдущая доступна

                This SIM Access Profile defines the protocols and procedures that shall be used to access a GSM SIM card, a UICC card or a R-UIM card via a Bluetooth link. Unless otherwise specified the term “Subscription module” shall be used to refer to the GSM SIM card, a UICC card or a R-UIM card. The profile enables the usage model "Personalizing the Car and its Devices" (see [5]) and similar usage models, which involve a Bluetooth enabled SIM card holder and a cellular phone. For example, with this profile, the user can personalize his/her car-embedded phone with a subscription module in an external device, which is connected via a Bluetooth wireless link. The external device can either be a simple SIM card holder or a portable phone, which is brought into the car.


                Так что 'дистанционная SIM-ка' - штатная технология которая много где есть но не используется.


                1. NickDoom
                  10.01.2025 09:58

                  Опа, а вот это интересно. Значит, есть и можно юзать. Хммм…


                1. kaseiiro
                  10.01.2025 09:58

                  Так-то и принятая версия 1.1.1 доступна без денег. Но что-то списки железа на Википедии очень скромные, а альтернативные приложения имеют в описании необходимость дырявить телефон root-прав. В остальном одни плюсы.


    1. Coppermine
      10.01.2025 09:58

      Если цель избавиться от навязчивых push-уведомлений от оператора и у Вас телефон на базе Android, то можно попробовать с помощью adb избавиться от пакета com.android.stk. Но это из категории вредных советов.


      1. grishkaa
        10.01.2025 09:58

        Конкретно — adb shell pm uninstall --user 0 com.android.stk. Я так делал, подтверждаю, работает.


        1. MaFrance351 Автор
          10.01.2025 09:58

          Можно ADB App Control использовать, если неохота в консоли. Так и найти приложение и отрубить его.


      1. enamchuk
        10.01.2025 09:58

        Именно так и сделал.
        Но встречал и полезные SIM приложения, например, у оператора MCN там переключаются профили для международного роуминга, а у некоторых eSIM , выполненных в виде обычной SIM - возможность переключения профиля без использования спец.приложения.


  1. Rubilnik
    10.01.2025 09:58

    Я ожидал, что сейчас запустим doom на сим карте...


  1. kenomimi
    10.01.2025 09:58

    Было бы интересно подключить карту к микроконтроллеру - на тех же stm32 даже есть режим uart для работы со смарт-картами. Ведь такие карты по сути отличное защищенное криптографическое решение задешево и без NDA, которое так никто и не отломил полноценно.

    Кстати говоря, есть целая книга по работе с Java SmartCard. Сходу не найду, но где-то валялась...


    1. inkelyad
      10.01.2025 09:58

       защищенное криптографическое решение задешево и без NDA, которое так никто и не отломил полноценно.

      Увы и ах - требование ключиков, чтобы залить приложение и негуманная цена тех чипов, ключики для которых тебе скажут - мешают такому использованию. А так бы да, было бы хорошо как-нибудь использовать те многочисленные старые SIM-ки и банковские карты, которые накопились.


      1. NickDoom
        10.01.2025 09:58

        Вроде используют тупо как дополнительный EEPROM для какой-нибудь АтТиньки :)

        Но вообще странно, что ключи до сих пор не слили и не поломали. Понятно, что опсос тут же сменит-перевыпустит — но нас-то не интересует опсос, нам интересны именно старые симки, от которых он уже отрёкся…


        1. MaFrance351 Автор
          10.01.2025 09:58

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

          Так как там уже всякие хитрые способы типа растворения в кислоте и изучения кристалла под электронным микроскопом или опроса карты, замороженной в азоте (дабы аппаратный ДСЧ от минимума теплового шума заглючил) и вот это вот всё.


          1. inkelyad
            10.01.2025 09:58

            Ключи можно достать

            А там симметричная криптография используется? Это же глупо. А если ассиметричная - то после расковыривания достанется публичная часть что поможет приблизительно никак.


            1. MaFrance351 Автор
              10.01.2025 09:58

              Симметричная.

              Но что толку от ключей, если сама симка заимеет непригодный вид, а к другой они всё равно не подойдёт?


              1. NickDoom
                10.01.2025 09:58

                А, так для каждой симки апплеты своим ключом подписывают? Я думал, только сама идентификация имеет индивидуальный ключ (причём старые симки, помню, ломали и клонировали, но потом шифрование улучшили), а для приложений — какой-то другой, общий для опсоса.

                А они, значит, сразу всё персональным ключом сделали, и идентификацию абонента, и подпись его апплетов. Обстоятельные барсуки :-D


      1. kenomimi
        10.01.2025 09:58

        К чистым картам ключи идут в комплекте, иначе от них толку нет. Б\у, понятно дело, залочены.

        А ценник да, зашкаливает. Видимо, розничного спроса нет. Оптовый же (ящиками) ценник где-то около бакса за карту, что совсем недорого за стойкую крипту.


        1. MaFrance351 Автор
          10.01.2025 09:58

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


          1. fujikiriku
            10.01.2025 09:58

            Странно почему ни один из сотен сотовых операторов в мире не продает симки с ключами по низкому ценнику?


            1. kenomimi
              10.01.2025 09:58

              Это никому не надо, кроме редких специалистов ИБ. Они же придут и попросят бланки карт у конторы, которая их призовет на аудит - никаких вопросов. Может еще пару разработчиков на всю постсоветскую территорию есть...


          1. inkelyad
            10.01.2025 09:58

            Ну как. Если оптовый при 'покупке ящиками' - около бакса, то можно было бы те же дешевые FIDO токены делать, используя такие чипы в качестве хранилища и криптопроцессора.

            Было бы крупнее 'флешки' но вполне юзабельно. Точнее - было бы давно изобретенная авторизация по карточке через ридер. Но нет, что-то не видно на рынке такого. Так что тут, видимо, еще какие-то препятствия к использованию и покупке стоят.


            1. kenomimi
              10.01.2025 09:58

              Проблема в том, что гражданскому рынку оно не надо. Вот вообще не надо. Сейчас вообще везде авторизация через телефон...

              А рынку корпоративному дай сертификацию устройства как СКЗИ, всякие разные аттестации, и так далее. Девайс сделать, купив карты у китайцев - изи, задача уровня школьника в easyeda. Продать же его в большом объеме крупному клиенту нереально как раз из-за бумажек. Если же ты и сможешь все оформить, то условный рутокен моментально выпустит аналог в три раза дешевле (не считая того, что у него клиентская база готовая), и ты опять пролетел.


    1. ivanvershinin
      10.01.2025 09:58

      А зачем? Есть ATECC508A по 80 центов, если сотню взять. Поддерживает криптографию на эллиптических кривых, чип защищённый.
      Есть с симметричной криптографией, ATSHA204A, по 50 центов.


  1. dlinyj
    10.01.2025 09:58

    О, вот это тортище!

    Ещё со студенческих времён интересовало как же вкатиться в тему приложений для симок и смарткарт. И вот, наконец-то оно. Кстати, ведь не симками едиными, всякие карточки для спутника, банковские карточки и т.п. Наверняка можно сделать приложуху, которая и с хостом будет работать.


    1. NickDoom
      10.01.2025 09:58

      Ну, собственно, мой каммент за меня уже оставили, поэтому просто плюсану :-D


    1. MaFrance351 Автор
      10.01.2025 09:58

      Интересно будет намутить карточный таксофон и к нему SAM-карту с известными ключами. Дабы наконец сделать рабочий эмулятор.


      1. kaseiiro
        10.01.2025 09:58

        Еще бы к такому проекту SLE4436 или аналоги штучно достать, чтобы совсем уж аутентично. И документы на SAM-модуль полноценные бы.
        А сами таксофоны на барахолках попадаются, только дороговато.


  1. Olegsoft
    10.01.2025 09:58

    Помню как то ради интереса изучил тему клонирования сим карт ( благо в офисе-сервисе был необходимый набор инструментов и инструкция с софтом к ридеру ) Спрос на услугу был удурчающе низкий, заработать на этом не получилось... Особо никому и не нужно было иметь в одной мульти симке несколько операторов. Так для себя побаловались и забылась история. Тем более операторы стали внедрять методы защиты сим карт от многократно чтения при подборе ключей. Симки просто могли заблочится. Подбирали коды Ki и Ku вроде.... или это немного другое ? И к запуску софта на симке не относится ? )))


    1. MaFrance351 Автор
      10.01.2025 09:58

      IMSI+Ki вы добывали. К запуску софта на симке это не относится, это для аутентификации в сети.

      Но сейчас эта тема сдохла окончательно, так как без ключа OPc телефон будет подрубаться только к сетям 2G.


      1. VBKesha
        10.01.2025 09:58

        В вообще насколько сейчас реально добыть этот Ki если 2G вполне устраивает?


        1. MaFrance351 Автор
          10.01.2025 09:58

          Почти нереально. Везде Milenage/COMP128v2, который пока что не сломали.


      1. Nick0las
        10.01.2025 09:58

        Я делал полный эмулятор СИМ на AVR еще в эпоху 2G телефонов. Добыв KI и считав IMSI можно было сделать карту со своими кастомными приложениями, что я и делал. Классическая тема - мультисим. У меня был мультисим с переключением не только через меню но и набором короткого номера. Но были и другие проекты. Если почитать спеку GSM 11.11 и 11.14 или их аналоги времен 3G станет ясно, что СИМ может звонить, слать СМС, показывать сообщения на экране. Можно и по GPRS общаться но я этого не делал. С учетом того что на телефон можно прислать СМС которое он обязан сохранить в СИМ, можно вообще сделать СИМ с внешним управлением просто склонировав СИМ или включив свой микроконтроллер в разрыв между телефоном и СИМ.
        Когда я тестировал свой эмултор с кучей телефонов, оказалось что многие телефоны крайне плохо поддерживают команды STK за пределами того что делают операторские СИМ меню (показать меню, отправить СМС, USSD, показать информационное сообщение).
        На ифоне с моим мультисим с некоторыми операторами работал 3G, а вот 4G уже нет.


        1. MaFrance351 Автор
          10.01.2025 09:58

          Очень круто!

          А не осталось ли у вас материалов проекта? Было бы интересно запустить...


          1. Nick0las
            10.01.2025 09:58

            Материалы остались. Ключи рабочие найти проблема. И карту Funcard2 (AT90S8535 + AT24C64).


            1. MaFrance351 Автор
              10.01.2025 09:58

              Для опытов можно взять любой укокошенный телефон и припаяться. А сеть поднять свою.


              1. Nick0las
                10.01.2025 09:58

                Код есть. Там ~4300 строк на асме, конфигуратор на Delphi под винду и еще ПО для удаленной настройки через SMS. Один конфигуратор нужен для программирования EEPROM (в том числе IMSI и KI). И поправка Funcard2 это AT90S8515, ныне не выпускаемый но легко доставаемый. Код менялся последний раз в 2008 году.


                1. MaFrance351 Автор
                  10.01.2025 09:58

                  Было бы круто сейчас это оживить...


                  1. kaseiiro
                    10.01.2025 09:58

                    Симки на COMP128v1 еще в ходу, не так давно за ненадобностью ликвидировал, эх. С известными ключами были.


        1. kaseiiro
          10.01.2025 09:58

          Товарищ Пикадор по тем временам? Или ошибаюсь и Пикадор делал только под PIC?


          1. Nick0las
            10.01.2025 09:58

            Я не Пикадор. Пикадор делал эмулятор на сильвере, значительно раньше меня и с меньшим функционалом. Более того, я только читал на форумах его посты но лично не знаком. Мой эмулятор широко не распространялся, я не прилагал этому усилий.


    1. Nick0las
      10.01.2025 09:58

      Интересно, в каком году это было и в какой стране? Я когда разобрался с темой клонирования сим карт, клонируемые сим уже уходили в историю, нужно было гонятся за ними специально. Но некоторые мои друзья пользовались, и я тоже. Еще был патч на телефоны Siemens, который позволял эмулировать несколько клонируемых карт в дополнение к основной.


  1. salnicoff
    10.01.2025 09:58

    Автору: Вы бы номерки карточек на фото заблюрили, хотя бы часть. А то мало ли что...


    1. MaFrance351 Автор
      10.01.2025 09:58

      Так это специальные тестовые карты. Так что их данные чувствительными не назовёшь.


    1. vvzvlad
      10.01.2025 09:58

      А то мало ли что...

      Так а что именно? Можете предложить вектор атаки? Или это из разряда "замазать серийный номер телевизора и лицо младенца на фото"?


      1. salnicoff
        10.01.2025 09:58

        Негоже светить (около-)персональную информацию на весь интернет. В Вашей классификации это подходит под пункт «замазать серийный номер телевизора», если у автора нет намерений показать всему миру именно этот телевизор именно с этим серийным номером.


        1. MaFrance351 Автор
          10.01.2025 09:58

          Так а что в этих номерах персонального? Это же карты исключительно отладочные, реальным абонентам они никогда не выдавались (да и не предназначены для этого).


          1. salnicoff
            10.01.2025 09:58

            Когда я писал, я этого не знал. :-)


            1. MaFrance351 Автор
              10.01.2025 09:58

              В вашем примере это скорее не серийный номер телевизора, а код активации какой-нибудь Windows 98 в комплекте с древним коробочным изданием. Может, в каком-то смысле и чувствительная информация, но сейчас - уже неа.


              1. salnicoff
                10.01.2025 09:58

                Ну или так. Я не привык любые номера светить.


  1. kaseiiro
    10.01.2025 09:58

    Есть, кстати, прикольная приложуха Flora eSIM, которая тащит не STK, а основную файловую систему SIM и аутентификацию SIM (список алгоритмов не помню, но в принципе-то дописать любые можно). На картах типа легендарных J2Axxx вполне разворачивается, хотя и со сложностями в виде необходимости преперсонализации с T = 0.

    И отсылка к Toorcamp уж очень интересна.


  1. Panzerschrek
    10.01.2025 09:58

    Я так и не понял, зачем там Java внутри. Вроде же на самой симке код и запускается, а значит известно, какой там процессор и под него можно собрать код на Си. Зачем тогда Java вкорячили? Может это просто Sun кому надо занесли, чтобы как в том меме - 3 billion devices run Java?


    1. salnicoff
      10.01.2025 09:58

      Скорее всего, из-за размеров кода. Байт-код Джавы (фактически — исходник) занимает меньше места, чем то же самое, но скопмилированное в родной машинный код.


      1. thesunlight17
        10.01.2025 09:58

        Правильно я понимаю что исполняться этот код будет все равно на cpu самого телефона? Неужели jvm будет на чипе симки работать?


        1. salnicoff
          10.01.2025 09:58

          Нет, на процессоре сим-карты. В этом весь смысл подобных девайсов — не выдавать потроха типа ключей шифрования/подписи наружу. А виртуальная машина — ну очень обрезанная.


          1. NickDoom
            10.01.2025 09:58

            …и она ещё и выполняется чуть ли не на однобитном проце.

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

            У меня была прикольная мысль, может, я её даже додумаю: машина, умеющая только делать XOR на какой-то элемент однобитного массива. И ПЗУ, при помощи которого реализуется CISC-виртуалка :)

            Возможно, даже в варианте полного ретро — в качестве ПЗУ закольцованная фотопластинка с адресами того, что на что надо XOR, которая крутится над фотодиодами и управляет несколькими регистрами :) CISC-комп на 155-й серии (кроме ОЗУ, увы).

            Паять не буду, но если додумаю — с меня эмуль, конечно :)


            1. dvrpd
              10.01.2025 09:58

              >Такое вроде вообще даже делают на контроллерах — маленькая ВМ, реализующая ну оооочень обильную в плане системы команд машину

              Из недавнего - эмуляция MIPS с линуксом на Intel 4004.


    1. inkelyad
      10.01.2025 09:58

      Я так и не понял, зачем там Java внутри.

      Не так. Вопрос - почему те, кто эти карточки делает, использует Java вариант. А потому, видимо, что не хочет возиться с 'совместимостью' на уровне непосредственно процессоров. А тут хоть достаточно злобная стандартизация есть.

      значит известно, какой там процессор и под него можно собрать код на Си.

      Вроде бы как раз для этих процессоров (есть или было задумано) - Java байт-код 'родной' (плюс-минус-лапоть микрокода и особенности устройства процессора) и исходник на Cи все равно в него же и пришлось компилировать.

      EDIT: Я немного ошибся, но в процессе нашлись мемуары причастных.


  1. bolk
    10.01.2025 09:58

    Нашёлся некий список эмуляторов и других инструментов для JavaCard: https://github.com/crocs-muni/javacard-curated-list

    Наверное они помогут отладить приложение, в случае необходимости.


  1. smart_alex
    10.01.2025 09:58

    А какие действия доступны SIM картам операторов? Может SIM карта самостоятельно инициировать телефонные звонки, посылку SMS, может ли ПО таких карт иметь доступ к файлам на устройстве пользователя?


    1. MaFrance351 Автор
      10.01.2025 09:58

      Всё может, за исключением доступа к файлам.

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


      1. smart_alex
        10.01.2025 09:58

        А также может САМОСТОЯТЕЛЬНО совершить звонки по платным номерам и подписать ничего не подозревающего пользователя на платные подписки.


      1. Nick0las
        10.01.2025 09:58

        Не знаю как сейчас, но в старые времена настройки присылал оператор сам в зависимости от IMEI. Если надоели СМС с настройками, надо было прописать в телефон IMEI от телефона без GPRS. Настройки при передергивании СИМ приходить переставали, а GPRS работал. А еще у разных телефонов были разные форматы настроек и если прописать IMEI от другой модели то можно было получать настройки в виде СМС которое телефон не может применить как настройки и просто сохраняет в принятых.


  1. yamifa_1234
    10.01.2025 09:58

    ... (чем одно время очень бесил Tele2)...

    Помню стали всплывать сообщения и я не понимал откуда. Ещё помойму экран загорался а это сильно раздражало думал что смс пришло.

    Мне кажется тут автор не затронул вопрос производительности) всегда хотел это узнать. Вроде бы подаваемый тактовый сигнал на симку в районе 24 МГц. Но ведь его всегда можно поднять через pll. Было бы интересно узнать за какое время считаются какие-то задачи и так же интересна скорость передачи от симки к телефону.

    P.s.вспоминается ещё история что Толи хотели толи сделали совместно с сим картой ещё и память данных. Так сказать флешка+симка в одном устройстве. Может кто-то что то помнит?


  1. POPSuL
    10.01.2025 09:58

    Хабр -- торт!
    Жду продолжения, дум на сим-карте в 3310! :)


  1. LTVA
    10.01.2025 09:58

    А Сишного компилятора на эту штуку точно нет? Я бы поигрался, пусть и проц аппаратно под жабу, как тут пишут. Конечно, дум не сделаешь, но интересны конкретные ТТХ — набор инструкций ЦП, скорость их исполнения, тактовые частоты, объём ПЗУ/ОЗУ, наличие аппаратных ускорителей и прочей периферии... И карта областей памяти со всеми регистрами периферии :)