セッション209-2010年WWDCからのアプリケーションデータの保護をご覧ください。
基調講演では、ファイルにデータ保護属性を設定する方法(NSFileProtectionComplete、NSFileProtectionNone)や、ケースに最適な保護を決定する方法など、多くのことを説明しています。
実装したばかりですが、セキュリティがオンになっているかどうかをテストする方法がわかりませんか?
さらに、私は時々バックグラウンドでアクセスする必要があるsql liteデータベースを持っています、そしてこのデータ保護の方法は十分ではないようです...最高のdb保護を私に導くリンクまたはチュートリアル? (SQL暗号が見つかりましたが、進化したプロジェクトに追加するには少し重いです)
ありがとう!
更新:iOS 6では、iOSプロビジョニングのアプリIDで構成する必要がある資格を使用して、アプリケーションのデータ保護を要求することがおそらく可能ですプロフィール。私はまだこれをテストしていません、そしてこれは私が見つけることができる最高の情報です https://devforums.Apple.com/message/707939#707939
この問題を調査した結果、デバイスでデータ保護が有効になっているかどうかを判断することは非常に難しいと思いました。
NSFileProtectionKey
ファイル属性をNSFileProtectionComplete
に設定すると、ファイル保護が有効になります
たとえば、保護されたファイルを作成するには、次のようなコードを実行します。
[[NSFileManager defaultManager] createFileAtPath:[self filePath]
contents:[@"super secret file contents" dataUsingEncoding:NSUTF8StringEncoding]
attributes:[NSDictionary dictionaryWithObject:NSFileProtectionComplete
forKey:NSFileProtectionKey]];
残念ながら、デバイスでデータ保護が有効になっていない場合(またはコードがデータ保護が利用できないシミュレーターで実行されている場合)でも、このコードはエラーなしで実行されます。
さらに悪いことに、NSFileProtectionComplete
属性は、ファイルが保護されているかどうかに関係なく設定されます。以下:
self.fileProtectionValue = [[[NSFileManager defaultManager] attributesOfItemAtPath:[self filePath]
error:NULL] valueForKey:NSFileProtectionKey];
NSLog(@"file protection value: %@", self.fileProtectionValue);
吐き出しますfile protection value: NSFileProtectionComplete
データ保護が有効かどうかに関係なく。
ファイル保護が期待どおりに機能しているかどうかを確認するために使用できる方法は2つあります。残念ながら、これらの方法はいずれも、現場のデバイスでデータ保護が有効になっているかどうかを検出するのに適していません。
どちらの方法も、デバイスがロックされていると保護されたファイルを読み取ることができないという考えに基づいて機能します。
方法1は、デバイスがロックされた後、アプリケーションの実行を継続しながら、タイマーを使用してファイルを読み取ろうとすることです。
[self performSelector:@selector(doReload) withObject:nil afterDelay:20];
- (void)doReload {
NSLog(@"protected data available: %@",[[UIApplication sharedApplication] isProtectedDataAvailable] ? @"yes" : @"no");
NSError *error;
self.fileContents = [NSString stringWithContentsOfFile:[self filePath]
encoding:NSUTF8StringEncoding
error:&error];
NSLog(@"file contents: %@\nerror: %@", self.fileContents, error);
}
上記のコードを実行して、データ保護されたデバイスをロックすると、吐き出されます。
protected data available: no
file contents: (null)
error: Error Domain=NSCocoaErrorDomain Code=257 "The operation couldn’t be completed. (Cocoa error 257.)" UserInfo=0x16e110 {NSFilePath=/var/mobile/Applications/D71F1F1F-6C25-4848-BB1F-51539B47EC79/Documents/protected_file, NSUnderlyingError=0x16e010 "The operation couldn’t be completed. Operation not permitted"}
データ保護が有効になっているデバイスがロックされた後、保護されたデータがまだ利用できる10秒程度の猶予期間があるため、20秒の遅延が必要です。
2番目の方法は、アプリケーションで保護されたファイルを作成し、アプリケーションを終了し、デバイスをロックし、10秒待ってから、XCodeオーガナイザーを使用してアプリケーションのコンテンツをダウンロードします。これによりエラーメッセージが表示され、保護されたファイルは空になります。
上記のテストのいずれかが説明どおりに動作しない場合は、データ保護が有効になっていないか、ファイル保護コードが正しく実装されていません。
機密情報をディスクに書き込む前にデータ保護が有効になっていることをアプリケーション内で確認する方法が見つからなかったため、Appleとマークできるように機能拡張リクエストを提出しましたデータ保護を有効にする必要があるアプリケーション(rdar:// 10167256)
Appleは、モバイルデバイス管理(MDM)APIを介してこれに対するソリューションを提供しています。これは、サードパーティのサーバーと組み合わせて、デバイスでデータ保護を有効にする必要があるポリシーを適用するために使用できます。
iExplorer アプリを使用して、ファイルが暗号化されているかどうかを検出できます。 iExplorerを使用すると、iPhone/iPadのファイルシステムを参照してファイルを開くことができます(もちろん、デバイスをMacに接続する必要があります)。
デバイスがロックされていると、ファイルを正しく読み取ることができません。
NSFileManager クラスのドキュメントから:
ファイルは暗号化された形式でディスクに保存され、デバイスがロックされているか起動している間は読み書きできません。
ファイル属性を設定するときに、定数を渡すだけです。
WriteToFile:options:error:メソッドを使用してNSDataオブジェクトの内容をディスクに書き込む場合は、NSDataWritingFileProtectionCompleteオプションを含めます。
NSFileManagerのsetAttributes:ofItemAtPath:error:メソッドを使用して、NSFileProtectionKey属性(NSFileProtectionComplete値を含む)を既存のファイルに追加します。
EDIT(保護されたファイルの可用性の決定)
保護されたファイルは、デバイスがロック解除されている場合にのみアクセスできます。デバイスがロックされている間もアプリケーションは実行を続ける可能性があるため、保護されたファイルがいつでも利用できなくなる可能性を処理できるようにコードを準備する必要があります。 UIKitフレームワークは、データ保護が現在有効になっているかどうかを追跡する方法を提供します。
*
Use applicationProtectedDataWillBecomeUnavailable: and applicationProtectedDataDidBecomeAvailable: methods and use them to track changes to the availability of protected data.
*
An application can register for the UIApplicationProtectedDataWillBecomeUnavailable and UIApplicationProtectedDataDidBecomeAvailable notifications.
*
The protectedDataAvailable property of the shared UIApplication object indicates whether protected files are currently accessible.
保護されたファイルを使用するアプリケーションはすべて、アプリケーションデリゲートメソッドを実装する必要があります。 applicationProtectedDataWillBecomeUnavailable:メソッドが呼び出されると、アプリケーションは保護されたファイルをすぐに閉じ、applicationProtectedDataDidBecomeAvailable:メソッドが呼び出されるまでそれらのファイルを再び使用しないようにする必要があります。保護されたファイルにアクセスできない状態でアクセスしようとすると失敗します。
ジェイルブレイクされたデバイスでのファイル保護の確認
さらに進んで、正確なファイルのファイル保護をテストする場合は、ジェイルブレイクしたデバイスが必要になります。そのため、以下に(詳細ではない)手順を示します。
1)iOSデバイスの脱獄
2)Cydia経由でOpen SSHをインストールします(これはそのデバイスからファイルにリモートアクセスするために必要です)( https://cydia.saurik.com/openssh.html )
3)(Macクライアントまたはターミナルを使用して)コンピューターからrootユーザーとしてデバイスにログインします。
アプリのディレクトリとファイルの場所を見つけるには、さまざまな方法があります。できるか
grep
アプリのプロセス(ps ax | grep YourAppName
など)-プロセスの詳細を取得するには、アプリがデバイスで実行されていることを確認してください。 App Bundleの場所を示す必要がありますfind
を使用して特定のファイルを検索することもできます。たとえば、 find / -type f -name YouAppName.sqlite
。デバイス上のファイルの場所を示す必要があります。ここから、電話がパスコードでロックされているときに、ファイルが本当にアクセス可能かどうかを確認できます。か否か。 -cat YouAppName.sqlite
を実行して、コンテンツにアクセスできるかどうかを確認できます。 Ia fファイルは保護されています。表示されるはずです。
操作は許可されていません
エラー;それ以外の場合は、ファイルの内容が表示されます。
繰り返しになりますが、これは、個々のファイルのファイル保護を確認したい場合に必要です。エンタイトルメントと機能が適切に設定されている場合、エンタイトルメントを確認するだけでファイルを保護できます。
サイドノードでは、iExplorerなどのファイルエクスプローラーツールはFileProtectionの検証にあまり役立ちません。これは、このようなツールがデバイスを「信頼できる」モードにする必要があるため、デバイス/アプリのコンテンツにアクセスするための権限があるためです。
幸運を!
Xcode内でテストを実行できます。
NSFileProtectionComplete
によって暗号化されていません。ファイル保護は、ファイルごとまたはディレクトリごとに有効にすることも、アプリケーション全体に対して有効にすることもできます(資格とプロビジョニングプロファイルを使用)。ファイルまたはディレクトリが保護されているかどうかを確認するには、データ保護キーのファイルシステム属性を確認します。保護するように設定された親ディレクトリであっても、これは有効です。
- (BOOL) isProtectedItemAtURL:(NSURL *)URL {
BOOL result = YES;
NSDictionary *attributes = nil;
NSString *protectionAttributeValue = nil;
NSFileManager *fileManager = nil;
fileManager = [[NSFileManager alloc] init];
attributes = [fileManager attributesOfItemAtPath:[URL path] error:&error];
if (attributes != nil){
protectionAttributeValue = [attributes valueForKey:NSFileProtectionKey];
if ((protectionAttributeValue == nil) || [protectionAttributeValue isEqualToString:NSFileProtectionNone]){
result = NO;
}
} else {
// handle the error
}
return result;
}
保護されたコンテンツが利用可能かどうかを判断するために、UIApplicationは保護状態isProtectedDataAvailable
をクエリするメソッドを提供します。上記の方法で使用すると、特定のファイルまたはディレクトリが使用可能かどうかを判断できます。
- (BOOL) isItemAtURLAvailable:(NSURL *)URL {
BOOL result = NO;
if ([self isProtectedItemAtURL:URL]){
// Item is protected
if ([[UIApplication sharedApplication] isProtectedDataAvailable]){
// Protected content is available
result = YES;
}
} else {
result = YES;
}
return result;
}
コンピューターベースのツールとジェイルブレイクされていないiPhoneでData Protectionをテストすることはもうできないと思います。おそらく以前は可能でした。データ保護をテストするための更新された方法については、ここで私の回答を参照してください: https://stackoverflow.com/a/40044841/116584
完全なテストでは、iOSアプリでペンテストを実行するためにiDB( https://github.com/dmayer/idb )などのツールを使用することをお勧めします、このガイドで説明されているように。 iOSセキュリティテストのチートシートもご覧ください 。