PreEmptive Protection - DashO v8.1 User Guide

改ざんチェックとレスポンス

PreEmptive Protection - DashO は、アプリケーションが改ざんされているかどうかを検出し、改ざんされている場合には PreEmptive Analytics サーバーへメッセージを送信するようにアプリケーションをインストルメントすることができます。改ざんチェックでは、アプリケーションが DashO によって、あるいは DashO によるインストルメンテーションに続く別のプロセスによって署名されている必要があります。改ざんチェックとレスポンスは、コード アノテーションを使用して実装されるか、または改ざんチェック UI によって構成されます。

改ざんチェック

改ざんを検出するには、アプリケーション内の 1 つ以上のメソッドに TamperCheck を設定します。DashO は、コードが特定の証明書によって著名されていることを検証する、ランタイム チェックを実行するコードを追加します。チェックに失敗したら、1 つ以上の方法でそれに対応することができます。チェックが実行される時点で、次のうちの 1 つまたはすべてを選択できます。

  • 改ざんメッセージを送信する。改ざんメッセージが PreEmptive Analytics サーバーへ送信されます。メッセージには任意でカスタム データを含めることができます。既定では、メッセージは送信されません。アプリケーションが分析を使用しており、アプリケーションに ApplicationStart が含まれている場合は、これ以上の構成は必要ありません。TamperCheck のみを使用している場合は、他のアノテーションを用いて会社とアプリケーションの ID を供給するか、または Injection Options パネルでそれらを提供する必要があります。メッセージは、オプトインの設定と関係なく送信されます。Android アプリケーションにインストルメンテーションを差し込む場合の追加情報については、PreEmptive Analytics の概要を参照してください。

  • メソッドを呼び出すか、またはフィールドを設定する。単一の boolean を取るメソッドを呼び出すか、または boolean 型のフィールドを設定することによって、改ざんの状態をアプリケーションに渡し返すことができます。改ざんチェックが失敗した場合の boolean 値は true です。改ざんチェックが成功した場合は、false が使用されます。アプリケーションは、この情報に基づいて直ちに行動するか、あるいは後で TamperResponse とやり取りするために格納しておくことができます。詳細については、ソースおよび操作の指定を参照してください。

  • レスポンスを実行する。即時に実行できるレスポンスがいくつかあります。

    • exit – ランダムにゼロ以外のリターン コードを生成してアプリケーションを終了する
    • hang – 現在のスレッドをハングさせる
    • error – ランダムに選択されたエラーをスローする
    • exception – ランダムに選択された、チェックされていない例外をスローする
    • none – 操作を実行しない(既定)

メモ:リターン コードおよび Throwable の選択のランダム化は、実行時ではなく、チェックが差し込まれた時点で実行されます。エラーと例外は、その出所を隠すために、空のスタック トレースを伴ってスローされます。

これらの動作を複数選択した場合は、上記の順序で実行されます。これらのうちのどれも要求しない場合は、改ざんチェックは省かれ、DashO が警告メッセージを生成します。

アプリケーションには、さまざまな用途の TamperCheck をさまざまな構成で含めることができます。複数のチェックを使用したり、レスポンスを混合したりすることにより、アタッカーの侵入を妨げられるでしょう。

private static boolean tamperFlag;

@TamperCheck(sendMessage=true, customDataSource="@myProps", action="@tamperFlag")
public static void main(final String[] args){

}

@TamperCheck(response=ResponseType.Hang)
private int computeResult(){

}

署名との相互作用

改ざんチェックは、実行時に、コードが特定の証明書によって署名されているかどうかを検証することにより実行されます。結果として生じる jar ファイルへの署名に DashO が使われる場合は、これ以上の構成は必要ありません。DashO を使って難読化した後、別のプロセスによって jar ファイルが署名される場合は、TamperCheck の追加属性を使用して、署名情報について DashO へ伝える必要があります。これにより、DashO はランタイム改ざんチェックを行うために必要なキー情報を取得することができます。指定された情報は、Output Signing パネルで見られる内容と同様です。

@TamperCheck(sendMessage=true, action="@tamperFlag", storepass="${master.psw}", storetype="JKS", alias="ProdKey")
public static void main(final String[] args){

}

ユーザー インターフェイスを使用して storepass 値のパスワードを入力したとき、パスワードにプロパティ参照が含まれていない場合は、DashO は暗号化された形式でパスワードを格納します。

メモ:

アプリケーションがカスタムのクラス ローダーを使用している場合は、署名証明書を読み込んでいるかどうかを確認してください。

たとえば、OSGI(Eclipse Equinox)ベースのアプリケーションでは、osgi.signedcontent.support を構成する必要があります。少なくとも certificate を許可する必要があり、osgi.support.class.certificatefalse に設定することはできません。

アプリケーションがコード生成を利用している場合は、改ざん検出を追加する前に、署名済みの jar ファイルで正しく動作しているかどうかを確認してください。同じ証明書を使用してコードを生成する jar ファイルに署名する必要があるかもしれません。
たとえば、Spring ベースのアプリケーションでは、spring-core-4.0.1.RELEASE.jar(または類似する jar ファイル)に署名する必要があります。

Android の改ざんチェックは、アプリケーションのコンテキストへのアクセスを必要とし、チェックが差し込まれるクラスに getApplicationContext() メソッドの存在が必要です。android.app.Activityandroid.app.Application、あるいは android.app.Service のような、android.context.Context を拡張するクラスに改ざんチェックを差し込むのであれば、問題ありません。そうでない場合は、getApplicationContext() メソッドを追加して、適切な Context が返されることを確認してください。また、メッセージを送信する予定で、オフライン メッセージのサポートが必要な場合には、追加した getApplicationContext() メソッドを名前の変更対象から除外する必要が生じます。

改ざんのレスポンス

検出とレスポンスを分離すると、アタッカーにとってより困難になります。複数の異なるレスポンスをアプリケーション中に散在させることで、アプリケーションの困難さが増します。それらのレスポンスを非決定的なものにすると、プロセスをイライラさせるものにすることができます。DashO では、改ざんされたアプリケーションへのレスポンスを、単純にでも複雑にでも望みどおりに構成することができます。

TamperResponse アノテーションは、検出とレスポンスのコードを分離するために TamperCheck と対話するコードを追加します。1 つ以上の TamperResponse をアプリケーションに追加することができます。

  • TamperResponse は、boolean 値を介して TamperCheck に合わせられます。TamperCheck動作を使用する値セットは、TamperResponseソースを使って取得されます。取得された値が true であれば、レスポンスが実行されます。詳細については、ソースおよび操作の指定を参照してください。

TamperCheck と同様に、TamperResponse はメッセージを送信し、かつレスポンスを実行することができます。さらに、レスポンスの動作には、0.0(なし)から 1.0(常時)までの確率係数に基づいて条件を付けることができます。既定値は 1.0 です。

private static boolean tamperFlag;

@TamperCheck(action="@tamperFlag")
public static void main(final String[] args){

}

@TamperResponse(source="@tamperFlag", sendMessage=true, customDataSource="customData()")
private void init() {

}

@TamperResponse(source="@tamperFlag", response=ResponseType.Exit, probability=0.05f)
private int computeResult(){

}

@TamperResponse(source="@tamperFlag", response=ResponseType.Error, probability=0.1f)
private FileInputStream readInput(){

}

TamperResponse によって分析メッセージを送信することを要求している場合は、いくつか追加の構成情報を提供する必要があるかもしれません。アプリケーションが分析を使用しており、アプリケーションに ApplicationStart が含まれている場合は、これ以上の構成は必要ありません。メッセージを送信する TamperResponses を使用している場合は、他のアノテーションを用いて会社とアプリケーションの ID を供給するか、または Injection Options パネルでそれらを提供する必要があります。

PreEmptive Protection - DashO Version v8.1.0. Copyright © 2017 PreEmptive Solutions, LLC