DEFCON21。「SIMカードの秘密の生活」会議。 エリック・バトラー、カール・コーシャー

私の名前はエリック・バトラーです。これはカール・コーシャーです。SIMカードのコードの読み取り、作成、ダウンロード、使用についてお話したいと思います。 このプロジェクトは昨年、Tourcamp 2012イベント、ワシントン州沿岸のハッカーキャンプ、出口DEFCONについて知ったときに始まりました。 ホテルはなく、野外のテントでの生活、これは2番目のキャンプでした。私は最初のキャンプがとても気に入ったので、友人を招待して、そこに行くことにしました。 このイベントは、米国のいくつかの地域でGSMネットワークを立ち上げることに専念しており、私の仕事は、このためにいくつかのSIMカードを入手することでした。







私はSIMカードが何であるかについて何も知りませんでしたので、私は問題を研究し、以下を見つける必要がありました:





最後の点は、SIMカードがアプリケーションで動作することを聞いたことがないので驚きました。 かなり前に、「iPhone」や「Android」がなかったとき、アプリケーションはSIMカードに置かれていました。 電話はシンプルなダイヤラーでした-SIMカードを取り外して、すべての連絡先、プログラムなどと一緒に別の電話に再配置できます。 Telcomなどの一部のオペレーターは、SIMカードの所有者であり、SIMカードにインストールされているアプリケーションを制御しています。



10年後、すべてが根本的に変わりました。 今日、SIMカードは、制御できない小さなハンドヘルドコンピューターです。 しかし、90年代半ばの原則の多くは今日まで維持されており、私はそれがすべてどのように機能するかを理解しようとしました。 私はキャンプでSIMカードを使って遊ぶ絶好の機会があり、アプリケーションを実行するカードを手に入れることができればいいと思いました。



これらのカードを約50万枚販売したいオペレーターが多いため、これは簡単な作業ではありませんでしたが、必要なのは500枚だけでした。 ほとんどのオペレーターは、NDAの機密情報の非開示に関する契約書への署名を強制しています。これは、そうしたカードを調べるときに知っていることをすべて伝えようとしているためです。



私たちが見つけたカードのいくつかは、アプリケーションの作業をサポートしていましたが、GSMをサポートしていませんでした。 さらに、それらをプログラムする方法に関するドキュメントが少なすぎました。 見つかったすべての情報を要約するのに長い時間がかかりましたが、プログラマブルSIMカードの技術について多くの興味深いことを学びました。

やっと手に入れたSIMカードには、このような特性がありました。







Arduinoとは異なり、64 KBのメモリと6 KBの小さなRAMを備えた独自のAVRプロセッサがありました。 これらはJavaCardと呼ばれ、20〜30 MHzで実行されていたため、これらのミニコンピューターには限界がありました。



これらのSIMカードに基づいて、私たちはキャンプ用に独自の携帯電話ネットワークを考え出しました。 キャンプに来てテントを選び、登録を行い、スケジュールを受け取り、Shadytelと呼ばれる一般的な内部ネットワークで使用するために入り口でSIMカードを受け取るようにしたかったのです。







そのため、500枚のカードのうち400枚以上を配り、それぞれが自分の携帯番号を受け取りました。 実験ネットワークには次の機能がありました。





ゲストにSIMカードだけでなく、通常のSIMカードに送られる情報と同様に、その使用に必要なすべての個人情報と、通常はオペレーターのカードで暗号化されているオープンコードも渡しました。 さらに、当社のネットワークは、どこでも無料で電話をかける機会を提供したため、お母さんもオーストラリアに自由に電話をかけることができます。 私たちのネットワークは非常に機能的で、まったく高価ではありませんでした。米国連邦通信委員会(FCC)からのライセンスさえ持っていたので、ネットワークは非常に合法的に機能しました。



SIMカードにプログラムしたアプリケーションまたはアプレットが許可するものを検討してください。



それらは電話に関係なくSIMカードのプロセッサ上で実行されたため、彼は何が起こっているかを「見る」ことすらしませんでした。 メディアを使用して、アプリケーションを「サイレントインストール」モードでカードにリモートでインストールできます。 「キャリア」とは、少し後で説明します。 現在、ほとんどのSIMカードキャリアはそのようなアプリケーションをサポートしています。



当社のカードは、AIDを使用して選択され、標準のCard Managerカード選択アプリケーションによって制御されるいくつかのアプリケーションをサポートしていました。



本質的に、GSM SIMサポートは、集積回路(UICC)を備えた物理カード上の単なるアプリケーションです。







アプレットができることは次のとおりです。





私たちのカードを使用したときのスマートフォンの画面がどのように見えるかの例を示します。 モバイルバンキングの機能は次のとおりです。米国では特に一般的ではありませんが、世界中で広く使用されています。







そして今、カールは私たちのアプリケーションがどのように機能するかを教えてくれます。







次のテクノロジーを使用しました。





スマートカードの設計は、データの保存と処理の安全性を確保するように設計されており、通信はAPDUと呼ばれるパッケージを使用して実行されます。







スマートカードの機能は、キーの非取り外し性と暗号化/復号化手順です。そのため、パスワードやログインなどの個人データを使用して、銀行システム、デジタル署名、衛星テレビにアクセスできます。 CLSパラメーターがこれを担当します。 以下は、INS情報を処理するための手順です。 APDUは、パラメータP1およびP2によって記述されるバイトのストリームであり、LCデータ伝送の長さ、データ自体、LEの長さの拡張などの追加レコードです。



次のスライドでは、JavaCardが表示されます。 これはJavaであると同時に、まったくJavaではありません。これは、ゴミ、文字、文字列、多次元配列がないためです。 運がよければ、いくつかの整数intデータ型を見つけることができます。 これらのカードの構造は非常に単純です。 言うまでもなく、ファイルやテーマなどの標準APIがないため、検証を取り除くことができますが、いくつかの例外があります。 変数のサンプルとクラスはEEPROMメモリに保存されますが、EEPROMメモリには約50万の書き込みサイクルが制限されています。 したがって、マップのタイプによっては、これらの変数の更新に問題がある場合があります。



スマートカードアプリケーションの作成方法を説明します。 いくつかの特殊な商用IDE開発環境がありますが、それらを使用せずに実行できます。第一に、アプリケーションをすべての人に可能な限りオープンにしたかったためです。



Oracleから、無料のJava Card Development Kitエディターをダウンロードしました。 Eclipseを使用する場合は、標準JREライブラリシステム(Javaランタイム)をカードから削除し、Javaカードライブラリを追加して、クラスなどの記述に役立てる必要があります。 さらに、私たち自身が作業を促進するためにいくつかのプログラムを作成しました。



STKアプリケーションは次のように動作します。





したがって、電話をロードした後、アプリケーションは200の使用可能なすべての機能を使用でき、メニューからアプリケーションを選択すると、対応するイベントがトリガーされます。その後、アプリケーションはUI要求を電話に送り返します。



これが、コードの外観です。







Javaでは、2つの標準メソッドを使用してカードクラスを設定できます。Javaランタイムを使用してクラスを作成および登録する方法と、SIMカードツールキットを使用してクラスをインストールする方法です。 後者の方法は、何らかのイベントを電話からカードに転送する必要がある場合に使用されます。



次のスライドは、Tourcamp用に作成したアプリの外観を示しています。 カードを有効にすると、利用可能なネットワークのいずれかを選択できます。 再起動してネットワークに接続すると、暗号化を有効にするかどうかを尋ねられます。これは、アプリケーションのもう1つの興味深い機能です。 保護されたデバイスにプロンプ​​トを保存して、そこから削除できないようにすることができます。 さらに、誰かがこれらのプロンプトを表示したかどうかを知らせ、コンテンツをリモートで表示できるようにする不要な干渉マーカーを導入しました。これについては後で説明します。







私たちのアプリケーションのプログラムコードはかなりugいように見えることを警告します。 覚えているなら、ここには行もグループもないので、個々の文字で個々のバイトの配列を作成する必要があります。 これはかなりつらいプロセスですが、私たちはそれに耐えました。







次に、SIM Toolkitを使用したアプリケーションの自己登録の手順、電話メニューでプログラムを選択するプロセス、画面にプロンプ​​トを表示するプロセス、およびその他の機能をプログラムで説明しました。 私たちは可能な限りすべてを最大限に処方しようとしましたが、ひどく見えますが、うまくいきます。 プログラムの詳細な説明は当社のウェブサイトに掲載されているため、これらのスライドに表示されている内容を覚えておく必要はありません。 今、私たちのレポートはエリックを続けます。







最も簡単な方法は、古いバージョンのJava 1.1エンコーディングとコード互換性バージョン1.3を使用することです。 クラスファイルを作成したら、Javaカード用にトランスコードする必要があります。 これを行うには、SDKで利用可能なコンバーターを使用します。 また、いくつかのIDアプリケーション(ほとんど文字通り1分間)、APIエクスポートディレクトリなども必要になります。 これらのファイルは、電話OSが理解できる必要があるため、.jar形式で作成されます。







また、サイトで入手できる特別なMakefilesプログラムも開発しました。 コンバーターはCAPファイルを生成します。CAPファイルは、CAPコンポーネント(Java Cardコード)のZipアーカイブです。



プロジェクトの作業を開始する前に回答しなければならなかった重要な質問の1つは、SIMカードと対話する方法の質問でした。 カードリーダーが必要でした。 PCSCポート(PC /スマートカードAPI)への接続用とシリアルポートシリアルへの接続用の2つのタイプがあります。 通常、最初のものは汎用であるため、標準サイズのSIMカードを操作するためのアダプターが必要です。2番目のものははるかに小さく、SIMカード専用です。







機能的には、それらの間に違いはありませんが、PCSCオプションを使用する方が便利です。 API専用に設計された公式ソフトウェアを使用し、コンピューターでの作業を容易にします。 さらに、SIMカードを操作するための多くのオープンアプリケーションがあり、PCSCオプションを使用すると使いやすくなります。 すべてのカードリーダーは同じなので、eBayで8ドルで購入した最も安いSCR3500を使用しました。



そのため、このひどいコードを作成し、Javaコンパイラで処理してCAPファイルに変換しました。 次に、人気のあるGPShellツールを使用したSIMカードに配置しようとしましたが、成功しませんでした。 SIMカードの販売者は、どこにも見つからないシンプルで便利なインターフェイスを備えた別のプログラムをアドバイスし、600ドルで販売することを約束しましたが、このプログラムはありませんでした。



そのため、SIM Alliance Loaderというプログラムを使用しました。下のスライドはそのウィンドウを示しています。 このプログラムの最初のバージョンを使用しましたが、現在は2番目のバージョンがすでに利用可能です。 SIM Allianceは、SIMカードを操作するためのソフトウェアを開発するグループです。 SIM Alliance Loaderは、JavaアプリケーションをWindowsに適応させたもので、何をしているかを理解している専門家向けに設計されています。







ただし、問題を理解している場合、アプリケーションをSIMカードに転送するには数分しかかかりません。 しかし、Tourcampの準備をしたいカードが約1,000枚あったことを考えると、このような記録技術には時間がかかりすぎるため、より生産的なものを使用することにしました。 そのため、Java Cardアプリケーションのダウンロード、インストール、および管理の標準であるグローバルプラットフォームに注目しました。 アプリケーションに応じて、このソフトウェアはプロトコルとコマンドの使用、および暗号化と認証を許可します。 また、SIMカードを使用せずにいくつかの外部手順を実行することもできます。たとえば、アプレットのバイナリコードを確認します。







その過程で、すべてのアプリケーションがダウンロードされ、グローバルプラットフォーム認証システムである発行者セキュリティドメイン(ISD)アプリケーションで認証されることが判明しました。 実際には、これは、自分で開発していない場合、アプリケーションをマップにダウンロードできないことを意味しますが、Carsten Knowleの著作で説明されている例外があります。



クリーンなグローバルプラットフォームSIMカードでは、デフォルトでISDアプリケーションが利用可能です。GSMアプリケーションはデフォルトでインストールされており、グローバルプラットフォームアプリケーションにアクセスする機会もないため、カードへのアクセスははるかに困難です。 SIMカードにアプリケーションをインストールする手順を簡単に説明します。



このプロセスは、DOWNLOADコマンド(バイナリコードの配列をロードする)とINSTALLコマンド(SIMカードにアプリケーションインスタンスを作成する)の2つのステージで構成されます。 単一のCAPコンポーネントは組み合わされ、DOWNLOADコマンドを使用してブロック単位でカードに送信されます。 このプロセスには、3つのタイプのアプリケーションID(AID)が含まれます。





その結果、CAPファイルが解凍され、データが抽出されてSIMカードに書き込まれます。 SIMを使用してGlobal Platformアプリケーションを「通信」する唯一の方法は、エアデータ送信メカニズム、つまりSMSメッセージを使用することです。 実際、従来のSMSを送信するのではなく、SMSパケットを使用してマップ上でコマンドを生成しました。



それは長くてかなり面倒なプロセスでした。 GSM 03.48標準では、CATシェル(AoC2)を使用して構成されていたため、カードで必要なアクションを実行できます。 プロセスの最初の段階では、SMS PP(D1)ダウンロードが含まれます。このダウンロードは、デバイスIDとSMS TPDUトランスポートプロトコルデータパケットで構成されます。







SMS TPDUには、ヘッダーとユーザーデータが含まれます。 ユーザーデータには、ヘッダー、コマンドパッケージ、サブタイトル(セキュリティ設定、アプリケーション選択)も含まれます。 次に、彼は3バイトのTAR IDを使用します(PowerPointがこのようなナンセンスにどのように耐えたのだろうか)。 これにより、内部データの制限がなくなり、リストの最後に、グローバルプラットフォームが必要とするAPDUがあります。 したがって、この巨大なメカニズムはすべて、データの小さな配列を送信するために使用されます。



これを行いたくない場合は、APDUをSIMカードにリモート送信するための別のメカニズムがあります。 ネットワークでの認証が必要なインストールコマンドでSMSを送信するには、セルラー通信を使用する必要があります。 ただし、Karsten Knowleは、暗号化エラーにより、ブルートフォース方式を使用して(つまり、ネットワーク認証なしで)対称DES暗号化アルゴリズムのキーを取得できる方法について説明しています。



ShadysimブートスクリプトはPythonで記述され、OSX、Linux、およびWindowsで実行されます。 次のスライドは、その外観を示しています。 ダウンロードは、SIMカード付きのカードリーダーが接続されているPCを使用して行われます。







次のスライドは、カードにアプリケーションをインストールするために設定する必要があるパラメーターを示しています。







ここで、マップのメインクラスが設定され、物理メモリとRAMメモリが予約され、スマートフォンの画面に表示されるテキストメニューのサイズが決定され、ツールキットを起動するコマンドが記録されます。 16進コードを使用して、他のパラメーターを入力できます。 最後に、アプリケーションのリストに-tパラメーターが追加され、電話帳を更新できます。







アプリケーションが機能していることをどのようにして知ることができますか? エリックはこれについてあなたに話します。



次のスライドは、動作中のアプリケーションがどのように見えるかを示しています。 Pythonのプログラムのスクリーンショットが左側に表示され、SIMアプリケーションオプションのあるiPhone設定メニューとAndroidスマートフォンの[アプリケーション]タブのプログラムのアイコンが中央に表示されます。







Carlはプログラミングの難しさを語ったが、テストは少し簡単ではなかった。 プログラムが機能するかどうかを確認するために、次のことを行う必要がありました。





コードが機能しない場合は、手順全体を繰り返す必要があります。 この手順をどのように加速および促進できますか?



これを行うには、SIMカード用のAndroidエミュレーターを使用できます。 Android用のSDKであるオープンソースのSEEKがあります。 USB PCSCカードリーダー経由でSIMカードまたはSDカードにアクセスするためのパッチが含まれており、コンピューターと電話に接続したときにSIMカードの非互換性の競合を防ぎます。 コンピューターでAndroidエミュレーターを実行し、スマートフォンを使用せずにカードをテストします。



スマートフォンをカードリーダーとして使用できますか? カールはこの質問に答えます。



実際、ほとんどの無線インターフェースでは、SIMカードと直接通信することはできません。 この問題は、リモートSIMアクセスプロトコルを使用して解決できます。 この方法は、「Bluetoothを介したSIMカードへのリモートアクセス」という名前でヨーロッパに存在します。 これは、組み込みの認証を備えたプロファイルです。 彼は、APDUを送受信できるアプリケーションを作成する必要があります。 ただし、この方法ではスマートフォンが「レンガ」に変わる場合があるため、このプロファイルをすべてのスマートフォンに連続してインストールしないでください。



今後の開発の方向性を紹介したいと思います。 STKキットは優れたツールですが、使用には制限があります。 これは疑問を投げかけます。SMSボットネットを作成することは可能ですか? 結局、SIMカードはセルラーネットワークを介した通信用に設計されており、情報の交換にオペレーティングシステムを必要としないため、それらを共通のネットワークに結合する機会があります。



AndroidアプリケーションとSIMカードアプレットの統合は、たとえばSIMカードでの承認のための安全なSSH秘密鍵の保存や、電子通貨BitCoinによる安全な操作など、大きな機会を開きます。 OTAテクノロジーにAndroidアプリケーションを使用するというアイデアがあります-「無線でプログラムを更新する」、これにはSMSパッケージを使用します。



別の分野はNFS機能の改善です、エリックはそれについてあなたに話します。







たとえば、単線式SWPプロトコルを使用すると、SIMカードとNFSコントローラー間の直接接続を確立できます。 つまり、SIMカードは、VISAやMasterCardの銀行カードと同じように、携帯電話のオペレーティングシステムを使用せずに直接動作できます。



SIMカードは、セキュリティ要素として機能するか、ISISモバイル決済システムで使用できます。 これは非常にゆっくりと導入されているアメリカのシステムであり、モバイルバンキングとTelcosモバイル通信を組み合わせたものであり、私たちのアイデアはそれらに役立つかもしれません。



SIMカードを使用して、モバイルアプリストアに対する制御の喪失を復元することもできます。 次の特性により、SIMカードをセキュリティ機能として使用できます。









したがって、SIMカードのメーカーは、その潜在的な能力について考え、説明した領域で機能を開発する必要があると思います。



ご希望の場合は、サイトからアプリケーションダウンロードできます。その操作には、カードリーダーなど、20ドル以下の価値がある特定のデバイスが必要になります。 そこでは、このプレゼンテーションのスライド、アプレットのスクリプト、Java CardのMakefile、Androidエミュレーターのパッチ、その他多くの便利なものを見つけることができます。





ご滞在いただきありがとうございます。 私たちの記事が好きですか? より興味深い資料を見たいですか? 注文するか、友人に推奨することで、私たちをサポートします。Habrユーザーが独自に発明したエントリーレベルサーバーのユニークな類似品で30%割引: VPS(KVM)E5-2650 v4(6コア)10GB DDR4 240GB SSD 1Gbps 20ドルまたはサーバーを分割する方法? (オプションはRAID1およびRAID10、最大24コア、最大40GB DDR4で利用可能です)。



Dell R730xdは2倍安いですか? オランダとアメリカで249ドルからIntel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 TV2台持っているだけです! インフラストラクチャビルの構築方法について読んでください クラスRは、1米ドルで9,000ユーロのDell R730xd E5-2650 v4サーバーを使用していますか?



All Articles