iOSデータ保護の実装とテスト

data-protection ios iphone objective-c security
iOSデータ保護の実装とテスト

Session 209-de 2010 WWDCからのアプリケーションデータの保護をご覧ください。

基調講演では、ファイルにデータ保護属性を設定する方法(NSFileProtectionComplete、NSFileProtectionNone)や、ケースに最適な保護を決定する方法など、多くのことを説明しています。

実装したばかりですが、セキュリティがオンになっているかどうかをテストする方法がわかりませんか?

さらに、時々バックグラウンドでアクセスする必要があるsql liteデータベースがあり、このデータ保護方法は十分ではないようです。 最高のデータベース保護をガイドするリンクまたはチュートリアルはありますか? (SQL暗号が見つかりましたが、進化したプロジェクトに追加するにはちょっと重いです)

ありがとうございます。

  24  18


ベストアンサー

更新: iOS 6では、iOSプロビジョニングプロファイルのApp 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);

データ保護が有効かどうかに関係なく、「ファイル保護値: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"}

20秒の遅延が必要なのは、データ保護が有効なデバイスがロックされた後、保護されたデータがまだ利用可能な10秒程度の猶予期間があるためです。

2番目の方法は、アプリケーションで保護されたファイルを作成し、アプリケーションを終了し、デバイスをロックし、10秒待ってから、XCodeオーガナイザーを使用してアプリケーションのコンテンツをダウンロードすることです。 これによりエラーメッセージが生成され、保護されたファイルは空になります。

上記のテストのいずれかが説明どおりに動作しない場合、データ保護が有効になっていないか、ファイル保護コードが正しく実装されていません。

機密情報をディスクに書き込む前にData Protectionが有効になっていることをアプリケーション内で確認する方法が見つからなかったため、Data Protectionを有効にする必要があるとしてアプリケーションをマークできるように、Appleに機能拡張リクエストを提出しました。 (rdar:// 10167256)

Appleは、モバイルデバイス管理(MDM)APIを通じてこれに対するソリューションを提供します。これは、サードパーティのサーバーと組み合わせて、デバイスでデータ保護を有効にする必要があるポリシーを実施するために使用できます。

22


iExplorerアプリを使用して、ファイルが暗号化されているかどうかを検出できます。 iExplorerでは、iPhone / iPadのファイルシステムを参照して、ファイルを開くことができます(もちろん、デバイスをMacに接続する必要があります)。

デバイスがロックされていると、ファイルを正しく読み取ることができません。

10


NSFileManagerクラスドキュメントから:

_
ファイルは暗号化された形式でディスクに保存され、デバイスのロック中または起動中は読み書きできません。
_

ファイル属性を設定するときに定数を渡すだけです。

__
writeToFile:options:error:メソッドを使用してNSDataオブジェクトの内容をディスクに書き込むとき、NSDataWritingFileProtectionCompleteオプションを含めます。

NSFileManagerのsetAttributes:ofItemAtPath:error:メソッドを使用して、NSFileProtectionKey属性(NSFileProtectionComplete値)を既存のファイルに追加します。
__

編集(保護されたファイルの可用性の決定)

保護されたファイルにアクセスできるのは、デバイスのロックが解除されている場合のみです。 デバイスがロックされている間もアプリケーションは実行を継続する可能性があるため、保護されたファイルがいつでも利用できなくなる可能性に対処するためのコードを準備する必要があります。 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)デバイスにrootユーザーとしてコンピューターからログインします(Macクライアントまたはターミナルを使用)。

アプリのディレクトリとファイルの場所を見つけるには、さまざまな方法があります。 どちらでもいい

  • grep`アプリのプロセス( ps ax | grep YourAppName`など)-
    プロセスの詳細を取得するには、デバイスでアプリが実行されていることを確認してください。 アプリバンドルの場所を提供する必要があります

  • 別の方法として、 find`を使用して特定のファイルを検索することもできます
    に興味がある。 例えば。 `find / -type f -name YouAppName.sqlite
    。 デバイス上のファイルの場所を指定する必要があります。

ここから、電話がパスコードでロックされているときに、ファイルに本当にアクセスできるかどうかを確認できます。か否か。 -単に `cat YouAppName.sqlite`を実行して、コンテンツにアクセスできるかどうかを確認できます。 Ia fファイルは保護されています。

_
操作は許可されていません
_

エラー;それ以外の場合は、ファイルの内容が表示されます。

繰り返しますが、個々のファイルのファイル保護を本当に確認したい場合、これが必要です。 資格と機能が適切に設定されている場合、資格を確認するだけでファイル保護に十分なはずです。

サイドノードでは、iExplorerなどのファイルエクスプローラーツールはFileProtectionの検証にあまり役立ちません。そのようなツールにはデバイスが「信頼できる」モードである必要があるため、デバイス/アプリのコンテンツにアクセスするためのアクセス許可があるためです。

がんばろう!

8


テストはXcode内で実行できます。

  1. アプリを削除して再インストールする

  2. iOSデバイスで、[設定]> [パスコード]に移動し、[必須
    「パスコード」は「即時」に設定されます

  3. 電話をロックして20秒待ちます

  4. Xcodeで、[ウィンドウ]> [デバイス]に移動します。

  5. テストするアプリを選択します

  6. 設定歯車をクリックして、「コンテナのダウンロード」を選択します

  7. ダウンロードした.xcappdataファイルを右クリックし、「パッケージを表示」を選択します
    内容」。 ここで表示できるものはすべて「NSFileProtectionComplete」によって暗号化されていません

  8. 電話のロックを解除し、手順3〜6を繰り返します。 以前はしなかったファイル
    表示できるようになりましたが、暗号化に成功しました。

https://i.stack.imgur.com/i5hyj.png [image:https://i.stack.imgur.com/i5hyj.png [ここに画像の説明を入力]]

5


ファイル保護は、ファイルごとまたはディレクトリごとに有効にすることも、アプリケーション全体で有効にすることもできます(資格とプロビジョニングプロファイルを使用)。 ファイルまたはディレクトリが保護されているかどうかを判断するには、データ保護キーのファイルシステム属性を確認します。 これは、保護するように設定された親ディレクトリであっても有効です。

- (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;
}

4


コンピューターベースのツールとジェイルブレイクされていないiPhoneでData Protectionをテストすることはもうできないと思います-過去にできたかもしれません。 データ保護をテストするための更新された方法については、こちらの回答をご覧ください:https://stackoverflow.com/a/40044841/1165843

3


完全なテストのために、http://resources.infosecinstitute.com/ios-application-securityで説明されているように、iOSアプリでペンテストを実行するためにiDB(https://github.com/dmayer/idb)などのツールを使用することをお勧めします-part-35-auditing-ios-applications-idb / [このガイド]。 また、https://www.owasp.org/index.php/IOS_Application_Security_Testing_Cheat_Sheet [このiOSのセキュリティテスト用のチートシート]も関連しています。

0


タイトルとURLをコピーしました