プログラムがリモート検証サーバーと通信できる場合、プログラムを変更から保護する方法について質問があります。より具体的には、Android APKファイルを要求していますが、他のプログラムにも移動できます。
次の架空のシナリオを想像します。
ユーザーがダウンロードしてデバイスにインストールしているAPKインストールファイルがあります。アプリケーションは、インストールされて使用された後、その整合性に関する「some information」をリモートサーバーに送信しています。サーバーは、プログラムに問題がないこと、またはハッカーによって変更されていることを検証しています。
そのシナリオとAPKがJavaで記述されているという事実を考えると、開発者がアプリケーションファイルのハッシュ値を生成するために使用できるいくつかの方法があるため、後でこのハッシュをリモートサーバーに送信して、次のことができるようになります。そのハッシュを検証します-ファイルサイズのハッシュ、または他の種類の構造?
検証サーバーに送信される "some information"を生成するいくつかの方法に興味があります。
このシナリオは私にはそれほど明確ではなく、おそらくこれをより簡単に達成できる他の方法があるので、質問があまり適切に質問されない場合は修正してください。どうもありがとう!
---拡張---
こんにちは、回答ありがとうございます!
私は問題について深く考えていなかったので少し答えに驚いています。これを行う簡単なメカニズムがあると思いました:)しかし、今ではTPMでも100%の保護を保証できないと聞いています。 。
この件に関しては、もう少しお聞きしたいと思います。コピー防止メカニズムのように、プログラムを再配布から保護したくない。私は時々検証サーバーを介してプログラムがテストされ、修正されていないことを望みます。
これはシナリオです:
アプリケーションを配布している(ダウンロードを提供している)サーバーは、奇妙なアルゴリズムがある場合、その奇妙なアルゴリズムでプログラムのハッシュを計算します。その後、プログラムは同じ奇妙なアルゴリズムを使用して自分自身のハッシュを計算し、それをサーバーに送信します。次に、サーバーは2つのハッシュを比較します。たとえばJMP命令などのファイルを誰かが変更した場合、ハッシュは異なり、アプリはハッキングされたと見なされます。このシナリオの欠陥は何ですか?誰かがアルゴリズムを解読して、プログラムからハッシュを計算し、後で同じ値をサーバーに送信するようにプログラムを変更できるとしたら?
そして、これが事実であるとしても、これはまだ誰かがやらなければならない多くの仕事であり、それは価値がないかもしれないと思いますか?
あなたが説明するシナリオは、「リモート認証」の概念に非常に似ています。これについては多くの研究が行われており、2つの主要な結果があります。
アプリを安全に測定し、結果をサーバーに報告するには、TPMや信頼できるシステムサービスなどのトラストアンカーが必要です。それ以外の場合は、常に正しい応答を生成するシミュレータを構築できます[1]。
すべての信頼できるコンピューティングインフラストラクチャを展開して使用した後でも、今日の標準のアンチバッファオーバーフローテクノロジーを展開するよりも、アプリの脆弱性の悪用を防止または検出することはできません。
したがって、これを今すぐ展開する場合は、コードの難読化が最善の選択肢です。基本的に、何十年にもわたって実装および破壊されてきたのと同じように、コピー防止メカニズムを実装したいと考えています。
[1]クライアントプラットフォームの計算と通信の制限を利用するいくつかの非常に優れた進歩がありましたが、これはまだSFです。
このシナリオの欠陥は何ですか?
ここでの基本的な欠陥は、リモートパーティがルールを順守していると想定していることです。
プログラムを備えたサーバーがあります。
ダウンロード要求を受け取ります。
この時点では、リモートダウンローダーが誰であるか、または何であるかがわかりません。
ダウンロードした敵は、好きな場所に保存できます。デバッガ、エミュレータ、物理ハードウェアのいずれかでプログラムを実行しようとする可能性があります。敵対者がデバッグ、逆アセンブル、実行、変更、または分析を行っている間、プログラムがリモートシステムと通信できないようにすることは非常に簡単です。
誰かがアルゴリズムを逆アセンブルしてプログラムからハッシュを計算し、後で同じ値をサーバーに送信するようにプログラムを変更できるとしたら?
ハッシュをサーバーに送信する際の基本的な問題は、プログラムがそのハッシュを送信できるようにするインセンティブがないことです。
アプリケーションファイアウォールを備えた標準デバイスを想像してください。ユーザーはプログラムを変更せずにダウンロードして実行します。プログラムがハッシュをサーバーに送信しようとすると、アプリケーションファイアウォールが「アプリケーションYourAppはインターネットに接続しようとしています。これを許可しますか?」というダイアログをポップアップします。ユーザーには、「はい」と答える動機はありません。
次に、プログラムを変更した敵を想像してください。アプリケーションファイアウォールを備えた標準デバイスでアプリケーションを実行します。ここで、アプリケーションファイアウォールがダイアログをポップアップします。攻撃者は、プログラムがサーバーと通信できないようにするインセンティブを持っています。
これはまだ誰かがやらなければならない仕事であり、それだけの価値はないかもしれないと思いますか?
ソフトウェアのリモート検証の問題は、何十年にもわたって取り組んできた根本的な問題です。特定のシナリオや潜在的な攻撃者に対してうまく機能するアプローチがあります。ただし、一般的な解決策はありません。
一部のリモートユーザーがターゲットハードウェアプラットフォームを完全に制御できるシナリオの場合、アプリケーションバイナリは分解が簡単で、ユーザーがアプリケーションとサーバーとの通信を許可するインセンティブはなく、せいぜいごくわずかしか検出されません。全体の変更の。最悪の場合、すべての変更は報告されず、変更されていないレポートは、誰もソフトウェアを変更していないという誤った感覚を与えます。
攻撃者がファイルを変更するのをより困難にすることができますが、最終的に攻撃者に与えるものの変更を防ぐことはできません。
これは、攻撃者が自分のコンピュータに完全にアクセスできることを前提としています。 Trusted Computing Groupおよび他のベンダーによって、所有者の能力を制限するためにいくつかの作業が行われています。これらの信頼できるコンピューティングモジュールは、主にゲームコンソールやスマートフォンで使用されています。ただし、この保護機能が邪魔にならないようになったら(たとえば、電話が「ルート化」されたら)、上記の段落が適用されます。
これらの変更には、サーバーに送信されるチェックサムが含まれます。注目に値する例を挙げましょう。オランダでは、NedapのCEOは、彼らの投票コンピュータは選挙にのみ使用でき、他には何も使用できない専用の専用マシンであると主張しました。 WVSNとCCCは、オープンソースのチェスプログラムを移植して、CEOが間違っていることを証明しました。保護の特別な機能として、投票コンピュータには、操作を防止するためにプログラムのチェックサムを計算して表示するボタンがあります。チェスプログラムは同じ数を表示しました。 ( ハイゼの記事 ドイツ語で)。
多くの異なるチェックサムを使用し、それらを平文ではなく計算の一部として使用することで、さらに困難にすることができます。Skypeは、JMPの宛先であるchecksums to computeをアンチデバッグテクノロジーとして使用します。標準のブレークポイントは、デバッグされたプログラムを変更するため、間違った場所にジャンプします。 Skypeは、2番目のコピーをOracleとして実行することにより、最終的にリバースエンジニアリングされました。 ( Skypeのシルバーニードル )
おそらくあなたの目標によりよく適合するもう1つの例は、SecondLifeです。 Second Lifeは、プレイヤーが自分のコンテンツを作成して販売できるオンラインゲームです。彼らのDRMにもかかわらず、クライアントに送信されるあらゆるタイプの情報(テクスチャ、アニメーション、サウンド)は違法にコピーされています。 サーバー上に保持される情報(ユーザースクリプト)のみが安全です。詳細については 海賊行為を効果的に防止するためのDRMテクニックはありますか?
延長について:
あなたが提案するスキームも簡単に破ることができます。ソフトウェアがサーバーに送信するハッシュを記録し、アプリを変更して、サーバーが要求するたびにハッシュに返信します。チャレンジレスポンススタイルのプロトコル(鮮度を提供するため)を作成した場合でも、アプリをデバッグして、応答の生成方法を確認できます。この攻撃は一般に常に可能であり、セキュリティは完全に難読化とアンチデバッグのテクニックに依存します。中程度のセキュリティでクライアントの90%を騙す可能性がありますが、プログラムの「クラック」を公開するのに必要なのは1人だけであり、誰もが正しいハッシュをサーバーに送信する修正バージョンを使用できることを覚えておいてください。
このトピックに関する現在の研究のキーワードは、「ソフトウェア認証」または「セキュアなモバイルエージェント」です。これらのメカニズムは、実際には達成が難しいいくつかのかなり強い要件の下でのみ安全です(グーグルの「ソフトウェア認証の難しさ」および「PUFベースの認証」)。
このような問題を実際に解決する最善の方法は、現在および現在、サービスの重要な部分をサーバーに移動することです。実際の価値がサーバーとの通信に由来する場合、チートするインセンティブははるかに少なくなります。オンラインゲームを検討してください。たぶん、ランキング、チャットルーム、またはサーバーから提供するその他のサービスなど、いくつかの「ソーシャル機能」を持つことができますか?
MicrosoftがAuthenticodeと.NETで採用したアプローチに興味があるかもしれません。