> For the complete documentation index, see [llms.txt](https://docs.payments.thalescloud.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.payments.thalescloud.io/nfc-wallet-sdk-ios/ja/security-and-privacy/security-guidance.md).

# セキュリティガイダンス

## 概要

iOS を構築およびリリースする際は、このセキュリティガイダンスを使用してください **デジタルウォレットアプリケーション** NFC Wallet SDK を統合する。

このガイダンスは、リリース前に適用する必要があるセキュリティガイドラインのセットです。

## 一般的なセキュリティガイドライン

### 最新の NFC Wallet SDK リリースを使用する

最新の NFC Wallet SDK リリースを使用してください。最新のセキュリティ更新と修正が含まれています。

### NFC Wallet SDK の Release ビルドを使用する

App Store に公開する前に、デジタルウォレットアプリケーションを次のように設定してください `リリース` ビルド。

{% hint style="warning" %}
この `デバッグ` SDK のバリアントは Production Environment では使用できません。
{% endhint %}

### デバッグシンボルを削除する

デバッグシンボルを付けたままリリースしないでください。この方法はリバースエンジニアリングの難度を高め、機密変数、構造、ロジックを容易に特定することを防ぎます。

### 機密データの漏えいを防止する

アプリケーションがバックグラウンドに入る前に、UI から機密データを消去します。

アプリケーションがフォアグラウンドに戻るまで、データを暗号化するか消去します。

機密情報のログ出力は避けてください。

### コードの難読化を使用する

難読化を使用して、リバースエンジニアリングのコストを高めます。

### 安全なネットワーク通信

デジタルウォレットのバックエンドへのすべてのネットワーク呼び出しに HTTPS を使用します。

自己署名証明書は避けてください。

証明書ピニングを実装する場合は、次のガイドラインに従ってください：

* ホスト名をリーフ証明書と照合します。
* システムの信頼ストアに対して証明書チェーン全体を検証します。
* 期限切れの証明書は拒否します。
* ルート CA またはリーフ証明書の SHA-256 ハッシュをピン留めします。

個人を特定できる情報（PII）を含む機密データを送信する場合は、必要に応じてアプリケーションレベルの暗号化と認証を追加します。

### RASP 保護を追加する

商用の Runtime Application Self Protection（[RASP](https://en.wikipedia.org/wiki/Runtime_application_self-protection)）ソリューションを使用します。

次の項目を検知し、対応します：

* ルート化または脱獄。
* デバッグ。
* フッキング。
* アプリの改ざん。
* エミュレータでの実行。

### ログ出力

機密データをデバイスログに書き込まないでください。

ビルドフラグを使用して、Production Environment ビルドからデバッグログを除外します。

### 安全なコーディング手法を採用する

開発全体を通してセキュアコーディングの実践を適用します。たとえば、次のようなことを行う必要があります：

* 入力を検証する。
* メモリを適切に管理する。
* 安全な C 関数を使用する。
* 機密データの保存に不変コンテナを使用しないでください。

ベースラインのチェックリストについては、OWASP [セキュアコーディングの実践](https://owasp.org/www-project-secure-coding-practices-quick-reference-guide).

これらの実践は、PMD や HP Fortify などの静的コード解析ツールを使用して強制できます。

### 監査とペネトレーションテストを実施する

脆弱性を特定し、アプリケーション全体のセキュリティ態勢を評価するために、アーキテクチャおよびコードの監査に加えて、ペネトレーションテストを実施します。

### アプリケーションセキュリティの堅牢性を評価する <a href="#evaluate-the-resilience-of-application-security" id="evaluate-the-resilience-of-application-security"></a>

OWASP MASVS（Mobile Application Security Verification Standard）の [OWASP MASVS](https://github.com/OWASP/owasp-masvs)。これはモバイルアプリケーションのセキュリティ要件のベースラインです。

OWASP MSTG [チェックリスト](https://github.com/OWASP/owasp-mastg/releases/latest) を使用して、アプリケーションのセキュリティ状況を評価することを強く推奨します。

## iOS 開発者向けセキュリティガイドライン

### アプリのライフサイクル中に機密データが露出するのを防ぐ

アプリがバックグラウンドに移行したら、機密 UI コンテンツを削除します。

アプリがフォアグラウンドに戻るまで、機密データを消去または暗号化します。

機密データのログ出力は避けてください。

次の iOS フックを使用します：

* `applicationWillResignActive`: 画面を消去します。機密データを暗号化します。
* `applicationDidBecomeActive`: UI を復元します。機密データを復号します。
* `UIScreenCapturedDidChangeNotification`: 画面キャプチャを検知します。機密 UI コンテンツを消去します。

例：アクティブでなくなるときにアプリコンテンツを非表示にします。

```swift
UIApplication.shared.keyWindow?.isHidden = true
```

### Xcode 出力からシンボルを削除する

Xcode では、リリースビルド設定に次の値を設定します：

```
DEPLOYMENT_POSTPROCESSING = YES
GCC_GENERATE_DEBUGGING_SYMBOLS = NO
STRIP_INSTALLED_PRODUCT = YES
STRIP_STYLE = all
COPY_PHASE_STRIP = YES
```

### Swift で機密データを管理する

機密バイト列のコピーを最小限に抑えます。

[Data](https://developer.apple.com/documentation/foundation/data) は Swift の値型です。代入したり渡したりすると、基になるバイト列のコピーが作成されることがあります。

確保したバイト列は参照渡しで渡します（ `inout` 引数）。

```swift
func helloWorld(_ data: inout Data) { 
    ... 
}

var data = Data()
helloWorld(&data)
```

消去 `Data` 使用後：

```swift
extension Data {
    internal mutating func wipe() {
        guard count > 0 else {
            return
        }
        let length = count
        withUnsafeMutableBytes { ptr in
            if let mutableRawPtr = ptr.baseAddress {
                memset_s(mutableRawPtr, length, 0, length)
            }
        }
    }
}
```

### 機密入力に対する自動修正キャッシュを無効にする

機密データを受け付けるフィールドでは自動修正を無効にします。

次のいずれかのオプションを使用します：

* 設定する `secureTextEntry = true`.
* 設定する `autoCorrectionType = UITextAutocorrectionType.no`.

### 機密入力に対するコピー＆ペーストを無効にする

機密フィールドのコピー／ペーストメニューを無効にします。これにより、デバイスにアクセスできる攻撃者がコピー済みデータを貼り付けて閲覧することを防げます。

```swift
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    let menuController = UIMenuController.shared
    menuController.isMenuVisible = false
    return false
}
```

### アプリの改ざんを防ぐ

機密操作については、実行時にアプリの整合性を検証します。

のチェックサムを計算できます `__text` セクションの `__TEXT` セグメント。

実装の詳細については、OWASP MSTG（Mobile Security Testing Guide）の次のガイダンスを参照してください： [iOS のリバースエンジニアリング対策](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06j-Testing-Resiliency-Against-Reverse-Engineering.md).

チェックサム実装を強力な難読化で保護します。

### Xcode のハードニングオプションを有効にする

悪用やリバースエンジニアリングを困難にする Xcode 設定を使用します。

<details>

<summary>推奨 Xcode 設定</summary>

```
GCC_UNROLL_LOOPS = YES
GCC_OPTIMIZATION_LEVEL = 3
OTHER_CFLAGS = -fstack-protector-all -finline-functions
CLANG_ENABLE_OBJC_ARC = YES
GCC_DYNAMIC_NO_PIC = NO
LD_NO_PIE = NO
RUN_CLANG_STATIC_ANALYZER = YES
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_GETPW_GETS = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_MKSTEMP = YES
CLANG_ANALYZER_SECURITY_INSECUREAPI_VFORK = YES
```

</details>

## App Store での配布を管理する

エンドユーザーは、あなたの古い「最後に互換性のある」バージョンをダウンロードできます **デジタルウォレットアプリケーション**.

公開する各バージョンによって攻撃対象領域が増えます。サポート対象バージョンのセットは小さく保ってください。

### 古いバージョンのダウンロードを制限する

可能であれば、App Store Connect で過去バージョンのダウンロードを無効にします。

現在の Apple の挙動と UI ラベルについては、次を参照してください： [App Store Connect](https://developer.apple.com/support/app-store-connect/).

{% hint style="info" %}
セキュリティ修正をリリースしたら、古いバージョンはすぐに削除します。
{% endhint %}

デジタルウォレットアプリケーションは、単一の最新バージョンを維持することを推奨します。ビルド設定を調整して、幅広い iOS バージョンをサポートしてください。

### 安全でない実行環境を減らす

シミュレータビルドを配布しないでください。

* **Simulator のデプロイ先を無効にする**: デプロイ先には iOS デバイスのみを含める必要があります。
* **App Store Connect で「Apple Silicon Mac の利用可否」を無効にする**: mac M1 上で iOS アプリケーションを実行すると、アプリケーションバイナリとサンドボックスの露出が増えます。

詳細は、Apple の次のガイダンスを参照してください： [macOS で iOS アプリを実行する](https://developer.apple.com/documentation/apple-silicon/running-your-ios-apps-on-macos).

## アプリケーション保護

ビルドおよび配布の段階でデジタルウォレットアプリケーションを強化します。サイドローディング、クローン、実行時の改ざんに重点を置きます。

### 実行環境を検証する

* アプリが、SDK がサポートする OS バージョン、ファームウェア バージョン、ハードウェア バージョンを備えた対象デバイス上で実行されていることを確認します。
* エミュレータや脱獄デバイスでの実行をブロックします。

  OWASP MSTG の次のガイダンスを参照してください： [iOS のリバースエンジニアリング対策](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06j-Testing-Resiliency-Against-Reverse-Engineering.md).

### 配布チャネルを管理する

デジタルウォレットアプリケーションは、公式ストアと検証済みチャネルのみで配布します。

* アプリケーションは、意図したストアからインストールされたことを検証する必要があります。
* サイドチャネル配布は許可しないでください。

### セキュリティ更新を強制する（アプリケーション更新の強制）

セキュリティ修正がある場合は、アプリケーションの強制更新を確実に行ってください。

* インストールされているバージョンが許容最小バージョンを下回る場合は、サービスへのアクセスをブロックします。

### 改ざん、再署名、クローンを検知する

* コード署名の変更（再署名）と再パッケージ化を検知します。
* アプリケーションバイナリとリソースの変更を検知します。
  * OWASP MSTG の次のガイダンスを参照してください： [iOS のリバースエンジニアリング対策](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06j-Testing-Resiliency-Against-Reverse-Engineering.md)
* 機密性の高いアプリケーションデータを特定のデバイスに紐づけます。

侵害を検知した場合は、関連アカウントをブラックリストに登録し、取引を拒否してください。

### 送信中のデータを保護する

* イシュアのバックエンドへのすべての接続に TLS 1.2 または TLS 1.3 を使用します。
* 証明書ピニングを実装する場合は、証明書のローテーションを計画してください。
* 強力な暗号スイートを使用し、弱いネゴシエーションは拒否します。
* 必要に応じてアプリケーションレベルの暗号化を追加します。

### 実行時保護（RASP）を追加する

Runtime Application Self Protection がデジタルウォレットアプリケーションで利用可能であることを確認します。機密操作中のデバッグとフッキングを検知します。

* OWASP MSTG の次のガイダンスを参照してください： [iOS のリバースエンジニアリング対策](https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06j-Testing-Resiliency-Against-Reverse-Engineering.md)

## 資産を保護する

このセクションでは、資産を保護するためのアプリ開発におけるベストプラクティスを概説します。

#### FCM 登録トークン

デジタルウォレットアプリケーションがアプリレベルで FCM を管理する場合：

* FCM 登録トークンを必要以上に長く保持しないでください。
* この資産の機密性と完全性を確保します。

#### 決済カード情報

デジタルウォレットアプリケーションが支払いカードデータを収集する場合：

* 危険な `UITextField` 機能、たとえば AutoFill やコピー／ペーストを無効にします。
* 安全なキーパッドを使用します。
* 使用前に入力を検証します。
* 支払いカードデータを永続的に保存しないでください。
* 入力画面を表示する前に、実行時チェック（脱獄、フッキング、デバッグ、改ざん検知）を適用します。
* この資産の機密性と完全性を確保します。

アプリ外から取得した他の機密入力にも同じ制御を適用します。

#### アプリ署名証明書と TLS 証明書

* アプリ署名証明書へのアクセスを制御します。
* 信頼されていない相手に開示しないでください。
* この資産の機密性と完全性を確保します。

#### その他の機密資産

* コードを難読化し、バイナリに含まれる機密文字列を保護します。
* 各リリースごとに資産を再評価します（新機能によって新たな機密データが追加される可能性があります）。
  * 各資産の価値と重要度を評価し、必要な保護を適用します。
* 一時データは永続化しないでください。不要になった機密データはメモリから消去します。
* デバイスは常に信頼できないものと考えてください。RASP を使用して、実行時にアプリケーションバイナリとサードパーティライブラリを保護します。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.payments.thalescloud.io/nfc-wallet-sdk-ios/ja/security-and-privacy/security-guidance.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
