界: Encapsulation
カプセル化とは、強い境界線を引くことです。Web ブラウザの場合は、自分のモバイル コードが他のモバイル コードに悪用されないようにすることを意味します。サーバー上では、検証されたデータと検証されていないデータ、あるユーザーのデータと別のユーザーのデータ、またはユーザーが見ることを許可されたデータと許可されていないデータの区別などを意味する場合があります。
Insecure Storage: Unspecified Keychain Access Policy
Abstract
この特定のメソッドは、アクセシビリティ レベルを指定せずにキーチェーンにデータを格納します。
Explanation
データをキーチェーンに格納する際、アイテムにアクセスできる時期を指定するアクセシビリティ レベルを設定する必要があります。設定できるアクセシビリティ レベルは次のとおりです。
-
ユーザーによってデバイスがロック解除されるまで、再起動後はキーチェーン アイテムのデータにアクセスできません。
最初のロック解除後、次回の再起動までデータはアクセス可能なままです。これは、バックグラウンド アプリケーションでアクセスする必要のあるアイテムに推奨されます。この属性を持つアイテムは新しいデバイスに移行されません。このため、別のデバイスのバックアップからリストアした後、これらのアイテムは表示されません。
iOS 4.0 以降で使用できます。
-
デバイスがロックされているかどうかに関係なく、常にキーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションでの使用には推奨されません。暗号化されたバックアップを使用する場合、この属性を持つアイテムは新しいデバイスに移行されます。
iOS 4.0 以降で使用できます。
-
デバイスがロック解除されている場合のみ、キーチェーンのデータにアクセスできます。デバイスにパスコードが設定されている場合にのみ使用できます。
これは、アプリケーションがフォアグラウンドにある間にのみアクセスできる必要のあるアイテムに推奨されます。この属性を持つアイテムが新しいデバイスに移行されることはありません。バックアップを新しいデバイスにリストアすると、これらのアイテムは失われます。パスコードなしに、デバイス上でこのクラスにアイテムを格納することはできません。デバイスのパスコードを無効にすると、このクラスのすべてのアイテムが削除されます。
iOS 8.0 以降で使用できます。
-
デバイスがロックされているかどうかに関係なく、常にキーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションでの使用には推奨されません。この属性を持つアイテムは新しいデバイスに移行されません。このため、別のデバイスのバックアップからリストアした後、これらのアイテムは表示されません。
iOS 4.0 以降で使用できます。
-
デバイスがユーザーによってロック解除されている間のみ、キーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションがフォアグラウンドにある間にのみアクセスできる必要のあるアイテムに推奨されます。暗号化されたバックアップを使用する場合、この属性を持つアイテムは新しいデバイスに移行されます。
これは、アクセシビリティ定数を明示的に設定せずに追加されたキーチェーン アイテムのデフォルト値です。
iOS 4.0 以降で使用できます。
-
デバイスがユーザーによってロック解除されている間のみ、キーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションがフォアグラウンドにある間にのみアクセスできる必要のあるアイテムに推奨されます。この属性を持つアイテムは新しいデバイスに移行されません。このため、別のデバイスのバックアップからリストアした後、これらのアイテムは表示されません。
iOS 4.0 以降で使用できます。
キーチェーン保護が最初に導入された際、デフォルト値は
例 1: 次の例では、アクセシビリティ レベルを明確に指定せずにキーチェーンのアイテムが格納されており、iOS バージョンによって動作が異なる可能性があります。
-
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:ユーザーによってデバイスがロック解除されるまで、再起動後はキーチェーン アイテムのデータにアクセスできません。
最初のロック解除後、次回の再起動までデータはアクセス可能なままです。これは、バックグラウンド アプリケーションでアクセスする必要のあるアイテムに推奨されます。この属性を持つアイテムは新しいデバイスに移行されません。このため、別のデバイスのバックアップからリストアした後、これらのアイテムは表示されません。
iOS 4.0 以降で使用できます。
-
kSecAttrAccessibleAlways
:デバイスがロックされているかどうかに関係なく、常にキーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションでの使用には推奨されません。暗号化されたバックアップを使用する場合、この属性を持つアイテムは新しいデバイスに移行されます。
iOS 4.0 以降で使用できます。
-
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:デバイスがロック解除されている場合のみ、キーチェーンのデータにアクセスできます。デバイスにパスコードが設定されている場合にのみ使用できます。
これは、アプリケーションがフォアグラウンドにある間にのみアクセスできる必要のあるアイテムに推奨されます。この属性を持つアイテムが新しいデバイスに移行されることはありません。バックアップを新しいデバイスにリストアすると、これらのアイテムは失われます。パスコードなしに、デバイス上でこのクラスにアイテムを格納することはできません。デバイスのパスコードを無効にすると、このクラスのすべてのアイテムが削除されます。
iOS 8.0 以降で使用できます。
-
kSecAttrAccessibleAlwaysThisDeviceOnly
:デバイスがロックされているかどうかに関係なく、常にキーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションでの使用には推奨されません。この属性を持つアイテムは新しいデバイスに移行されません。このため、別のデバイスのバックアップからリストアした後、これらのアイテムは表示されません。
iOS 4.0 以降で使用できます。
-
kSecAttrAccessibleWhenUnlocked
:デバイスがユーザーによってロック解除されている間のみ、キーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションがフォアグラウンドにある間にのみアクセスできる必要のあるアイテムに推奨されます。暗号化されたバックアップを使用する場合、この属性を持つアイテムは新しいデバイスに移行されます。
これは、アクセシビリティ定数を明示的に設定せずに追加されたキーチェーン アイテムのデフォルト値です。
iOS 4.0 以降で使用できます。
-
kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:デバイスがユーザーによってロック解除されている間のみ、キーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションがフォアグラウンドにある間にのみアクセスできる必要のあるアイテムに推奨されます。この属性を持つアイテムは新しいデバイスに移行されません。このため、別のデバイスのバックアップからリストアした後、これらのアイテムは表示されません。
iOS 4.0 以降で使用できます。
キーチェーン保護が最初に導入された際、デフォルト値は
kSecAttrAccessibleAlways
で、デバイスにアクセスできるユーザーまたはデバイスを盗んだ人がキーチェーンのコンテンツを読み取ることができるため、セキュリティ上の問題が発生していました。現在、デフォルト属性は kSecAttrAccessibleWhenUnlocked
で、これは適度に制限が付いたデフォルトです。ただし、Apple の公開ドキュメントでは、デフォルト属性がどうあるべきかについて意見が一致していないため、念のために、この属性をすべてのキーチェーンのアイテムに明示的に設定する必要があります。例 1: 次の例では、アクセシビリティ レベルを明確に指定せずにキーチェーンのアイテムが格納されており、iOS バージョンによって動作が異なる可能性があります。
...
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
NSData *token = [@"secret" dataUsingEncoding:NSUTF8StringEncoding];
// Configure Keychain Item
[dict setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id) kSecClass];
[dict setObject:token forKey:(__bridge id)kSecValueData];
...
OSStatus error = SecItemAdd((__bridge CFDictionaryRef)dict, NULL);
...
References
[1] Keychain Services Apple
[2] Keychain Item Accessibility Constants Apple
[3] David Thiel iOS Application Security: The Definitive Guide for Hackers and Developers No Starch Press
[4] Standards Mapping - Common Weakness Enumeration CWE ID 359
[5] Standards Mapping - Common Weakness Enumeration Top 25 2019 [4] CWE ID 200
[6] Standards Mapping - Common Weakness Enumeration Top 25 2020 [7] CWE ID 200
[7] Standards Mapping - Common Weakness Enumeration Top 25 2021 [20] CWE ID 200
[8] Standards Mapping - Common Weakness Enumeration Top 25 2024 [17] CWE ID 200
[9] Standards Mapping - General Data Protection Regulation (GDPR) Insufficient Data Protection
[10] Standards Mapping - OWASP Application Security Verification Standard 4.0 8.2.2 Client-side Data Protection (L1 L2 L3), 8.3.4 Sensitive Private Data (L1 L2 L3), 10.2.1 Malicious Code Search (L2 L3)
[11] Standards Mapping - OWASP Mobile 2024 M9 Insecure Data Storage
[12] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-AUTH-2, MASVS-STORAGE-2
[13] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 3.3.1, Requirement 3.5.1, Requirement 4.2.2, Requirement 6.2.4, Requirement 8.3.1
[14] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0.1 Requirement 3.3.1, Requirement 3.3.2, Requirement 3.3.3, Requirement 3.5.1, Requirement 4.2.2, Requirement 6.2.4, Requirement 8.3.1
desc.dataflow.objc.insecure_storage_unspecified_keychain_access_policy
Abstract
この特定のメソッドは、アクセシビリティ レベルを指定せずにキーチェーンにデータを格納します。
Explanation
データをキーチェーンに格納する際、アイテムにアクセスできる時期を指定するアクセシビリティ レベルを設定する必要があります。設定できるアクセシビリティ レベルは次のとおりです。
-
ユーザーによってデバイスがロック解除されるまで、再起動後はキーチェーン アイテムのデータにアクセスできません。
最初のロック解除後、次回の再起動までデータはアクセス可能なままです。これは、バックグラウンド アプリケーションでアクセスする必要のあるアイテムに推奨されます。この属性を持つアイテムは新しいデバイスに移行されません。このため、別のデバイスのバックアップからリストアした後、これらのアイテムは表示されません。
iOS 4.0 以降で使用できます。
-
デバイスがロックされているかどうかに関係なく、常にキーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションでの使用には推奨されません。暗号化されたバックアップを使用する場合、この属性を持つアイテムは新しいデバイスに移行されます。
iOS 4.0 以降で使用できます。
-
デバイスがロック解除されている場合のみ、キーチェーンのデータにアクセスできます。デバイスにパスコードが設定されている場合にのみ使用できます。
これは、アプリケーションがフォアグラウンドにある間にのみアクセスできる必要のあるアイテムに推奨されます。この属性を持つアイテムが新しいデバイスに移行されることはありません。バックアップを新しいデバイスにリストアすると、これらのアイテムは失われます。パスコードなしに、デバイス上でこのクラスにアイテムを格納することはできません。デバイスのパスコードを無効にすると、このクラスのすべてのアイテムが削除されます。
iOS 8.0 以降で使用できます。
-
デバイスがロックされているかどうかに関係なく、常にキーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションでの使用には推奨されません。この属性を持つアイテムは新しいデバイスに移行されません。このため、別のデバイスのバックアップからリストアした後、これらのアイテムは表示されません。
iOS 4.0 以降で使用できます。
-
デバイスがユーザーによってロック解除されている間のみ、キーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションがフォアグラウンドにある間にのみアクセスできる必要のあるアイテムに推奨されます。暗号化されたバックアップを使用する場合、この属性を持つアイテムは新しいデバイスに移行されます。
これは、アクセシビリティ定数を明示的に設定せずに追加されたキーチェーン アイテムのデフォルト値です。
iOS 4.0 以降で使用できます。
-
デバイスがユーザーによってロック解除されている間のみ、キーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションがフォアグラウンドにある間にのみアクセスできる必要のあるアイテムに推奨されます。この属性を持つアイテムは新しいデバイスに移行されません。このため、別のデバイスのバックアップからリストアした後、これらのアイテムは表示されません。
iOS 4.0 以降で使用できます。
キーチェーン保護が最初に導入された際、デフォルト値は
例 1: 次の例では、アクセシビリティ レベルを明確に指定せずにキーチェーンのアイテムが格納されており、iOS バージョンによって動作が異なる可能性があります。
-
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:ユーザーによってデバイスがロック解除されるまで、再起動後はキーチェーン アイテムのデータにアクセスできません。
最初のロック解除後、次回の再起動までデータはアクセス可能なままです。これは、バックグラウンド アプリケーションでアクセスする必要のあるアイテムに推奨されます。この属性を持つアイテムは新しいデバイスに移行されません。このため、別のデバイスのバックアップからリストアした後、これらのアイテムは表示されません。
iOS 4.0 以降で使用できます。
-
kSecAttrAccessibleAlways
:デバイスがロックされているかどうかに関係なく、常にキーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションでの使用には推奨されません。暗号化されたバックアップを使用する場合、この属性を持つアイテムは新しいデバイスに移行されます。
iOS 4.0 以降で使用できます。
-
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:デバイスがロック解除されている場合のみ、キーチェーンのデータにアクセスできます。デバイスにパスコードが設定されている場合にのみ使用できます。
これは、アプリケーションがフォアグラウンドにある間にのみアクセスできる必要のあるアイテムに推奨されます。この属性を持つアイテムが新しいデバイスに移行されることはありません。バックアップを新しいデバイスにリストアすると、これらのアイテムは失われます。パスコードなしに、デバイス上でこのクラスにアイテムを格納することはできません。デバイスのパスコードを無効にすると、このクラスのすべてのアイテムが削除されます。
iOS 8.0 以降で使用できます。
-
kSecAttrAccessibleAlwaysThisDeviceOnly
:デバイスがロックされているかどうかに関係なく、常にキーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションでの使用には推奨されません。この属性を持つアイテムは新しいデバイスに移行されません。このため、別のデバイスのバックアップからリストアした後、これらのアイテムは表示されません。
iOS 4.0 以降で使用できます。
-
kSecAttrAccessibleWhenUnlocked
:デバイスがユーザーによってロック解除されている間のみ、キーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションがフォアグラウンドにある間にのみアクセスできる必要のあるアイテムに推奨されます。暗号化されたバックアップを使用する場合、この属性を持つアイテムは新しいデバイスに移行されます。
これは、アクセシビリティ定数を明示的に設定せずに追加されたキーチェーン アイテムのデフォルト値です。
iOS 4.0 以降で使用できます。
-
kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:デバイスがユーザーによってロック解除されている間のみ、キーチェーン アイテムのデータにアクセスできます。
これは、アプリケーションがフォアグラウンドにある間にのみアクセスできる必要のあるアイテムに推奨されます。この属性を持つアイテムは新しいデバイスに移行されません。このため、別のデバイスのバックアップからリストアした後、これらのアイテムは表示されません。
iOS 4.0 以降で使用できます。
キーチェーン保護が最初に導入された際、デフォルト値は
kSecAttrAccessibleAlways
で、デバイスにアクセスできるユーザーまたはデバイスを盗んだ人がキーチェーンのコンテンツを読み取ることができるため、セキュリティ上の問題が発生していました。現在、デフォルト属性は kSecAttrAccessibleWhenUnlocked
で、これは適度に制限が付いたデフォルトです。ただし、Apple の公開ドキュメントでは、デフォルト属性がどうあるべきかについて意見が一致していないため、念のために、この属性をすべてのキーチェーンのアイテムに明示的に設定する必要があります。例 1: 次の例では、アクセシビリティ レベルを明確に指定せずにキーチェーンのアイテムが格納されており、iOS バージョンによって動作が異なる可能性があります。
...
// Configure Keychain Item
let token = "secret"
var query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword
query[kSecValueData as String] = token as AnyObject?
SecItemAdd(query as CFDictionary, nil)
...
References
[1] Keychain Services Apple
[2] Keychain Item Accessibility Constants Apple
[3] David Thiel iOS Application Security: The Definitive Guide for Hackers and Developers No Starch Press
[4] Standards Mapping - Common Weakness Enumeration CWE ID 359
[5] Standards Mapping - Common Weakness Enumeration Top 25 2019 [4] CWE ID 200
[6] Standards Mapping - Common Weakness Enumeration Top 25 2020 [7] CWE ID 200
[7] Standards Mapping - Common Weakness Enumeration Top 25 2021 [20] CWE ID 200
[8] Standards Mapping - Common Weakness Enumeration Top 25 2024 [17] CWE ID 200
[9] Standards Mapping - General Data Protection Regulation (GDPR) Insufficient Data Protection
[10] Standards Mapping - OWASP Application Security Verification Standard 4.0 8.2.2 Client-side Data Protection (L1 L2 L3), 8.3.4 Sensitive Private Data (L1 L2 L3), 10.2.1 Malicious Code Search (L2 L3)
[11] Standards Mapping - OWASP Mobile 2024 M9 Insecure Data Storage
[12] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-AUTH-2, MASVS-STORAGE-2
[13] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 3.3.1, Requirement 3.5.1, Requirement 4.2.2, Requirement 6.2.4, Requirement 8.3.1
[14] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0.1 Requirement 3.3.1, Requirement 3.3.2, Requirement 3.3.3, Requirement 3.5.1, Requirement 4.2.2, Requirement 6.2.4, Requirement 8.3.1
desc.dataflow.swift.insecure_storage_unspecified_keychain_access_policy