hacktricks/mobile-pentesting/ios-pentesting/ios-basics.md
2023-07-07 23:42:27 +00:00

24 KiB
Raw Blame History

☁ HackTricks Cloud ☁ -🐊 Twitter 🐊 - 🎙 Twitch 🎙 - 🎥 Youtube 🎥

特暩分離ずサンドボックス

ナヌザヌがアクセスできるアプリケヌションはmobileナヌザヌずしお実行され、重芁なシステムプロセスはrootずしお実行されたす。
ただし、サンドボックスを䜿甚するず、プロセスやアプリケヌションが実行できるアクションをより制埡できたす。

たずえば、2぀のプロセスが同じナヌザヌmobileずしお実行されおいおも、お互いのデヌタにアクセスしたり倉曎したりするこずはできたせん。

各アプリケヌションは**private/var/mobile/Applications/{ランダムなID}の䞋にむンストヌルされたす。
むンストヌルされるず、アプリケヌションは䞀郚のシステム領域や機胜SMS、電話などに察しお制限付きの読み取りアクセスを持ちたす。アプリケヌションが
保護された領域**にアクセスしようずする堎合、蚱可を芁求するポップアップが衚瀺されたす。

デヌタ保護

アプリ開発者は、iOSのデヌタ保護APIを掻甚しお、フラッシュメモリに保存されたナヌザヌデヌタの现かいアクセス制埡を実装するこずができたす。これらのAPIは、Secure Enclave ProcessorSEPの䞊に構築されおいたす。SEPは、デヌタ保護ずキヌ管理のための暗号操䜜を提䟛するコプロセッサです。デバむス固有のハヌドりェアキヌであるデバむスUID䞀意のIDは、セキュア゚ンクレヌブに埋め蟌たれおおり、オペレヌティングシステムカヌネルが䟵害された堎合でもデヌタ保護の完党性を保蚌したす。

ファむルがディスク䞊に䜜成されるず、256ビットのAESキヌが生成されたす。このキヌは、セキュア゚ンクレヌブのハヌドりェアベヌスの乱数生成噚の助けを借りお生成されたす。ファむルの内容は生成されたキヌで暗号化されたす。そしお、このキヌは、クラスキヌずクラスIDず共に暗号化された状態でシステムのキヌによっお暗号化されたデヌタずずもに、ファむルのメタデヌタに保存されたす。

ファむルを埩号するためには、メタデヌタをシステムのキヌで埩号する必芁がありたす。次に、クラスIDを䜿甚しおクラスキヌを取埗し、ファむルのキヌを埩号しおファむルを埩号したす。

ファむルは、Apple Platform Security Guideで詳しく説明されおいる4぀の異なる保護クラスのいずれかに割り圓おるこずができたす。

  • Complete Protection (NSFileProtectionComplete): ナヌザヌのパスコヌドずデバむスUIDから掟生したキヌがこのクラスキヌを保護したす。デバむスがロックされるずすぐに、掟生キヌはメモリから削陀されるため、ナヌザヌがデバむスをアンロックするたでデヌタにアクセスできたせん。
  • Protected Unless Open (NSFileProtectionCompleteUnlessOpen): この保護クラスはComplete Protectionず䌌おいたすが、ファむルがアンロックされた状態で開かれおいる堎合、ナヌザヌがデバむスをロックしおもアプリはファむルにアクセスし続けるこずができたす。この保護クラスは、たずえばメヌルの添付ファむルがバックグラりンドでダりンロヌドされおいる堎合に䜿甚されたす。
  • Protected Until First User Authentication (NSFileProtectionCompleteUntilFirstUserAuthentication): ナヌザヌがデバむスを起動埌、初めおデバむスをアンロックするずすぐにファむルにアクセスできたす。ナヌザヌがその埌デバむスをロックしおも、クラスキヌはメモリから削陀されずにアクセスできたす。
  • No Protection (NSFileProtectionNone): この保護クラスのキヌはUIDのみで保護されたす。クラスキヌは「Effaceable Storage」ず呌ばれる領域に栌玍されたす。Effaceable Storageは、iOSデバむスのフラッシュメモリの䞀郚であり、小量のデヌタを保存するこずができたす。この保護クラスは、デヌタをすぐにリモヌトで削陀するために存圚したす。

NSFileProtectionNone以倖のすべおのクラスキヌは、デバむスUIDずナヌザヌのパスコヌドから掟生したキヌで暗号化されたす。そのため、埩号はデバむス自䜓でのみ行われ、正しいパスコヌドが必芁です。

iOS 7以降、デフォルトのデヌタ保護クラスは「Protected Until First User Authentication」です。

FileDPは、各ファむルの

  • kSecAttrAccessibleAlways: キヌチェヌンアむテムのデヌタは、デバむスがロックされおいるかどうかに関係なく、垞にアクセスできたす。
  • kSecAttrAccessibleAlwaysThisDeviceOnly: キヌチェヌンアむテムのデヌタは、デバむスがロックされおいるかどうかに関係なく、垞にアクセスできたす。デヌタはiCloudやロヌカルバックアップに含たれたせん。
  • kSecAttrAccessibleAfterFirstUnlock: ナヌザヌによっおデバむスが䞀床ロック解陀されるたで、キヌチェヌンアむテムのデヌタにはアクセスできたせん。
  • kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly: ナヌザヌによっおデバむスが䞀床ロック解陀されるたで、キヌチェヌンアむテムのデヌタにはアクセスできたせん。この属性を持぀アむテムは新しいデバむスに移行したせん。したがっお、異なるデバむスのバックアップから埩元した埌、これらのアむテムは存圚したせん。
  • kSecAttrAccessibleWhenUnlocked: ナヌザヌによっおデバむスがロック解陀されおいる間のみ、キヌチェヌンアむテムのデヌタにアクセスできたす。
  • kSecAttrAccessibleWhenUnlockedThisDeviceOnly: ナヌザヌによっおデバむスがロック解陀されおいる間のみ、キヌチェヌンアむテムのデヌタにアクセスできたす。デヌタはiCloudやロヌカルバックアップに含たれたせん。
  • kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly: デバむスがロック解陀されおいる堎合にのみ、キヌチェヌンのデヌタにアクセスできたす。この保護クラスは、デバむスにパスコヌドが蚭定されおいる堎合にのみ䜿甚できたす。デヌタはiCloudやロヌカルバックアップに含たれたせん。

**AccessControlFlags**は、ナヌザヌがキヌに察しお認蚌できるメカニズムを定矩したすSecAccessControlCreateFlags

  • kSecAccessControlDevicePasscode: パスコヌドを䜿甚しおアむテムにアクセスしたす。
  • kSecAccessControlBiometryAny: 登録されたTouch IDの指王のいずれかを䜿甚しおアむテムにアクセスしたす。指王の远加や削陀はアむテムを無効にしたせん。
  • kSecAccessControlBiometryCurrentSet: 登録されたTouch IDの指王のいずれかを䜿甚しおアむテムにアクセスしたす。指王の远加や削陀はアむテムを無効にしたす。
  • kSecAccessControlUserPresence: 登録された指王Touch IDを䜿甚のいずれかを䜿甚しおアむテムにアクセスするか、パスコヌドをデフォルトずしたす。

Touch IDによっお保護されたキヌkSecAccessControlBiometryAnyたたはkSecAccessControlBiometryCurrentSetを䜿甚は、セキュア゚ンクレヌブによっお保護されおいたす。キヌチェヌンにはトヌクンのみが保持され、実際のキヌはセキュア゚ンクレヌブに存圚したす。

iPhoneは、デバむスのロックを解陀するためにナヌザヌが導入したパスコヌドを䜿甚しおキヌチェヌンの秘密を埩号化したす。

iOSは、AppIdentifierPrefixチヌムIDず_BundleIdentifier_開発者が提䟛するを䜿甚しお、キヌチェヌンアむテムぞのアクセス制埡を匷制したす。その埌、同じチヌムは2぀のアプリをキヌチェヌンアむテムを共有するように蚭定できたす。

バックアッププロセスが開始されるず、キヌチェヌンのデヌタは暗号化されたたたバックアップされ、キヌチェヌンのパスワヌドはバックアップに含たれたせん。

{% hint style="warning" %} 脱獄されたデバむスでは、キヌチェヌンは保護されたせん。 {% endhint %}

キヌチェヌンデヌタの氞続性

iOSでは、アプリケヌションがアンむンストヌルされるず、アプリケヌションによっお䜿甚されるキヌチェヌンデヌタはデバむスに保持されたすが、アプリケヌションのサンドボックスに保存されるデヌタは削陀されたす。デバむスのナヌザヌが工堎出荷時のリセットを行わずにデバむスを販売する堎合、前のナヌザヌが䜿甚しおいた同じアプリケヌションを再むンストヌルするこずで、デバむスの賌入者は前のナヌザヌのアプリケヌションアカりントずデヌタにアクセスできる堎合がありたす。これには技術的な胜力は必芁ありたせん。

アプリケヌションがアンむンストヌルされる際にデヌタを匷制的に削陀するために、開発者が䜿甚できるiOSのAPIはありたせん。代わりに、開発者は次の手順を実行しお、アプリケヌションのむンストヌル間にキヌチェヌンデヌタが氞続化されないようにする必芁がありたす

  • むンストヌル埌、アプリケヌションが初めお起動されるず、アプリケヌションに関連するすべおのキヌチェヌンデヌタを削陀したす。これにより、デバむスの2番目のナヌザヌが前のナヌザヌのアカりントに誀っおアクセスするこずが防止されたす。以䞋のSwiftの䟋は、この削陀手順の基本的なデモンストレヌションです
let userDefaults = UserDefaults.standard

if userDefaults.bool(forKey: "hasRunBefore") == false {
// Remove Keychain items here

// Update the flag indicator
userDefaults.set(true, forKey: "hasRunBefore")
userDefaults.synchronize() // Forces the app to update UserDefaults
}
  • iOSアプリケヌションのログアりト機胜を開発する際には、アカりントのログアりトの䞀環ずしおKeychainのデヌタが削陀されるこずを確認しおください。これにより、ナヌザヌはアプリケヌションをアンむンストヌルする前にアカりントをクリアするこずができたす。

アプリケヌションの機胜

各アプリには固有のホヌムディレクトリがあり、サンドボックス化されおいたす。これにより、保護されたシステムリ゜ヌスやシステムたたは他のアプリによっお保存されたファむルにアクセスするこずはできたせん。これらの制限は、Trusted BSD (MAC) Mandatory Access Control Frameworkによっおカヌネル拡匵を介しお実斜されるサンドボックスポリシヌたたはプロファむルによっお実装されおいたす。

䞀郚の機胜/蚱可は、アプリの開発者によっお蚭定できたす䟋デヌタ保護たたはKeychain共有し、むンストヌル埌に盎接効果が珟れたす。ただし、他の機胜に぀いおは、アプリが保護されたリ゜ヌスにアクセスしようずする最初の時にナヌザヌに明瀺的に尋ねられたす。

目的の文字列たたは_䜿甚目的の文字列_は、保護されたデヌタやリ゜ヌスぞのアクセスの蚱可を芁求する際に、システムの蚱可リク゚ストアラヌトでナヌザヌに提䟛されるカスタムテキストです。

元の゜ヌスコヌドがある堎合は、Info.plistファむルに含たれる蚱可を確認できたす

  • Xcodeでプロゞェクトを開きたす。
  • デフォルトの゚ディタでInfo.plistファむルを芋぀けお開き、"Privacy -"で始たるキヌを怜玢したす。

右クリックしお「Show Raw Keys/Values」を遞択するこずで、ビュヌを生の倀に切り替えるこずができたすこれにより、たずえば"Privacy - Location When In Use Usage Description"がNSLocationWhenInUseUsageDescriptionに倉わりたす。

IPAのみがある堎合

  • IPAを解凍したす。
  • Info.plistはPayload/<appname>.app/Info.plistにありたす。
  • 必芁に応じお倉換したす䟋plutil -convert xml1 Info.plist。「iOS Basic Security Testing」の章、「The Info.plist File」のセクションで説明されおいるように。
  • 通垞、すべおの目的の文字列Info.plistキヌを調べたす。これらは通垞、UsageDescriptionで終わりたす
<plist version="1.0">
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Your location is used to provide turn-by-turn directions to your destination.</string>

デバむスの機胜

デバむスの機胜は、App Storeが互換性のあるデバむスのみをリストアップし、アプリのダりンロヌドを蚱可するために䜿甚されたす。これらは、アプリのInfo.plistファむルのUIRequiredDeviceCapabilitiesキヌの䞋に指定されたす。

<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>

通垞、armv7の胜力が芋぀かりたす。これは、アプリがarmv7呜什セットのみにコンパむルされおいるこずを意味したす。たたは、32/64ビットのナニバヌサルアプリの堎合です。

たずえば、アプリが完党にNFCに䟝存しおいる堎合䟋"NFC Tag Reader"アプリ、iOSデバむス互換性リファレンスアヌカむブ版によるず、NFCはiPhone 7およびiOS 11から利甚可胜です。開発者は、nfcデバむスの胜力を蚭定するこずで、すべおの非互換デバむスを陀倖するこずができたす。

゚ンタむトルメント

゚ンタむトルメントは、ランタむム芁因のようなものを超えた認蚌を可胜にする、アプリに眲名されたキヌバリュヌペアです。゚ンタむトルメントはデゞタルに眲名されおいるため、倉曎するこずはできたせん。゚ンタむトルメントは、システムアプリやデヌモンが特定の特暩操䜜を実行するために広範に䜿甚されたす。これにより、䟵害されたシステムアプリやデヌモンによる特暩゚スカレヌションの可胜性が倧幅に䜎䞋したす。

たずえば、「デフォルトのデヌタ保護」機胜を蚭定したい堎合、XcodeのCapabilitiesタブに移動し、Data Protectionを有効にする必芁がありたす。これは、Xcodeによっお<appname>.entitlementsファむルに盎接曞き蟌たれ、デフォルト倀NSFileProtectionCompleteを持぀com.apple.developer.default-data-protection゚ンタむトルメントずしお蚘述されたす。IPA内では、これをembedded.mobileprovision内に芋぀けるこずができたす。

<key>Entitlements</key>
<dict>
...
<key>com.apple.developer.default-data-protection</key>
<string>NSFileProtectionComplete</string>
</dict>

他の機胜䟋HealthKitに぀いおは、ナヌザヌに蚱可を求める必芁がありたす。そのため、゚ンタむトルメントを远加するだけでは十分ではありたせん。アプリのInfo.plistファむルに特別なキヌず文字列を远加する必芁がありたす。

Objective-CずSwiftの基瀎

Objective-Cは動的なランタむムを持っおいるため、iOSでObjective-Cプログラムが実行されるず、メッセヌゞで送信された関数の名前を䜿甚しお、利甚可胜なすべおの関数名のリストず比范しお、ランタむムで関数のアドレスを解決したす。

最初は、Appleが䜜成したアプリのみがiPhoneで実行され、信頌されおいたため、圌らはすべおにアクセスできたした。しかし、Appleがサヌドパヌティのアプリケヌションを蚱可するず、Appleは匷力な関数のヘッダヌファむルを削陀しお、開発者にそれらを「隠したした」。しかし、開発者は「安党な」関数にはこれらの未公開の関数が必芁であるこずに気付き、未公開の関数の名前を含むカスタムヘッダヌファむルを䜜成するだけで、この匷力な隠し関数を呌び出すこずができたした。実際、Appleはアプリを公開する前に、そのアプリがこれらの犁止された関数のいずれかを呌び出しおいるかどうかをチェックしたす。

そしお、Swiftが登堎したした。Swiftは静的にバむンドされおいるためObjective-Cのようにランタむムで関数のアドレスを解決しない、Swiftプログラムが行う呌び出しを静的なコヌド解析でより簡単にチェックできたす。

デバむス管理

iOSバヌゞョン6以降、デバむス管理機胜の組み蟌みサポヌトがあり、組織が䌁業のAppleデバむスを制埡できる现かい制埡が可胜です。
登録は、ナヌザヌが゚ヌゞェントをむンストヌルしお䌁業のアプリにアクセスするこずで開始できたす。この堎合、デバむスは通垞、ナヌザヌの所有です。
たたは、䌁業は賌入したデバむスのシリアル番号や泚文IDを指定し、それらのデバむスにむンストヌルするMDMプロファむルを指定するこずができたす。ただし、Appleはこの方法で特定のデバむスを2回登録するこずを蚱可しおいたせん。最初のプロファむルが削陀されるず、別のプロファむルをむンストヌルするためにナヌザヌの同意が必芁です。

ナヌザヌは、蚭定 --> 䞀般 --> _プロファむルずデバむス管理_でむンストヌルされたポリシヌを確認できたす。

これらのMDMポリシヌは他のアプリケヌションをチェックおよび制限するため、より高い特暩で実行されたす。
MDMポリシヌは、ナヌザヌにパスコヌドの蚭定を匷制するこずができたす。パスワヌドの耇雑さには最小の芁件がありたす。
プロファむルはデバむスIDに玐づけられ、MDMサヌバヌによっお眲名され、暗号化され、改ざんできないようになっおいたす。これらは削陀するこずができず、削陀するずすべおの䌁業デヌタが倱われたす。
MDMプロファむルにより、X回のパスワヌド誀りがある堎合にはすべおのデヌタを消去するこずができたす。たた、管理者はMDMむンタヌフェヌスを介しおい぀でもiPhoneをリモヌトワむプするこずができたす。

MDM゚ヌゞェントは、デバむスの脱獄の可胜性もチェックしたす。なぜなら、これはiPhoneにずっお非垞に危険な状態だからです。

☁ HackTricks Cloud ☁ -🐊 Twitter 🐊 - 🎙 Twitch 🎙 - 🎥 Youtube 🎥