
みなさんこんにちは。 今日は、POS(以下POS)システム、そのアーキテクチャ、およびセキュリティについてお話したいと思います。 おそらく、お店の長い列からの休日後のショックは過ぎ去りました、そして、ソーシャルコミュニケーションのこのベールの背後にあるものを見る時が来ました。 以下で説明する調査は、 @ chipikと私によって行われました。
最新のPOSシステムは、支払いトランザクションを実行し、毎日のビジネスプロセスを容易にするソフトウェアとハードウェアのソリューションの組み合わせです。 POSについて言えば、通常はレジ、支払い端末、および小売店の他のよく知られているコンポーネントを意味します。 ただし、POSアーキテクチャはこれらの要素に限定されません。 セキュリティに関しては、これは新しいトピックではないようです。2012年以降、BlackHat USAのほぼすべての会議で支払いシステムに関するレポートがありました( here 、 here 、 here 、 here )。 しかし、これらのレポートはすべて、議論中のトピックに非常に近いものであるため、まだ何か別のことを扱っています。
わかりやすくするために、通常の店舗での支払い手順を見てみましょう。

まず、買い手は端末のリーダーにカードを渡し、購入代金を支払います。 クレジットカード情報は端末に送信され、そこからPOSシステムに送信されます。 さらに、POSシステムはPSP(Payment Service Provider)に連絡します。PSPは、クレジットカードの種類に応じて、銀行に連絡して取引承認手続きを完了します。 この時点で、バイヤーはPINコードを入力して取引を確認するように求められます。 すべてがうまくいった場合、認証コードが銀行ネットワークからPSPに返され、POSシステムと端末に転送されます。 上記の通信はすべて数秒以内に行われます。
最初に言及された調査と攻撃は、主に支払端末と買い手との相互作用を目的としています。 今日、別の部分が考慮されます-トランザクションデータが通過するPOSシステム。
さまざまなビジネスプロセスについて何度も話していますが、それは何ですか? たとえば、古典的なチェーン店を考えてみましょう。 店内にはマネージャーがいますが、ほとんどの場合マネージャーがいます。 毎朝、マネージャーは店を開き、次にPOS端末を開く必要があります。 POS端末は支払い端末とは異なることに注意してください。 最初の画像は支払い端末で、2番目の画像はPOS端末です。


起動中に、POS端末は時間を同期し、商品の価格、在庫状況、その他のサービスデータなどの更新されたパラメーターをストアのサーバーから受信します。 その後、レジ係は自分の仕事にログインして仕事を始めることができます。 明らかに、チェックアウト時のすべてのアクションがログに記録されます。

一日の終わりに、マネージャーは逆の順序で手順を繰り返す必要があります。最初にチケット売り場を閉じ、次に店を閉じます。 このアクションの後、ストアが開くまでトランザクションを作成できません。 終了時に、POS端末はログをサーバーに送信します。 これらは上記のビジネスプロセスです。 簡素化および促進するのは、POSシステムです。

POSシステム市場には非常に多くのソリューションがあり、小規模、中規模、大規模の組織向けに製品グループに分けられています。
ほとんどの場合、これらのアーキテクチャは類似しています。 この記事では、SAPソリューション「SAP Point of Sale」を詳しく見ていきます。 また、OracleのMICROS製品についても調査しました。この製品では、2018年1月(CVE-2018-2636)にクローズされた同様の脆弱性が見つかりました。
SAPの詳細については、 公式Webサイトをご覧ください 。 簡単に言うと、SAPは大企業向けの大規模なERPソリューションを開発しています。 製品としてのPOSシステムは2005年にSAPに登場し、POSソリューションのみを扱うTriversity Transactionware GMを買収しました。
SAP POSアーキテクチャ

このシステムのアーキテクチャは、フロントオフィス、バックオフィス、および本社の3つの部分で構成されています。 最初の部分には、クライアント部分、つまり POSクライアントおよびモバイルPOSクライアント。キャッシャーが働くPOS端末です。 フロントオフィスは、ローカルストアサーバー(Xpressサーバー)、データベース(データベース)、およびPOSシステムのローカル管理ソリューション(ストアマネージャー)が配置されているバックオフィスに接続されています。これらを使用して、マネージャーがストアと端末を開閉します。
ローカルソリューションについて言えば、特定の店舗を意味します。SAPPOSは大規模な組織向けの製品であり、一元管理された店舗チェーン向けにアーキテクチャ的に考案されたためです。 つまり、この場合、ローカルソリューションはネットワーク内の店舗の1つのPOSシステムです。
店舗ネットワークのグローバル管理は、すべての店舗サーバーに接続されているStore Configuratorを使用して、本社から実行されます。
一般的なレビューは完了しました。次に、すべてがどのように機能するかを詳しく見てみましょう。 そして、次の順序で移動します。

本社

Store Configuratorは、POSシステムのすべてを完全に設定できるアプリケーションです。 いいえ、絶対にすべてではありません。ユーザーとレジの画面の外観から始まり、暗号化やその他のセキュリティ設定で終わります。
これはどのように実装されていますか? Store Configuratorに変更を加えた後、管理者は「変換」をクリックする必要があり、これらのパラメーターを持つ特別なファイルが「Store Configurator / data / parm /」フォルダー内のファイルシステムに作成されます。
パラメーターだけでなく多くのファイルがあり、それらの拡張子も異なります。 以下に例を示します。
- cnummask.cmk-顧客のカード番号の「マスク」に関する情報、つまり 小切手に何個、何個の数字が入るかについて。
- rcptlogo.rcp-これは会社のロゴに関するデータで、小切手に印刷されています。
- cashier.clg-個人データ(名前、生年月日、電話番号)および認証データ(ログイン、パスワードハッシュ)など、POSシステムのユーザー(キャッシャー、マネージャーなど)に関する情報が含まれています。
- layout.ui0-POS端末の外観、キーの位置、背景画像などに関する情報が含まれています。
ファイルの内容は、Store Configuratorで指定されたパラメーターのテキスト表現です。 以下の画像は、rcptlogo.rcpファイルです。

次に、管理者はこれらのファイルを各ストアサーバーの「/ Xpress Server / parm /」フォルダーにコピーする必要があります。 Store Configuratorによって作成されたファイルには、「特別な」ファイルが1つあります。 「newparm.trg」と呼ばれ、記号「Z」のみが含まれています。 Xpressサーバー(ストアサーバー)、30秒ごとにフォルダー「/ parm /」でこのファイルの存在を確認します。 見つかった場合、ダウンロードしたファイルから更新されたパラメーターを適用し、「newparm.trg」を削除します。 したがって、このファイルは一種の更新トリガーとして機能します。
バックオフィス

次の行はバックオフィス、またはむしろ、その中でのコミュニケーションです。 前述のように、Xpressサーバー、データベース、およびストアマネージャーで構成されています。 これらのコンポーネントはすべて、1台のマシンまたは別のマシンにインストールできます。 Store Managerは、標準ポートを使用してデータベースと対話します。この場合、機能が制限されているStore Configuratorと非常によく似ており、唯一の違いは、ストアドプロシージャを使用してパラメータ変更をデータベースに直接書き込むことです。
システム調査の一環として、ssp_insert_backdoorとssp_delete_backdoorの2つの楽しい手順が見つかりました。 彼らの主な目標は、「back」という名前と「door」というパスワードと昇格された特権を持つユーザーを作成することです。 もちろん、これはPOSシステムのすべてのユーザーが認証データを忘れた場合にのみ行われます。

Store ManagerとXpress Server間の相互作用はポート2202で実行され、より興味深いように見えます。 ストアマネージャーの機能を調べたところ、興味深い機能を提供するストア管理セクションが見つかりました。
- まず、接続されているすべてのPOS端末が表示されます。
- 第二に、それらは開閉できます。
- 第三に、キャッシャーの画面に表示されるすべて(購入と小切手に関する情報)を追跡できる監視機能があります。

Store ManagerがXpressサーバーのポート2202(WireSharkなし)に送信するパッケージを確認した後、プレーンテキストコマンドを見ました。 「これはtelnetプロトコルであり、ポートは重要な構成ではなく監視に使用されます」-ドキュメントから学びました。 さて、外部マシンからこのポートに接続しようとするとどうなりますか?
結局のところ、ホワイトリストは提供されていません。 デフォルトでは、このポートは開いており、セキュリティガイドにポートを閉じることに関する推奨事項はありません。 当然、サードパーティのツールでポートへのアクセスを制限することもできますが、POSシステムのセキュリティに注目していますよね?
ポート2202でXpressサーバーに接続した後、POSシステムのバージョンに関するウェルカムメッセージが表示されます。 helpコマンドは、使用可能な機能のリストを返します。
999 *** XPRESS SERVER MOST COMMON COMMAND HELP *** 999 MONXPS [ON|OFF] 999 [SHOWTERM|TERMINAL-STATUS] [ALL|Term#] 999 [MONTERM|MONITOR-TERMINAL] [ALL|XPS|Term#] [START|STOP|ON|OFF] 999 OPEN-TERMINAL [ALL|Term#] 999 OPEN-STORE [TODAY|NumberOfSecsSinceJan1-1970] 999 CLOSE-TERMINAL [ALL|Term#] [FORCE|NO-FORCE|ABORT] 999 TERMINAL-BALANCE [Term#] [BAL|UNBAL] 999 CASHIER-BALANCE [Cashier#] [1|2|3] [ShortOver Amount] [netTenderTotal] <
これらの関数の名前から、それらの目的は非常に明確です。 チェックがないため、POSターミナルを匿名で開いたり閉じたり、発生するすべてを監視したり(たとえば、購入時にチェックの内容がコンソールに表示されたり)、Xpress Serverをオフにしたりできます。
これらの関数がコードにどのように実装されているか、およびすべてのコマンドが「ヘルプ」出力に表示されるかどうかは非常に興味深いものになりました。 着信要求を処理するプロセスはxps.exeです。 少し逆に、可能なチームのリストが見つかりました。 74個のコマンドがあります。74個のコマンドがポート2202からXpress Serverによって受信および処理されます。すべてを説明するには長すぎたので、最も興味深いものについて説明しましょう。

APM-VALIDATE-PASSWD-ユーザーが入力した認証データを確認できます。 このコマンドは3つの異なるコードを返します。0-ユーザー名とパスワードが正しく入力された場合、1-パスワードが正しくない場合、10-このログインを持つユーザーが存在しない場合。 明らかに、潜在的な侵入者を防ぎ、ストアのローカルネットワークにいて、ログインとパスワードの可能なすべての組み合わせを分類し(ログインは数字のみで構成できます)、POS端末にアクセスするためのデータを受信します。

しかし、ブルートフォースはあまりクールではないため、ユーザーパスワードを新しいパスワードに変更する別のコマンドReset passwordがあります。 知っておく必要があるのは、ログインです。これはブルートフォースによって取得できます。 そしてもう一つの小さな説明。 このPOSシステムでは、ログインは数字のみで構成できるため、仮想検索が非常に容易になります。

FILE-FIND 、 FILE-OPEN、およびFILE-READコマンドを使用すると、Xpress Serverファイルシステム上のデータを検索、開く、読み取ることができます。 あなたはまだこれらすべてが匿名で登録とSMSなしで起こることを覚えていますか? 奇妙なことに、FILE-OPENコマンドのパラメーターはC ++関数fopen()に直接渡され、モードが正しく指定されていない場合、Xpressサーバーアプリケーションはエラーを受信して終了します。

レビューの最後の部分に移りましょう。
フロントオフィス

POSターミナルとも呼ばれるPOSクライアントは、ポート2200でサーバーに接続します。すべての情報、すべてのトランザクション、および一般にすべての通信は、このポートで、この方向でのみ行われます。 ビジネスプロセスを思い出すと、すべては次のように発生します。 1日の初めに、マネージャーがPOSターミナルを開くと、サーバーにパケットを送信します。「サーバー、端末番号5、開いています。新しいパラメーターを送信して、日付と時刻を同期しましょう。」 一日の終わりに、マネージャーがPOSターミナルを閉じると、マネージャーにログがサーバーに送信されます。 もちろん、各トランザクションの後、それに関するデータと商品の数量の変化に関するデータもサーバーに送信されます。 POS端末とXpress Serverの間のトラフィックを調べたところ、ファイルを受信およびダウンロードするためのパッケージには特定の構造があることがわかりました。

Len-送信するパケットの長さ。 どこ-データを書き込む場所。 データを取得する場所はどこですか。 終了-NULLバイトのペア。 タイプ-パッケージで実行されるアクションに応じて、パッケージのタイプ。 パッケージには次のものがあります。

したがって、たとえば、サーバーから設定ファイルを取得するために、POSクライアントはタイプRのパケットをポート2200に送信します。
{R0059}C:\\local_directory\poc.txt,C:\remote_directory\poc.txt,0,0;
このパッケージに含まれるもの:
- Rはタイプです。
- 0059-データ長;
- C:\ local_directory \ poc.txt-ファイルの書き込み先。
- C:\ remote_directory \ poc.txt-サーバー上のファイル保存場所。
- 0,0はパケットの終わりです。
応答では、POSクライアントは要求されたファイルのコンテンツを受信し、それを特別なディレクトリ内の自分自身に書き込みます。 別のマシンからPOSクライアントによって送信されたパケットを複製しようとすると、応答はサーバー上のファイルの内容も受信しました。 ご覧のとおり、ここにもチェックはありません。Xpressサーバーのポート2200は、任意のマシンからのパケットを受け入れて処理します。
面白そうに見えましたが、ファイルを読んでもそれほど遠くはありません。 ファイルをサーバーにアップロードするために一連のパッケージを収集してみましょう。 結局のところ、POSクライアントは何らかの形でサーバーにログを書き込むのですか?

最初に、タイプSのパケットを送信します。Whereフィールドには、データを書き込むサーバー上のパスが含まれます。Whatフィールドはオプションです。すべてを手動で行うためです。ただし、Sizeサイズは非常に重要で、次の2番目のパケットのサイズを示します。 タイプはF-FILE_DATAで、サイズとサーバーに書き込むデータ(コンテンツ)で構成されます。 さて、3番目の最後のタイプCパッケージはファイルの終わりです。 その後、Xpress Serverは指定されたディレクトリにファイルを書き込み、タイプG-GOODのパッケージを返します。 奇妙なことに、間違ったサイズフィールドでパケットを送信すると、Xpress Serverはサーバー上のファイルを削除します。 以下に、ファイルの匿名書き込み、読み取り、削除のビデオPOCを示します。
したがって、チェックがないため、このポートに接続できるユーザーは誰でもサーバー上のファイルの読み取り、書き込み、削除ができます。
そして、これは何を得ることができますか? 上記の機能を組み合わせることで何が達成できるかを見てみましょう。
そのため、攻撃者はストアのローカルネットワークにアクセスする必要があります。 通常、それを取得することは難しくありません。 体重計を含む周辺機器は定期的にホールに配置されており、それらへのアクセスは無制限です。
システムの知識を要約しましょう。
- Store Configuratorは、システムパラメーターを使用して特殊ファイルを作成し、Xpressサーバーにコピーします。Xpressサーバーは、ファイル「newparm.trg」を検出するとパラメーターを適用します。
- 攻撃者は、ポート2200を使用して、Xpressサーバー上の任意のディレクトリの任意のファイルに任意のデータを書き込むことができます。
- POS端末はXpress Serverから更新された設定を受け取り、開いた後にそれらを適用します。
- 攻撃者は、ポート2202を使用して、POSクライアントを匿名でオフおよびオンにすることができます。
これらの機能の組み合わせにより、SAP POSシステムのパラメーターを変更できます。
たとえば、攻撃者が1ドルで商品を買いたいとします。

- 攻撃者は構成ファイルをXpressサーバーのparmフォルダーに書き込み、製品の新しい価格を示します。
- 攻撃者はトリガーファイル「newparm.trg」をXpressサーバーのparmフォルダーに書き込み、サーバーの設定の更新をアクティブにします。
- サーバーは設定を更新しています。
- 彼はそれらのいくつかをデータベースに書き込みます。
- 攻撃者はターミナルクローズコマンドを送信します。
- Xpressサーバーは端末を閉じ、端末はサーバーにログを送信します。 このプロセスには10〜30秒かかります。
- 攻撃者は、開いている端末にコマンドを送信します。
- ターミナルが開きます。
- 端末は、サーバーから新しいパラメーターをダウンロードして適用します。
実際、それがすべてです。 しかし、まだ何かが欠けています。つまり、サーバー上でコマンドをリモートで実行する機能です。 しかし、彼女は一般にそうです。

Xpressサーバーが設定を更新するたびに、つまり トリガーファイル「newparm.trg」を見つけると、「XPSPARM.BAT」と「StopTN.BAT」の2つの「.bat」ファイルを検索して起動します。 そしてこれは、攻撃者がそれらを上書きし、自分自身で逆シェルからスクリプトを実行できることを意味します。

攻撃者はポート2200を使用して、ファイル「XPSPARM.BAT」を自分のものに置き換えます。 ファイル「newparm.trg」を書き込みます。これにより、パラメーターの更新と「* .bat」ファイルの起動が行われます。
暗号化
はい、暗号化はSAP POSで使用されますが、デフォルトではデフォルトで無効になっています。 暗号化が設定されている場合、重要なデータはすべて暗号文として送信されます。 暗号化されるのはデータであり、システムの要素間の通信ではないことを明確にする必要があります。 たとえば、暗号化が有効になっている端末でトランザクションを監視すると、クレジットカード番号の代わりに暗号文のみが応答で受信され、残りのデータはクリアテキストで送信されます。

この表は、暗号化手順に合格する必要があるテーブル名とフィールドを示しています。 同時に、追加のテーブル「CryptoRegister」がありますが、これには同じものがリストされていますが、暗号化の「レベル」が示されています。 たとえば、ユーザーパスワードはハッシュ値として保存され、暗号化レベルは4で、クレジットカード番号は3DESで暗号化され、レベルは3です。
SAP POSは、TWSecurityツールを使用してキーを保存および生成します。 起動すると、特別な「コンテナ」が作成され、暗号化キーを保存するパスワードのみでアクセスできます。 3DESは対称アルゴリズムであるため、キーはシステムのすべての要素(フロントオフィス、バックオフィス、および本社)で同じでなければなりません。 すなわち コンテナを作成したら、POSシステムのすべての部分にエクスポートする必要があります。 キーへのアクセスは、レジストリに登録されているトークンによってのみ実行されます。 そして、すべてがクールになりますが、1つの「しかし」があります。

データの暗号化に使用されるキー(またはそのトークン)はStore Configuratorで設定されます...これは、他のパラメーターと同様に特別なファイルに変換され、攻撃者が空の値に変更してSAP POSの暗号化を無効にできることを意味します。
「パッチを適用し、パッチを適用し、最終的にパッチを適用しました!」...またはこの状況で何をすべきか

現在、この記事で説明されている脆弱性は解決されています。 はい、初めてではなく、ほぼ2回目になりました。 そのため、最初のSAPノート2476601は2017年7月11日にリリースされ、CVSS 8.1があり、「SAP POS(Point of Sale)Retail Xpress Serverの認証チェックの欠落」と呼ばれていました。 ポート2202(telnet)へのアクセスは修正されました。 これは、新しいパラメーター「BACKOFFICEIPADDRESS」を追加することで行われました。デフォルトは「localhost」です。 しかし、同時に、ポート2200の2番目の脆弱性については言及されていませんでした。正常に機能し、攻撃者がコマンドをリモートで実行できるため、このパラメーターを変更するだけで7月の新しいパッチを「バイパス」できます。 私たちのチームは、この欠陥をSAP Product Security Response Teamに報告し、2017年8月18日に2つの完全なSAP Note-2520064と2520232をリリースしました。 SAP Note 2520232は、2つのストアドプロシージャssp_insert_backdoorとssp_delete_backdoorを削除します。 SAP Note 2520064により多くの変更が加えられました。 このパッチは、さまざまなSAP POSアイテム(POSクライアント、Xpressサーバー、Store Configurator、Store Manager)の間で交換されるほぼすべてのパッケージに3DES暗号化を追加しました。 すなわち キーを知らなくても開いているポートに接続できる場合でも、POSシステムに影響を与える方法はありません。サーバーは、暗号化されていないパケットを認識せず、単に破棄します。
これは本当に興味深い解決策ですが、いくつかの事件がありました。 SAP Noteのリリースのほぼ直後に、Store Managerが機能していないという多くのメッセージがフォーラムに表示され始めました。 実際、SAPはStore Managerを忘れていた、またはむしろ、このコンポーネントがXpress Serverだけでなくデータベースとも対話することを忘れていました。 ストアマネージャーが暗号化されたパケットをデータベースに送信すると、クリアテキストエラーが返されます。このエラーは、ストアマネージャーが解読できず、単にクラッシュします。 この点で、以前のパッチのエラーを修正する最終パッチがリリースされました。 それでも、インフラストラクチャへの潜在的な攻撃から保護するための最善のソリューションは、常に成功するとは限りませんが、定期的な更新です。
実話
そしてここに西からの興味深いニュースがあります:Forever 21、カリフォルニアに拠点を置く会社、米国のファッション小売業者、1984年以来世界中で服を販売しています(815店舗、57か国、米国、オーストラリア、ブラジル、中国、フランスなど)、2017年12月28日、POSシステムの一部が4月3日から11月18日までに侵害されたという情報を確認しました(!!!)。 専門家によると、攻撃者はPOSシステムのネットワークに匿名でアクセスし、それを使用して悪意のあるプログラムをインストールし、顧客のクレジットカードに関する情報(カード番号、有効期限、所有者、認証コード)を収集しました。 これらのシステムの重要なデータの暗号化が4月3日から11月18日までの期間に無効になった(そう、機能しなかった)のは面白いことです。 明らかに、暗号化はSAPシステムだけでなく、大きな問題ではありません。 残念ながら、どのPOSシステムが侵害されたかに関する正確な情報を見つけることはできませんでした。 ニュースを信じる場合、2017年6月28日にForever 21は東芝グローバルコマースソリューションズとそのシステムの供給に関する契約を締結しましたが、この時点で現在のシステムはすでに侵害されていました。