簡體   English   中英

實施和測試iOS數據保護

[英]Implementing and Testing iOS data protection

剛剛看到了會議209 - 從2010 WWDC獲取應用數據。

主題演講解釋了許多內容,包括您可以為文件設置數據保護屬性的方式(NSFileProtectionComplete,NSFileProtectionNone)以及如何確定哪種保護最適合您的情況。

我剛剛實現了它,但無法弄清楚如何測試安全性是否開啟,任何想法?

另外,我有一個sql lite數據庫,需要不時在后台訪問,這種數據保護方法似乎不夠好..任何指導我通過最佳數據庫保護的鏈接或教程? (找到sql密碼,但在一個不變的項目中添加有點重)

謝謝!

更新:對於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);

將吐出file protection value: NSFileProtectionComplete無論是否啟用了數據保護。

我已經能夠使用兩種方法來發現文件保護是否按預期工作。 遺憾的是,這些方法都不適合檢測是否在現場設備上啟用了數據保護。

這兩種方法都認為如果設備被鎖定,則無法讀取受保護的文件。

方法一涉及使用計時器在設備鎖定后嘗試讀取文件,但在應用程序繼續運行時:

[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秒左右的寬限期。

第二種方法是在應用程序中創建受保護的文件,退出應用程序,鎖定設備,等待10秒,然后使用XCode管理器下載應用程序的內容。 這將產生錯誤消息,受保護的文件將為空。

如果上述任一測試無法按照所述方式運行,則表明數據保護未啟用,或者您的文件保護代碼未正確實施。

因為在將機密信息寫入磁盤之前,我沒有找到任何方法在應用程序中驗證數據保護已啟用,我已向Apple提交了一項功能增強請求,以便能夠將應用程序標記為需要啟用數據保護。 (rdar:// 10167256)

Apple確實通過其移動設備管理(MDM)API提供了解決方案,該API與第三方服務器相結合,可用於實施需要在設備上啟用數據保護的策略。

您可以使用iExplorer應用程序檢測您的文件是否已加密。 iExplorer允許您瀏覽iPhone / iPad的文件系統,並打開文件(當然您的設備必須插入Mac)。

設備鎖定時,無法正確讀取文件。

NSFileManager類doc:

該文件以加密格式存儲在磁盤上,在設備鎖定或引導時無法讀取或寫入。

您只需在設置文件屬性時傳遞常量。

使用writeToFile:options:error:方法將NSData對象的內容寫入磁盤時,請包含NSDataWritingFileProtectionComplete選項。

使用setAttributes:ofItemAtPath:error:NSFileManager方法將NSFileProtectionKey屬性(帶有NSFileProtectionComplete值)添加到現有文件

http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StandardBehaviors/StandardBehaviors.html

編輯(確定受保護文件的可用性)

只有在設備解鎖時才能訪問受保護的文件。 由於應用程序可能會在設備鎖定時繼續運行,因此您的代碼應准備好處理受保護文件隨時變得不可用的可能性。 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的驗證沒有多大幫助,因為此類工具要求設備處於“受信任”模式,因此他們有權訪問您的設備/應用程序的內容。

祝好運!

測試可以在Xcode中完成:

  1. 刪除並重新安裝您的應用
  2. 在iOS設備上,轉到“設置”>“密碼”,確保“要求密碼”設置為“立即”
  3. 鎖定手機並等待20秒
  4. 在Xcode上轉到Window> Devices
  5. 選擇您要測試的應用
  6. 單擊設置cog並選擇“下載容器”
  7. 右鍵單擊下載的.xcappdata文件,然后選擇“顯示包內容”。 您在此處可以查看的任何內容都未經過NSFileProtectionComplete加密
  8. 解鎖手機並重復步驟3-6。 之前未顯示您現在可以查看的文件已成功加密。

在此輸入圖像描述

可以基於每個文件或每個目錄啟用文件保護,也可以為整個應用程序啟用文件保護(使用權利和配置文件)。 要確定文件或目錄是否受保護,請檢查數據保護密鑰的文件系統屬性。 這應該是有效的,即使它是一個設置為受保護的父目錄:

- (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測試數據保護 - 也許你可以在過去。 請在此處查看我的答案,以獲取更新的數據保護測試方法: https//stackoverflow.com/a/40044841/1165843

對於完整的測試,我建議使用iDB( https://github.com/dmayer/idb )等工具在iOS應用程序上執行pentesting,如本指南中所述 您也可以使用此安全測試的備忘單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM