画像:Sascha Kohlmann、CC BY-SA2.0
単なる人間がデフォルトでアクセスできないシステ そして、そのようなシステムの開発者は、彼らが浸透し、研究者の鋭い目から保護されていると単純に信じています。
少なくともAtm(ATM)を取る。 未知の人々がAtmに近づき、ラップトップを接続し、お金を取ってシステムにログを残さずに去ることは珍しいことではありません。 そして、”カツレツ”(カツレツメーカーと呼ばれるマルウェア)との最近の話は、さらに不死身のシステムがないことを確認しています-研究されていないも
研究を開始
ATMからお金を盗む唯一の方法は、ダンプトラックに到着し、フックでATMをピックアップし、臓物でそれを引き裂いてから、グラインダー、スクラップ、ガス溶接機を使用することであるという意見があります。 しかし、別の方法があります。
Ebayで簡単に検索した後、私は私の机の上にファームウェア付きのNCR USB S1ディスペンサーディスペンサーハンカチを持っていました。 目標は次のとおりでした:
- コンピュータがUSB経由でディスペンサー自体に送信したコマンドの暗号化のバイパスを見つける、特に紙幣を発行するための
- 前の段落からコマンド暗号化キーを生成するための認証(カセットをジャグリング)のための金庫への物理的なアクセスの必要性をバイパスする方法を学ぶ。
ファームウェア
ファームウェアは、VxWorks v5.5.1で実行されているNXP ColdFireプロセッサ(Motorola68040、私のお気に入りのプロセッサ)のELFファイルです。
興味のあるELFファイルには、二つの主要なセクションがあります-。テキストと.データ:
- そのうちの1つには、ディスペンサーがATMの上部にあるシステムユニットに接続されているときに、すべてのメインタイムをオンにするコードが含まれています(それをメインファームウェアと呼びましょう)。
- 第二に、ブートローダコードはzlib(ローカル名はUSB Secure Bootloader)を使用してパックされています。
そして、最良の部分は、ファイル内にカットされていない文字があることです-それを取って、面白いものを探してください。
メインファームウェアの内蔵デバイス
コードをメインコンポーネントに分割すると、以下のスキームが得られます(提出順):
- USBパッケージの受信とサービス間での配布を処理するストリーム。
- サービスは基本的な実行単位であり、それぞれが独自の役割を持ち、それぞれが独自のタスク(クラス)を持っています。
- クラス-ここでは、サービスがコントローラの助けを借りて実行できるタスクです。
- コントローラは、実際には、送信されたタスクの検証、実行、および応答パケットの形成に従事する”ワーカー”(ワーカー)です。
ファームウェアには多くのコードがあるため、すべての可能なサービスを検索してから、タスクがどこに転送されているかを調べることにしました。
その結果、私が探していることをしなければならない次のサービスが見つかりました:
1)DispTranService(Dispenser Transaction Service) : 暗号化されたコマンドでの作業、紙幣の束の生成、認証。 あなたは最も興味深いと言うことができます-ここで。
2) securityService:ディスペンサー側での認証の後、セッションキーが生成され、コンピュータの要求に応じて暗号化された形式でコンピュータに送信されます。 このキーを使用すると、すべての重要なコマンドが暗号化され、発行され、紙幣のスタックが形成されます。
その後、別のサービスが私の目を引いた:UsbDownloadService。 そのタスクは、コンピュータとATMコンピュータに保存されているディスペンサーのファームウェアバージョンのバージョンにディスペンサーを接続し、OSが動作す このサービスは、ファームウェアのバージョンに関する情報を提供することもできます。
物理認証
物理認証は最高レベルで実装されており、ATMが許可なしに発行するUSBコマンドを送信するだけでなく、ATMを保護します。 この場合、お金を使って開いた金庫でのみ、次のいずれかの操作を実行する必要があるという事実にあります:
- 下部カセットを取り外して挿入し、
- ラック背面のトグルスイッチをディスペンサーで切り替えます。
しかし、これはすべて、アクセスレベルが最大に設定されている場合、つまり物理的な場合にのみ必要です。 そのうちの3つがあります:USB(0)、論理(1)、および物理(2)。 残りの2つは、ファームウェアのデバッグとテストのためにサービスプロバイダと開発者によって使用されます。 まあ、物理的なものは、デフォルトで使用するためにベンダーによって強く推奨されています。
脆弱性
以下では、サービスエリアへのアクセスがあるが、金庫へのアクセスがない場合(例えば、ATMフロントパネルに作られた穴を介して)、現金を含むディスペンサーの任意のコマンドを実行する重大な脆弱性(記事の公開時にベンダーによって既に修正されている)について説明します。
判明したように、UsbDownloadServiceは暗号化を必要としないコマンドを受け入れます。 それは魅力的に聞こえる。 しかし、その後、すべてがさらに保護され、名前セキュアブートローダは、自分自身を正当化しますか?
(ネタバレ:正当化しない!
私たちは深く行く必要があります
すでに述べたように、で。データセクションには、長い間私の興味を喚起しなかったパックされたブートローダコードがあり、私の同僚はファームウェアを調べたときに注意を払わなかっ
ブートローダの存在は秘密であったが、質問は開いたままであった:コンピュータ上のソフトウェアはどのようにファームウェアをいっぱいにしたのか? 結局のところ、メインファームウェアには何も見つかりませんでした。
したがって、ブートローダは解凍され、オフセット0x100000でIDAにロードされます。.. 文字だけではありません!
それは問題ではありません:メインファームウェアとブートローダコードを比較し、コントローラのデータシートを読むと、特定の画像が現れ始めます。
ファームウェアのアップロードは、保護されているようですが、実際にはそうではないことが判明しました。 それを正しく記入する方法を知る必要があります。
このプロセスを完全に理解するためにはかなりの労力と時間が費やされました(詳細は報告書”Blackbox is dead—Long live Blackbox!2018年にラスベガスで開催された”ブラックハット2018カンファレンス”に参加した。 Nvramのメモリをはんだ付けし、コントローラ全体を”振りかける”ためにバックアップをアップロードするコストはいくらですか。.. 彼の忍耐のための同僚Alexeyに感謝します!
その結果、ファームウェアをディスペンサーにアップロードするための以下のアルゴリズムが得られました。
1)RSA鍵のペアを生成し、公開鍵をコントローラに注ぎます。
2) を連続して書きます。データと.ELFからセクションヘッダーからの物理アドレスまでのテキストセクショ
3) 記録されたデータからSHA-1を計算し、秘密鍵でハッシュを暗号化し、コントローラに送信します。
4) 記録されたすべてのファームウェアワードの合計を数えて送信します。
その後、すべてが正常に計算され、記録されると、メインファームウェアがダウンロードされます。
ファームウェアを書くときには、一つだけの制限があることが判明しました:ファームウェアのバージョンは現在のものよりも低くすべきではありません。 しかし、結局のところ、誰もそのデータ自体のファームウェアバージョンを置き換えるために私たちを気にしません。
その結果、アンチセキュリティ-フィックスを備えた私の特別なファームウェアが浸水し、正常に起動されました!
この時点で、メインファームウェアのコードがよく研究され、紙幣を発行するためのコマンドが見つかりました。 今、彼らは暗号化されていない送信することができ、ディスペンサーは喜んでそれらを実行します。
引き渡し
研究中に経験したすべてのこと(例えば、実際のATM zakirpicheny)の後、結果はとても楽しく、アルゴリズムが別の主要なベンダーと繰り返すことを望んでいた努力を補うものでした。
本物のATMは回転し始め、喜んで私たちと新鮮な鮮明なノートを共有しました(この場合、ベンダー”キャンディラッパー”)。 魔法は適用されませんでした:ラップトップ、脳、USBコードだけ。
調査結果
私たちは、あいまいさによるセキュリティの原則に基づいて、適切な保護を提供することは不可能であると再び確信しました。 コードまたはファームウェアの妥当性は、攻撃者がある時点でそれにアクセスできず、見つかった脆弱性を利用しないことを意味するものではありません。 利己的な目標の実施に必要なものはすべて、一定の金額の存在下で取得することができます。
開発者はコードを扱うべきであり、セキュリティ専門家はそれを保護すべきである。 そのため、最も生産的なアプローチは、それぞれの特定のケースで適切な保護を構築するのに役立つ様々なシステムのセキュリティを確保するのに十分な経験を持つ情報セキュリティ企業との協力であると思われます。
PSベンダーは、2018年の2月の修正で修正されたと宣言された脆弱性(この違反は別のモデル-S2にも発見されました)を確認しました。
:
- CVE-2017-17668(NCR S1ディスペンサー)、
- CVE-2018-5717(NCR S2ディスペンサー)。
おかげで
私の前に、私の同僚、Dima SklyarovとMisha Tsvetkovは、すでに(ディスペンサーボードなしで)ファームウェアに取り組んでいました。 彼らの成果は、私が彼らにとても感謝している研究で私を大いに助けました! “鉄”の部分でAlexey Stennikovは私をたくさん助けました。