セキュリティガイダンス
概要
Androidを構築およびリリースする際に、このセキュリティガイダンスを使用してください。 デジタルウォレットアプリケーション NFC Wallet SDKを統合するアプリケーションです。
このガイダンスは、リリース前に適用すべき一連のセキュリティガイドラインです。
一般的なセキュリティガイドライン
最新のNFC Wallet SDKリリースを使用する
最新のNFC Wallet SDKリリースを使用してください。これには最新のセキュリティ更新と修正が含まれます。
NFC Wallet SDKのReleaseビルドを使用する
Google Playストアに公開する前に、デジタルウォレットアプリケーションを構成して Release ビルド。
The Dev SDKのバリアントは本番環境では許可されていません。
デバッグシンボルを削除する
デバッグシンボルを含めてリリースしないでください。これは逆コンパイルの難易度を下げ、機密変数、構造、ロジックの特定を容易にしてしまいます。
機密データの漏えいを防ぐ
アプリケーションがバックグラウンドに入る前にUIから機密データをクリアしてください。
アプリケーションがフォアグラウンドに戻るまでデータを暗号化するか抹消してください。
機密情報のログ出力は避けてください。
コード難読化を使用する
逆コンパイルのコストを高めるために難読化を使用してください。
ネットワーク通信を保護する
デジタルウォレットのバックエンドへのすべてのネットワーク呼び出しにHTTPSを使用してください。
自己署名証明書は避けてください。
証明書ピンニングを実装する場合は、次のガイドラインに従ってください:
ホスト名をリーフ証明書と照合してください。
システムの信頼ストアに対して完全な証明書チェーンを検証してください。
有効期限切れの証明書は拒否してください。
ルートCAまたはリーフ証明書のSHA-256ハッシュをピンしてください。
個人を識別できる情報(PII)を含む機密データを送信する場合、必要に応じてアプリケーションレベルの暗号化と認証を追加してください。
RASP保護を追加する
商用のRuntime Application Self Protection(RASP)ソリューションを使用してください。
検出および対応すべきもの:
Root化または脱獄。
デバッグ。
フッキング。
アプリの改ざん。
エミュレータ実行。
ログ記録
機密データをデバイスログに書き込むことを避けてください。
ビルドフラグを使用して、本番環境ビルドからデバッグログを除外してください。
Androidではログは共有リソースであり、 READ_LOGS 権限でアクセス可能です。不適切なユーザー機密情報のログ記録は、他のアプリケーションへの意図しないデータ漏えいにつながる可能性があります。
安全なコーディング慣行を採用する
開発全体で安全なコーディング慣行を適用してください。例えば次のことを行うべきです:
入力検証を実行する。
メモリの適切な管理。
安全なC関数を使用する。
機密データを格納するために不変コンテナを使用することを避ける。
基本チェックリストについては、OWASPを参照してください Secure Coding Practices.
これらの慣行はPMDやHP Fortifyなどの静的コード解析ツールを使用して強制できます。
監査および侵入テストを実施する
アーキテクチャおよびコード監査、さらに侵入テストを実施して脆弱性を特定し、アプリケーションの全体的なセキュリティ姿勢を評価してください。
アプリケーションセキュリティの耐性を評価する
OWASP MASVS(Mobile Application Security Verification Standard)を確認してください: OWASP MASVS。これはモバイルアプリケーションのセキュリティ要件の基準です。
OWASP MSTGを使用することを強く推奨します チェックリスト を使用してアプリケーションのセキュリティ状況を評価してください。
Android開発者向けセキュリティガイドライン
リリース前に詳細な防御層別の推奨事項については、Androidのセキュリティガイダンスを使用してください。
次のトピックを確認してください:
このガイダンスの補足参照として、Androidの基本セキュリティチェックリストを使用してください: Androidセキュリティチェックリスト.
アプリケーションレベルの保護
アプリのインストーラを検証する
実行時にデジタルウォレットアプリケーションのインストーラパッケージ名を検証してください。
サイドチャネル配布や第三者ソースからの不正インストールを防ぐため、Google Playからのインストールのみを信頼してください。Google Playは com.android.vending.
を使用します。
セキュリティ更新を強制する(アプリの強制更新)
セキュリティ修正がある場合は、強制的なアプリケーションの更新を確実に行ってください。
インストールされているバージョンが許可されている最小バージョンより低い場合、サービスへのアクセスをブロックしてください。
リソースを内部ストレージに格納する
あなたの デジタルウォレットアプリケーション とそのリソースを内部ストレージに保持してください。これにより、man-in-the-disk(MITD)攻撃のリスクが低減します。MITD攻撃では攻撃者が外部ストレージに保存されたファイルを変更または操作する可能性があります。
アプリケーションは android:installLocation マニフェスト属性を使用して外部ストレージに移動できないようにすべきです。
SDKがサポートするOSバージョンをサポートする
あなたの デジタルウォレットアプリケーション をNFC Wallet SDKがサポートするOSバージョンでのみ実行してください。これにより、古いデバイスでの機能的な問題やセキュリティギャップが減少します。また エンドユーザー エクスペリエンスを向上させます。
デバイスの画面ロックを要求する
デバイスに画面ロックを設定することを要求してください。PIN、パターン、またはパスワードを使用してください。画面ロックが設定されていない場合は機密のフローをブロックしてください。
過剰な権限を防ぐ
あなたのアプリに必要なAndroid権限のみを宣言してください。 デジタルウォレットアプリケーション.
不要な権限は攻撃対象範囲を拡大し、特権データを露出させる可能性があります。
エクスポートされたコンポーネントを制限する
Androidアプリケーションはコンポーネントで構成されています:
アクティビティ
サービス
ブロードキャストレシーバー
コンテントプロバイダ
考慮すべき点:
アプリ間通信はリスクがあると見なす。
エクスポートされたすべてのコンポーネントはあなたの デジタルウォレットアプリケーションへの公開エントリポイントであり、 それによりリスクや攻撃への露出が増加します。
アプリケーションを設計する際には、
公開可能なのはメインアクティビティのみとすることを推奨します。
他のすべてのコンポーネントは明示的に属性を持つべきです
export=false.
公開コンポーネントについては、カスタム権限で保護することを検討してください。
リリースビルドでデバッグを無効にする
あなたの リリース のビルドがデバッグ可能でないことを確認してください。 デジタルウォレットアプリケーション あなたは次のことを行う必要があります:
において
を設定します
android:debuggable="false"<application>要素内でそして最終APKがデバッグ可能でないことを確認してください。AndroidManifest.xml.最終APKを検証するには:
次を実行してください:
aapt dump xmltree <myApplication.apk> AndroidManifest.xml
要素を探します。確認してください
要素内でandroid:debuggableが設定されていることを0x0CIパイプラインの一部としてこの検証を自動化してください。.
アプリリンクとディープリンクを評価する
ディープリンクとアプリリンクはアプリケーションの攻撃対象範囲を増やす可能性があります。リンクの乗っ取りや機密機能の意図しない露出などのリスクを招く可能性があります。挙動はAndroidバージョンによって異なります:
Android 12(APIレベル31)より前では、アプリケーションに検証不可のリンクが含まれる場合、システムはそのアプリケーションのすべてのAndroid App Linksを検証しないことがあります。
Android 12(APIレベル31)以降では、アプリケーションは攻撃対象範囲が縮小されます。ターゲットアプリケーションがウェブインテントに対して特定ドメインで承認されていない限り、ウェブインテントはエンドユーザーのデフォルトブラウザに解決されます。
すべてのディープリンクを列挙してください。正しいウェブサイトの関連付けを検証してください。
ディープリンクとアプリリンクで公開されるすべての操作をテストしてください。
常にすべての入力データを検証してください。すべての入力を信頼できないものとして扱ってください。検証によりアプリケーションが想定したデータのみを処理することを保証します。
スクリーンショットとアプリプレビューを防ぐ
FLAG_SECURE
を設定します 機密データを表示するすべてのアクティビティで使用してください。これによりフォアグラウンドでのスクリーンショットによる機密データの漏えいを防ぎます。 フラグを次の場所に追加してください
Activity.onCreate() UIをレンダリングする前に: protected void onCreate(Bundle savedInstanceState) {
onPause() メソッドでクリアしてください。 適切なアプリ署名
リリースAPKに署名してください:
幅広いAndroid互換性のためにAPK Signature Scheme v1およびv2を使用してください。
Android 9(APIレベル28)以降をターゲットとする場合はAPK Signature Scheme v3を使用してください。
APK署名鍵はあなたの管理下に保持してください。共有しないでください。
サインをAndroid SDK Build Toolsの
で検証してください: apksigner $ apksigner verify --verbose Desktop/example.apk
アプリのAndroidバックアップと復元を無効にしてください。
android:allowBackup="false" デジタルウォレットアプリケーション.
を設定します <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application> 要素内で そして最終APKがデバッグ可能でないことを確認してください。 AndroidManifest.xml.
android:allowBackup は有効です。これによりOSがアプリケーションデータをバックアップおよび復元することが可能になります。これはセキュリティ上の影響を持ち得ます。 が trueバックアップ機能はUSBデバッグが有効なときにエンドユーザーがアプリケーションデータをコピーすることも可能にします。
一度エクスポートされると、データはアプリサンドボックス外で検査される可能性があります。
機密画面でのアクセシビリティを制限する
AndroidのアクセシビリティサービスはUIコンテンツを読み取り、アクションをトリガーできます。これは障害を持つユーザーにとって重要ですが、マルウェアによって濫用され機密データを取得される可能性もあります。
画面ごとにアクセシビリティサービスが機密コンテンツにアクセスすべきかを決定してください。アクセシビリティイベントを通じたデータ漏えいを減らすために以下の手法を使用してください。
アクセシビリティのブロックは一部の
エンドユーザー にあなたの の使用を妨げる可能性があります。これらのコントロールは本当に機密性の高い画面にのみ適用してください。 デジタルウォレットアプリケーション有効なアクセシビリティサービスを検出する
アクセシビリティサービスが有効かどうかを確認してください。必要に応じて、サービスが有効な場合に特定のフローを制限してください。
アクセシビリティサービスを許可リスト化する
有効なサービスを列挙するためにAndroid APIを使用してください。リスクポリシーに基づいて許可リストまたはブロックリストを維持してください。許可されていないサービスが有効な場合は、
に警告するか操作をブロックしてください。 エンドユーザー ビューのアクセシビリティをブロックする
ビューのサブツリーに対してアクセシビリティを無効にできます。これによりそのビューと子要素からのアクセシビリティイベントが防止されます。
private void disableAccessibilityEvents(View view) {
デフォルトでは、Androidはマスキングされる前に最後に入力された文字を短時間表示することがあります。これにより部分的な入力(例えば
)がアクセシビリティサービスに露出する可能性があります。これは脅威モデルで許容できない場合、文字を直ちにマスクしてください。 ***1private fun hideLastDigit() {
Androidのオーバーレイはあるアプリが他のアプリの上にUIをレンダリングすることを可能にします。これによりフィッシングやデータ窃盗が発生する可能性があります。これはオーバーレイ攻撃で一般的な手法です。
フィッシングの例:攻撃者があなたの
の上に全画面オーバーレイを描画します。オーバーレイはログインやPIN画面を偽装します。これによりエンドユーザーの資格情報が盗まれる可能性が高まります。 デジタルウォレットアプリケーション機密画面と入力を保護してください。例としてログイン、PIN入力、プロビジョニングがあります。
Android 12(APIレベル31)以降
敏感なビューでsetHideOverlayWindows(true)
呼び出す を設定します。これによりそれらのビューに対して非システムオーバーレイがブロックされます。 Android 2.3(APIレベル9)からAndroid 11(APIレベル30)までは
敏感なビューでタッチフィルタリングを使用してください。これによりオーバーレイによって隠されたタッチを検出するのに役立ちます。
次のオプションのいずれかまたは複数を使用してください:
有効にする
敏感なビューでsetFilterTouchesWhenObscured(true)
を設定します。onFilterTouchEventForSecurity()オーバーライドします
を使用して隠されたタッチイベントを拒否します。onTouch()でタッチイベントをチェックし、隠されたイベントを拒否します。
タッチフィルタリングはすべてのオーバーレイ技術をカバーするわけではありません。一部のオーバーレイはタッチイベントの転送を回避できます。これは完全な解決策ではなく防御の層の一つとして扱ってください。詳細については、次を参照してください:
Protecting against Android Overlay Attacks
専用キーボードを使用する 機密入力にはサードパーティのキーボードを避けてください。サードパーティキーボードはユーザーが入力する内容を取得する可能性があります。.
あなたのアプリでのみ利用可能な専用キーボードを使用してください。PIN、パスコード、パスワード、個人を識別できる情報(PII)に使用してください。
専用キーボードを実装できない場合は、パスコード入力用に専用のPINパッドを使用してください。セッションごとにキー配置をランダム化してください。これにより肩越し覗きのリスクが低減されます。また一部のアクセシビリティマルウェアの影響も軽減されます。 エンドユーザー 通信中のデータを保護する
あなたの デジタルウォレットアプリケーションとあなたの
間のすべてのネットワークトラフィックにTLS 1.2またはTLS 1.3を使用してください。
データ保護
あなたの
を強力な暗号スイートを使用するように構成してください。 デジタルウォレットアプリケーション さらに: イシュアのバックエンドが.
証明書ピンニング イシュアのバックエンドが をあなたの
に追加してください。
実装する Android 7.0(APIレベル24)以降では、ネットワークセキュリティ構成を使用して、アプリケーションが呼び出すドメインをピンできます。 アプリケーション層の暗号化と認証をTLSの上に追加して、機密なペイロード(例:個人を特定できる情報(PII))を保護してください。 デジタルウォレットアプリケーション.
保存データを保護する アプリケーションサンドボックス内であっても、デバイスに保存された機密データを保護してください。 侵害されたデバイスはローカルストレージをマルウェアにさらす可能性があると仮定してください。
機密データを保存時に暗号化および整合性保護することを推奨します。デバイスに紐づく鍵を使用し、アクセス前にエンドユーザー認証を必須としてください。 保存時のすべての機密データを暗号化するために、アプリケーションは次を使用できます: AndroidX Security Crypto デジタルウォレットアプリケーション さらに: イシュアのバックエンドが.
EncryptedSharedPreferences
をキーと値のデータに対して使用してください。
EncryptedFile
をファイルに対して使用してください。
詳細については、データストレージに関するAndroidのガイダンスを参照してください:
データストレージ
生体認証をサポートするエンドユーザー認証のために生体認証をサポートする必要があります。データストレージ
生体認証が利用できない場合に備えてデバイス認証(キーボード)によるフォールバックを提供してください。可能な場合はBiometricPromptの暗号オブジェクトとともにAndroid Keystoreを使用してください。
これにより鍵がデバイスに結び付けられ、生体認証の登録変更を検出できます。 多要素認証を強制する.
認証
機密操作に対して多要素認証(MFA)を強制してください。
The デジタルウォレットアプリケーション MFAはアクセス前に複数の認証要素を要求することで保護を追加します。
これにより1つの要素が侵害された場合の不正アクセスのリスクを減らします。
Google Playのセキュリティプロバイダを最新に保つ Google Play services security provider を使用して、OSの更新が遅れているデバイスでも暗号化およびTLSの修正を受け取るようにしてください。
NFC Wallet SDKはこのプロバイダをインストール、更新、またはプロンプトしません。あなたの
はGoogle Play servicesのセキュリティプロバイダがエンドユーザーの
デバイスにインストールされ最新であることを確認する責任があります。 デジタルウォレットアプリケーション.
セキュアな乱数を使用する
すべてのセキュリティに敏感な乱数についてはjava.security.SecureRandomを使用してください(機密暗号鍵の生成や任意の乱数生成など)。
暗号化ガイドライン
Android 10(APIレベル29)以降では、可能な場合は最も強力な乱数源が必要なときにSecureRandom.getInstanceStrong()を優先してください。
使用する ルート化デバイスを検出する NFC Wallet SDKを初期化する前および機密操作を実行する前に、ルート化フレームワークやsuバイナリなど、侵害されたデバイス環境を検出してください。
OWASP MSTGのガイダンスを参照してください: デジタルウォレットアプリケーション Android Anti-Reversing Defenses フッキング試行を検出する フッキングはあなたのアプリにランタイムでコードを注入します。攻撃者はこれを使用して機密データ(例:暗号鍵やPII)を傍受したり、セキュリティ制御をバイパスしたり、アプリのロジックを変更したりします。
詳細はOWASP MASVSの次を参照してください:
使用する Runtime Integrity Verification デバッガーのアタッチを検出する
侵害されたデバイスでは、攻撃者がアプリにデバッガをアタッチすることができます。これによりJava/Kotlinコードやネイティブライブラリのステップごとの検査が可能になり、機密ロジックやデータが露出する可能性があります。 機密フローを実行する前に、Java/Kotlinおよびネイティブコードの両方でデバッガーのアタッチを検出してください。詳細については、 Anti-Debugging
アプリケーションハードニング
を参照してください。
エミュレータを検出する エミュレータは信頼できない実行環境です。攻撃者にとって動的解析や計測が容易になります。 可能な限り早い段階でエミュレータ実行を検出してください。アプリ起動時およびNFC Wallet SDKを初期化する前に行ってください。
Emulator Detection. アプリの改ざんを検出する.
実行時に署名証明書ハッシュを検証して改ざんを検出してください。
このチェックは、攻撃者がバイナリやリソースを変更してAPKを再署名するようなリパッケージ攻撃の検出に役立ちます。攻撃者はあなたの署名証明書を再現できません。 デジタルウォレットアプリケーション 期待される証明書ハッシュを難読化して、位置特定やパッチを困難にしてください。
アンチタンパー技術を実装する アプリの改ざんを検出する / オプションとして、署名証明書ハッシュをあなたの.
バックエンド
に送信してください。サーバー側で検証し、アプリからのリクエストを受け入れる前に確認してください。 Release のビルドがデバッグ可能でないことを確認してください。 デジタルウォレットアプリケーションアプリケーションを難読化する
あなたの
アンチタンパー技術を実装する アプリの改ざんを検出する / とそのコンポーネントを難読化してください。これにより逆コンパイルのコストが上がり、機密ロジックやデータの位置特定が困難になります。.
NFC Wallet SDKがすでにDexGuardで難読化されている場合でも、Thales NFC Wallet SDKの公開APIを難読化する必要があります:
SDKパッケージに付属するProGuard/R8ルールが適用されていることを確認してください。
NFC Wallet SDKの難読化
アンチタンパー技術を実装する アプリの改ざんを検出する / パッケージフラッテンルールに特に注意してください:
-flattenpackagehierarchy util
難読化出力をSDKルールと一貫させるためにパッケージ名 デジタルウォレットアプリケーション util
を使用してください。
商用の難読化ツールが利用可能です。Androidでは我々はDexGuardを推奨します。
背景については、次を参照してください 難読化.
メモリから機密データを消去する 機密データ(例:暗号鍵や個人を識別できる情報(PII))はバイト配列に格納してください。JavaではStringBuilderなどの不変オブジェクトを確実に抹消することはできません。メモリ内で何回コピーが作成されるかやどれだけ長く到達可能であるかを制御できないためです。 デジタルウォレットアプリケーション.
機密データは明示的に抹消してください。ガベージコレクタに頼らないでください。
例外が発生した場合でも機密バッファを抹消するために、catchブロックがない場合でもfinallyブロックを使用してください。これにより例外が発生した場合の漏えいリスクが減少します。 デジタルウォレットアプリケーション byte[] password = this.getUserPassword();
// パスワードを使用してログインする
this.logUserIn(password);
参照してください } finally {
// ここで例外キャッチがなくてもRuntimeExceptionが発生する可能性があり、それでもfinallyブロックを実行する必要があります
// バイト配列を抹消する方法の一例は、MemoryHelper内で配列のすべての要素を書き換えることです class public static void clearData(byte[] baBuffer) { if (baBuffer == null)
for(i = 0; i < baBuffer.length; i++) { baBuffer[i] = (byte)0;.
アンチタンパー技術を実装する アプリの改ざんを検出する / 安全なコーディング標準に従う.
安全なコーディング
Apple、Google、OWASP(Open Web Application Security Project)などの信頼できるソースの安全なコーディング標準に従ってください。
Thalesの内部ガイダンスが必要な場合は、Thales Handset Security Communityに連絡してアクセスをリクエストしてください。
これらの標準をPMDやFortifyなどの静的コード解析ツールで強制してください。CIパイプラインに追加して回帰を防止してください。 String と Android lintチェックを実行する開発中および各リリース前にAndroid Lintを実行してください。早期に問題を修正してセキュリティおよび品質リスクを低減してください。
Android Lintは静的解析ツールです。プロジェクトの正確性、セキュリティ、パフォーマンス、ユーザビリティ、アクセシビリティ、国際化の問題をチェックします。
ローカルおよびCIパイプラインでlintを実行してください: ./gradlew lint 詳細についてはAndroid開発者向けサイトを参照してください: lintチェックでコードを改善する 資産を保護する
入力を使用する前に検証してください。
支払いカードデータを永続的に保存しないでください。
入力画面を表示する前に、ランタイムチェック(ルート化、フッキング、デバッグ、および改ざん検出)を強制してください。
この資産の機密性と整合性を確保してください。
アプリ外から取得される他の機密入力にも同じコントロールを適用してください。
アプリ署名証明書およびTLS証明書
アプリ署名証明書へのアクセスを管理してください。
信頼できない第三者に開示しないでください。
デジタルウォレットアプリケーションが金額を収集する場合: QRコード(2Dバーコード).
アプリはスクリーンショットでQRコードがキャプチャされるのを検出および防止し、また安全でないディスプレイ上で表示されるのを防ぐよう実装される必要があります。
その他の機密資産
バイナリに含まれる機密文字列を難読化し保護してください。
各リリースで資産を再評価してください(新機能により新たな機密データが追加される可能性があります)。
各資産の価値と重要度を評価し、必要な保護を適用してください。
一時データを永続化しないでください。不要になったらメモリから機密データを必ずクリアしてください。
常にデバイスを信頼できないものとして扱ってください。RASPを使用して実行時にアプリバイナリとサードパーティライブラリを保護するのに役立ててください。
最終更新
役に立ちましたか?