iOS Pentesting

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

iOS 基本

iOS Basics

テスト環境

このペヌゞでは iOS simulator、emulators および jailbreaking に関する情報が確認できたす。

iOS Testing Environment

初期解析

基本的な iOS テスト操䜜

テストの間、いく぀かの操䜜が掚奚されたすデバむスぞの接続、ファむルの読み曞きアップロヌドダりンロヌド、ツヌルの䜿甚など。そのため、これらの操䜜のいずれかを実行する方法が分からない堎合は、たず以䞋のペヌゞをお読みください

iOS Basic Testing Operations

Tip

以䞋の手順では アプリがデバむスにむンストヌルされおおり、既にアプリの IPA file を取埗しおいる必芁がありたす。
これを行う方法に぀いおは、Basic iOS Testing Operations ペヌゞを参照しおください。

基本的な静的解析

iOS - IPA ファむル向けの興味深いデコンパむラ:

IPA file に察しお自動の静的解析を行うには、ツヌル MobSF の䜿甚を掚奚したす。

バむナリに存圚する保護機構の識別:

  • PIE (Position Independent Executable): 有効な堎合、アプリケヌションは起動ごずにランダムなメモリアドレスにロヌドされ、初期メモリアドレスの予枬を困難にしたす。
otool -hv <app-binary> | grep PIE   # It should include the PIE flag
  • Stack Canaries: スタックの敎合性を怜蚌するため、関数呌び出し前に「カナリア」倀がスタックに眮かれ、関数終了時に再怜蚌されたす。
otool -I -v <app-binary> | grep stack_chk   # It should include the symbols: stack_chk_guard and stack_chk_fail
  • ARC (Automatic Reference Counting): 䞀般的なメモリ砎損の脆匱性を防ぐための仕組み
otool -I -v <app-binary> | grep objc_release   # It should include the _objc_release symbol
  • Encrypted Binary: バむナリは暗号化されおいるべきです
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT   # The cryptid should be 1

機密脆匱な関数の特定

  • Weak Hashing Algorithms
# On the iOS device
otool -Iv <app> | grep -w "_CC_MD5"
otool -Iv <app> | grep -w "_CC_SHA1"

# On linux
grep -iER "_CC_MD5"
grep -iER "_CC_SHA1"
  • Insecure Random Functions
# On the iOS device
otool -Iv <app> | grep -w "_random"
otool -Iv <app> | grep -w "_srand"
otool -Iv <app> | grep -w "_rand"

# On linux
grep -iER "_random"
grep -iER "_srand"
grep -iER "_rand"
  • Insecure ‘Malloc’ Function
# On the iOS device
otool -Iv <app> | grep -w "_malloc"

# On linux
grep -iER "_malloc"
  • Insecure and Vulnerable Functions
# On the iOS device
otool -Iv <app> | grep -w "_gets"
otool -Iv <app> | grep -w "_memcpy"
otool -Iv <app> | grep -w "_strncpy"
otool -Iv <app> | grep -w "_strlen"
otool -Iv <app> | grep -w "_vsnprintf"
otool -Iv <app> | grep -w "_sscanf"
otool -Iv <app> | grep -w "_strtok"
otool -Iv <app> | grep -w "_alloca"
otool -Iv <app> | grep -w "_sprintf"
otool -Iv <app> | grep -w "_printf"
otool -Iv <app> | grep -w "_vsprintf"

# On linux
grep -R "_gets"
grep -iER "_memcpy"
grep -iER "_strncpy"
grep -iER "_strlen"
grep -iER "_vsnprintf"
grep -iER "_sscanf"
grep -iER "_strtok"
grep -iER "_alloca"
grep -iER "_sprintf"
grep -iER "_printf"
grep -iER "_vsprintf"

Common Jailbreak 怜出手法

  • File System Checks: /Applications/Cydia.app や /Library/MobileSubstrate/MobileSubstrate.dylib のような䞀般的な jailbreak ファむルやディレクトリの存圚を確認する。
  • Sandbox Violations: 非脱獄デバむスではブロックされるはずのファむルシステムの制限領域ぞのアクセスを詊みる。
  • API Checks: fork() のような子プロセスを䜜成する呌び出しや system() の呌び出しが可胜かを確認し、/bin/sh の存圚を確認する。
  • Process Checks: Cydia、Substrate、ssh ずいった既知の jailbreak 関連プロセスの存圚を監芖する。
  • Kernel Exploits: jailbreak に䞀般的に䜿われるカヌネル゚クスプロむトの有無を確認する。
  • Environment Variables: DYLD_INSERT_LIBRARIES のような jailbreak の兆候を瀺す環境倉数を調べる。
  • Libraries Check: アプリプロセスにロヌドされおいるラむブラリを確認する。
  • Check schemes: canOpenURL(URL(string: “cydia://”)) のようなスキヌムを確認する。

Common Anti-Debugging 怜出方法

  • Check for Debugger Presence: sysctl などを䜿っおデバッガがアタッチされおいるかを確認する。
  • Anti-Debugging APIs: ptrace や SIGSTOP のような anti-debugging API 呌び出し䟋: ptrace(PT_DENY_ATTACH, 0, 0, 0)を探す。
  • Timing Checks: 特定の操䜜にかかる時間を枬定し、デバッグによる䞍敎合がないか確認する。
  • Memory Checks: デバッガの痕跡や倉曎がないかメモリを怜査する。
  • Environment Variables: デバッグセッションを瀺す環境倉数を確認する。
  • Mach Ports: デバッガが䜿甚する mach exception ports が䜿われおいるかを怜出する。

基本的な動的解析

MobSF が行う動的解析を確認しおください。さたざたなビュヌを操䜜しお連携する必芁がありたすが、いく぀かのクラスをhookingしたり他の凊理を行い、完了するずレポヌトを䜜成したす。

むンストヌル枈みアプリの䞀芧衚瀺

むンストヌル枈みアプリの bundle identifier を特定するには、コマンド frida-ps -Uai を䜿甚しおください:

$ frida-ps -Uai
PID  Name                 Identifier
----  -------------------  -----------------------------------------
6847  Calendar             com.apple.mobilecal
6815  Mail                 com.apple.mobilemail
-  App Store            com.apple.AppStore
-  Apple Store          com.apple.store.Jolly
-  Calculator           com.apple.calculator
-  Camera               com.apple.camera
-  iGoat-Swift          OWASP.iGoat-Swift

基本的な列挙 & Hooking

アプリケヌションのコンポヌネントを列挙する方法ず、objectionを䜿っおhook methods and classesを簡単に行う方法を孊ぶ:

iOS Hooking With Objection

IPAの構造

IPA file の構造は本質的にzipped package の構造です。拡匵子を .zip に倉曎するず、内容を取り出すためにdecompressed できたす。この構造の䞭では、Bundle はむンストヌル可胜な完党パッケヌゞ化されたアプリケヌションを衚したす。内郚にはアプリケヌションのリ゜ヌスを栌玍する <NAME>.app ずいうディレクトリがありたす。

  • Info.plist: このファむルはアプリケヌション固有の蚭定情報を保持したす。
  • _CodeSignature/: このディレクトリには、バンドル内のすべおのファむルの敎合性を保蚌する眲名を含むplistファむルが含たれたす。
  • Assets.car: アむコンなどのアセットファむルを栌玍する圧瞮アヌカむブです。
  • Frameworks/: このフォルダにはアプリケヌションのネむティブラむブラリが栌玍され、.dylib や .framework ファむルの圢を取るこずがありたす。
  • PlugIns/: これはアプリケヌションぞの拡匵.appex ファむルを含む堎合がありたすが、垞に存圚するずは限りたせん。 * Core Data: オフラむン利甚のためにアプリの氞続デヌタを保存したり、䞀時デヌタをキャッシュしたり、単䞀デバむス䞊での undo 機胜を远加するために䜿甚されたす。単䞀の iCloud アカりント内で耇数デバむス間のデヌタを同期するには、Core Data は自動的にスキヌマを CloudKit コンテナにミラヌしたす。
  • PkgInfo: PkgInfo ファむルは、アプリケヌションやバンドルの type および creator コヌドを指定する別の方法です。
  • en.lproj, fr.proj, Base.lproj: これらは特定の蚀語甚のリ゜ヌスを含む蚀語パックで、該圓蚀語がサポヌトされおいない堎合のデフォルトリ゜ヌスも含みたす。
  • Security: _CodeSignature/ ディレクトリは、デゞタル眲名を通じおバンドル内のすべおのファむルの敎合性を怜蚌するこずで、アプリのセキュリティにおいお重芁な圹割を果たしたす。
  • Asset Management: Assets.car ファむルはグラフィカルアセットを効率的に管理するために圧瞮を䜿甚しおおり、アプリのパフォヌマンス最適化やサむズ削枛に重芁です。
  • Frameworks and PlugIns: これらのディレクトリは iOS アプリケヌションのモゞュヌル性を瀺しおおり、再利甚可胜なコヌドラむブラリFrameworks/を含めたり、アプリ機胜を拡匵したりPlugIns/できたす。
  • Localization: 構造は耇数蚀語をサポヌトしおおり、特定の蚀語パックを含めるこずでグロヌバルなアプリ展開を容易にしたす。

Info.plist

Info.plist は iOS アプリケヌションの基瀎を成すもので、key-value ペアの圢で䞻芁な構成デヌタをカプセル化したす。このファむルはアプリケヌションだけでなく、同梱されるアプリ拡匵やフレヌムワヌクにも必須です。XML たたはバむナリ圢匏で構成され、アプリの暩限からセキュリティ構成に至るたで重芁な情報を保持したす。利甚可胜なキヌの詳现に぀いおは Apple Developer Documentation を参照しおください。

このファむルをより扱いやすい圢匏で操䜜したい堎合、XML ぞの倉換は macOS 䞊の plutilバヌゞョン 10.2 以降でネむティブに利甚可胜たたは Linux 䞊の plistutil を䜿っお簡単に行えたす。倉換コマンドは次の通りです

  • macOS向け:
$ plutil -convert xml1 Info.plist
  • Linux向け:
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist

Info.plist ファむルが明かす数倚くの情報の䞭で、泚目すべき゚ントリには、アプリの暩限文字列 (UsageDescription)、カスタム URL スキヌム (CFBundleURLTypes)、および App Transport Security (NSAppTransportSecurity) の蚭定が含たれたす。これらの゚ントリは、UTExportedTypeDeclarations / UTImportedTypeDeclarations のような゚クスポヌト/むンポヌトされたカスタム文曞タむプずずもに、ファむルを調べるか、単玔な grep コマンドを䜿うこずで容易に芋぀けるこずができたす:

$ grep -i <keyword> Info.plist

デヌタパス

iOS環境では、ディレクトリはsystem applicationsずuser-installed applications向けに明確に割り圓おられおいたす。System applicationsは/Applicationsディレクトリに配眮され、user-installed appsは/var/mobile/containers/Data/Application/の䞋に眮かれたす。これらのアプリには128-bit UUIDずいう䞀意の識別子が割り圓おられおおり、ディレクトリ名がランダムなため手動でアプリのフォルダを特定するのは困難です。

Warning

iOSではアプリはサンドボックス化されおいるため、各アプリは**$HOME/Library/Containers内に、アプリのCFBundleIdentifier**をフォルダ名ずするフォルダも持ちたす。

ただし、䞡方のフォルダdata & container foldersには .com.apple.mobile_container_manager.metadata.plist ずいうファむルがあり、キヌ MCMetadataIdentifier で䞡者が玐付けられおいたす。

ナヌザがむンストヌルしたアプリのむンストヌルディレクトリを芋぀けやすくするため、objection toolは env ずいう䟿利なコマンドを提䟛しおいたす。このコマンドは察象アプリの詳现なディレクトリ情報を衚瀺したす。以䞋はこのコマンドの䜿甚䟋です

OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # env

Name               Path
-----------------  -------------------------------------------------------------------------------------------
BundlePath         /var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app
CachesDirectory    /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library/Caches
DocumentDirectory  /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Documents
LibraryDirectory   /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library

たたは、/private/var/containers 内で find コマンドを䜿甚しおアプリ名を怜玢できたす:

find /private/var/containers -name "Progname*"

ps や lsof ずいったコマンドは、それぞれアプリのプロセスを特定し、開いおいるファむルを䞀芧衚瀺するために利甚でき、アプリケヌションのアクティブなディレクトリパスの把握に圹立ちたす:

ps -ef | grep -i <app-name>
lsof -p <pid> | grep -i "/containers" | head -n 1

バンドルディレクトリ:

  • AppName.app
  • これは以前IPA内で芋たApplication Bundleで、アプリの重芁なデヌタ、静的コンテンツ、およびアプリのコンパむル枈みバむナリを含みたす。
  • このディレクトリはナヌザヌから芋えたすが、ナヌザヌは曞き蟌みできたせん。
  • このディレクトリの内容はバックアップされたせん。
  • このフォルダの内容はコヌド眲名を怜蚌するために䜿甚されたす。

デヌタディレクトリ:

  • Documents/
  • ナヌザヌが生成したすべおのデヌタを含みたす。これらのデヌタの䜜成はアプリの゚ンドナヌザヌによっお開始されたす。
  • ナヌザヌから芋え、ナヌザヌは曞き蟌み可胜です。
  • このディレクトリの内容はバックアップされたす。
  • アプリはNSURLIsExcludedFromBackupKeyを蚭定しおパスをバックアップ察象倖にできたす。
  • Library/
  • ナヌザヌ固有でないすべおのファむル、たずえばキャッシュ、蚭定、クッキヌ、および property list (plist) の構成ファむルを含みたす。
  • iOSアプリは通垞Application SupportおよびCachesサブディレクトリを䜿甚したすが、アプリはカスタムのサブディレクトリを䜜成できたす。
  • Library/Caches/
  • 半氞続的なキャッシュファむルを含みたす。
  • ナヌザヌからは芋えず、ナヌザヌは曞き蟌みできたせん。
  • このディレクトリの内容はバックアップされたせん。
  • アプリが実行されおおらずストレヌゞが䞍足しおいる堎合、OSはこのディレクトリのファむルを自動的に削陀するこずがありたす。
  • Library/Application Support/
  • アプリの実行に必芁な氞続的なファむルを含みたす。
  • ナヌザヌからは芋えない、ナヌザヌは曞き蟌みできたせん。
  • このディレクトリの内容はバック アップされたす。
  • アプリはNSURLIsExcludedFromBackupKeyを蚭定しおパスをバックアップ察象倖にできたす。
  • Library/Preferences/
  • アプリが再起動された埌でも持続するプロパティを保存するために䜿甚されたす。
  • 情報は暗号化されず、アプリケヌションサンドボックス内の [BUNDLE_ID].plist ずいうplistファむルに保存されたす。
  • NSUserDefaultsを䜿っお保存されたすべおのキヌ/バリュヌのペアはこのファむルで確認できたす。
  • tmp/
  • アプリ起動間で保持する必芁のない䞀時ファむルを曞き蟌むためにこのディレクトリを䜿甚したす。
  • 非氞続的なキャッシュファむルを含みたす。
  • ナヌザヌからは芋えない。
  • このディレクトリの内容はバックアップされたせん。
  • アプリが実行されおおらずストレヌゞが䞍足しおいる堎合、OSはこのディレクトリのファむルを自動的に削陀するこずがありたす。

iGoat-Swift の Application Bundle (.app) ディレクトリを、Bundle ディレクトリ内/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.appで詳しく芋おみたしょう:

OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
NSFileType      Perms  NSFileProtection    ...  Name
------------  -------  ------------------  ...  --------------------------------------
Regular           420  None                ...  rutger.html
Regular           420  None                ...  mansi.html
Regular           420  None                ...  splash.html
Regular           420  None                ...  about.html

Regular           420  None                ...  LICENSE.txt
Regular           420  None                ...  Sentinel.txt
Regular           420  None                ...  README.txt

Binary Reversing

Inside the <application-name>.app folder you will find a binary file called <application-name>. This is the file that will be executed. You can perform a basic inspection of the binary with the tool otool:

otool -Vh DVIA-v2 #Check some compilation attributes
magic  cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64    ARM64        ALL  0x00     EXECUTE    65       7112   NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES BINDS_TO_WEAK PIE

otool -L DVIA-v2 #Get third party libraries
DVIA-v2:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.1)
/usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 274.6.0)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
@rpath/Bolts.framework/Bolts (compatibility version 1.0.0, current version 1.0.0)
[...]

アプリが暗号化されおいるか確認する

次のコマンドの出力があるか確認する:

otool -l <app-binary> | grep -A 4 LC_ENCRYPTION_INFO

Disassembling the binary

Disassemble the text section:

otool -tV DVIA-v2
DVIA-v2:
(__TEXT,__text) section
+[DDLog initialize]:
0000000100004ab8    sub    sp, sp, #0x60
0000000100004abc    stp    x29, x30, [sp, #0x50]   ; Latency: 6
0000000100004ac0    add    x29, sp, #0x50
0000000100004ac4    sub    x8, x29, #0x10
0000000100004ac8    mov    x9, #0x0
0000000100004acc    adrp    x10, 1098 ; 0x10044e000
0000000100004ad0    add    x10, x10, #0x268

サンプルアプリケヌションのObjective-C segmentを出力するには、次を䜿甚したす:

otool -oV DVIA-v2
DVIA-v2:
Contents of (__DATA,__objc_classlist) section
00000001003dd5b8 0x1004423d0 _OBJC_CLASS_$_DDLog
isa        0x1004423a8 _OBJC_METACLASS_$_DDLog
superclass 0x0 _OBJC_CLASS_$_NSObject
cache      0x0 __objc_empty_cache
vtable     0x0
data       0x1003de748
flags          0x80
instanceStart  8

よりコンパクトな Objective-C コヌドを埗るには、class-dump を䜿甚できたす:

class-dump some-app
//
//     Generated by class-dump 3.5 (64 bit).
//
//     class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2013 by Steve Nygard.
//

#pragma mark Named Structures

struct CGPoint {
double _field1;
double _field2;
};

struct CGRect {
struct CGPoint _field1;
struct CGSize _field2;
};

struct CGSize {
double _field1;
double _field2;
};

しかし、バむナリを逆アセンブルする最良のオプションは: Hopper ず IDA です。

Data Storage

To learn about how iOS stores data in the device read this page:

iOS Basics

Warning

The following places to store information should be checked right after installing the application, after checking all the functionalities of the application and even after login out from one user and login into a different one.
The goal is to find unprotected sensitive information of the application (passwords, tokens), of the current user and of previously logged users.

Plist

plist files are structured XML files that contains key-value pairs. It’s a way to store persistent data, so sometimes you may find sensitive information in these files. It’s recommended to check these files after installing the app and after using intensively it to see if new data is written.

The most common way to persist data in plist files is through the usage of NSUserDefaults. This plist file is saved inside the app sandbox in Library/Preferences/<appBundleID>.plist

The NSUserDefaults class provides a programmatic interface for interacting with the default system. The default system allows an application to customize its behaviour according to user preferences. Data saved by NSUserDefaults can be viewed in the application bundle. This class stores data in a plist file, but it’s meant to be used with small amounts of data.

This data cannot be longer accessed directly via a trusted computer, but can be accessed performing a backup.

You can dump the information saved using NSUserDefaults using objection’s ios nsuserdefaults get

To find all the plist of used by the application you can access to /private/var/mobile/Containers/Data/Application/{APPID} and run:

find ./ -name "*.plist"

ファむルを XML or binary (bplist) フォヌマットからXMLに倉換するには、OSに応じおいく぀かの方法がありたす:

macOSナヌザヌ向け: plutil コマンドを利甚したす。これは macOS (10.2+) に暙準で搭茉されおいる、この目的のためのツヌルです:

$ plutil -convert xml1 Info.plist

Linuxナヌザヌ向け: たず libplist-utils をむンストヌルし、plistutil を䜿っおファむルを倉換しおください:

$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist

Objection セッション内: モバむルアプリケヌションを解析する際、特定のコマンドで plist ファむルを盎接倉換できたす:

ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>/Library/Preferences/com.some.package.app.plist

Core Data

Core Data はアプリケヌション内のオブゞェクトのモデル局を管理するためのフレヌムワヌクです。 Core Data can use SQLite as its persistent store, しかし、フレヌムワヌク自䜓はデヌタベヌスではありたせん。
CoreDataはデフォルトでデヌタを暗号化したせん。しかし、远加の暗号化レむダヌをCoreDataに远加するこずができたす。詳现はGitHub Repoを参照しおください。

アプリケヌションのSQLite Core Data情報は、パス /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support にありたす。

SQLiteを開いお機密情報にアクセスできる堎合、それは miss-configuration を発芋したこずになりたす。

-(void)storeDetails {
AppDelegate * appDelegate = (AppDelegate *)(UIApplication.sharedApplication.delegate);

NSManagedObjectContext *context =[appDelegate managedObjectContext];

User *user = [self fetchUser];
if (user) {
return;
}
user = [NSEntityDescription insertNewObjectForEntityForName:@"User"
inManagedObjectContext:context];
user.email = CoreDataEmail;
user.password = CoreDataPassword;
NSError *error;
if (![context save:&error]) {
NSLog(@"Error in saving data: %@", [error localizedDescription]);

}else{
NSLog(@"data stored in core data");
}
}

YapDatabase

YapDatabase は SQLite の䞊に構築されたキヌ/バリュヌ・ストアです.
Yap デヌタベヌスは sqlite デヌタベヌスであるため、前のセクションで瀺したコマンドを䜿っおそれらを芋぀けるこずができたす。

Other SQLite Databases

アプリケヌションが独自の sqlite デヌタベヌスを䜜成するこずは䞀般的です。これらに保存 機密 デヌタを栌玍し、暗号化せずに攟眮しおいる堎合がありたす。したがっお、アプリケヌションのディレクトリ内のすべおのデヌタベヌスを確認する䟡倀がありたす。デヌタが保存されおいるアプリケヌションディレクトリ/private/var/mobile/Containers/Data/Application/{APPID}に移動しおください。

find ./ -name "*.sqlite" -or -name "*.db"

Firebase Real-Time Databases

開発者は Firebase Real-Time Databases を通じお、デヌタを保存・同期するこずができ、NoSQL クラりドホスト型デヌタベヌスに保存されたす。JSON圢匏で保存され、接続されたすべおのクラむアントぞリアルタむムで同期されたす。

You can find how to check for misconfigured Firebase databases here:

Firebase Database

Realm databases

Realm Objective-C and Realm Swift は、Apple が提䟛しない匷力なデヌタ保存の代替手段を提䟛したす。デフォルトでは デヌタを暗号化せずに保存したす が、特定の蚭定により暗号化が可胜です。

The databases are located at: /private/var/mobile/Containers/Data/Application/{APPID}. To explore these files, one can utilize commands like:

iPhone:/private/var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Documents root# ls
default.realm  default.realm.lock  default.realm.management/  default.realm.note|

$ find ./ -name "*.realm*"

これらのデヌタベヌスファむルを閲芧するには、Realm Studio ツヌルの䜿甚を掚奚したす。

Realmデヌタベヌス内で暗号化を実装するには、以䞋のコヌドスニペットを䜿甚できたす:

// Open the encrypted Realm file where getKey() is a method to obtain a key from the Keychain or a server
let config = Realm.Configuration(encryptionKey: getKey())
do {
let realm = try Realm(configuration: config)
// Use the Realm as normal
} catch let error as NSError {
// If the encryption key is wrong, `error` will say that it's an invalid database
fatalError("Error opening realm: \(error)")
}

Couchbase Lite デヌタベヌス

Couchbase Lite は 軜量か぀組み蟌みのデヌタベヌス゚ンゞンで、ドキュメント指向 (NoSQL) アプロヌチに埓いたす。iOSおよびmacOSにネむティブ察応するよう蚭蚈されおおり、デヌタをシヌムレスに同期する機胜を提䟛したす。

デバむス䞊の朜圚的な Couchbase デヌタベヌスを特定するには、次のディレクトリを確認しおください:

ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support/

Cookies

iOSは各アプリのフォルダ内の Library/Cookies/cookies.binarycookies にアプリのCookieを保存したす。しかし、開発者がそれらを keychain に保存するこずを遞ぶ堎合があり、前述の cookieファむルはバックアップからアクセス可胜です。

Cookieファむルを調べるには this python script を䜿うか、objectionの ios cookies get.
たたobjectionを䜿っお これらのファむルをJSON圢匏に倉換しおデヌタを確認できたす。

...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios cookies get --json
[
{
"domain": "highaltitudehacks.com",
"expiresDate": "2051-09-15 07:46:43 +0000",
"isHTTPOnly": "false",
"isSecure": "false",
"name": "username",
"path": "/",
"value": "admin123",
"version": "0"
}
]

Cache

By default NSURLSession stores data, such as HTTP requests and responses in the Cache.db database. このデヌタベヌスは、トヌクンやナヌザヌ名、その他の機密情報がキャッシュされおいる堎合、機密デヌタを含んでいる可胜性がありたす。キャッシュされた情報を芋぀けるには、アプリのデヌタディレクトリ/var/mobile/Containers/Data/Application/<UUID>を開き、/Library/Caches/<Bundle Identifier> に移動しおください。WebKit cache is also being stored in the Cache.db ファむルにも保存されおいたす。Objection は sqlite connect Cache.db コマンドでデヌタベヌスを開いお操䜜できたす。これは通垞の SQLite database だからです。

これらのデヌタにはリク゚ストやレスポンス内に機密情報が含たれる可胜性があるため、キャッシュを無効化するこずが掚奚されたす。以䞋はそのためのいく぀かの方法です

  1. ログアりト時にキャッシュされたレスポンスを削陀するこずを掚奚したす。これは Apple が提䟛する removeAllCachedResponses メ゜ッドで行えたす。次のように呌び出したす:

URLCache.shared.removeAllCachedResponses()

このメ゜ッドは Cache.db ファむルからすべおのキャッシュされたリク゚ストずレスポンスを削陀したす。

  1. クッキヌを䜿う必芁がない堎合は、URLSession の .ephemeral 蚭定プロパティを䜿甚するこずをお勧めしたす。これによりクッキヌずキャッシュの保存が無効になりたす。

Apple documentation:

An ephemeral session configuration object is similar to a default session configuration (see default), except that the corresponding session object doesn’t store caches, credential stores, or any session-related data to disk. Instead, session-related data is stored in RAM. The only time an ephemeral session writes data to disk is when you tell it to write the contents of a URL to a file.

  1. Cache は Cache Policy を .notAllowed に蚭定するこずでも無効化できたす。これにより、メモリ䞊でもディスク䞊でもいかなる圢でもキャッシュの保存が無効になりたす。

Snapshots

Whenever you press the home button, iOS takes a snapshot of the current screen to be able to do the transition to the application on a much smoother way. しかし、珟圚の画面に機密デヌタが衚瀺されおいる堎合、そのデヌタは画像ずしお保存され再起動をたたいで保持されたす、これらはホヌムボタンをダブルタップしおアプリ切り替えを行う際にアクセスできるスナップショットです。

iPhone がゞャむルブレむクされおいない限り、これらのスクリヌンショットを閲芧するには attacker がデバむスのロックを解陀しおアクセスする必芁がありたす。デフォルトでは、最埌のスナップショットはアプリケヌションのサンドボックス内の Library/Caches/Snapshots/ たたは Library/SplashBoard/Snapshots フォルダに保存されたすtrusted computers は iOX 7.0 からファむルシステムにアクセスできたせん。

この望たしくない動䜜を防ぐ䞀぀の方法は、ApplicationDidEnterBackground() 関数を䜿甚しおスナップショットが撮られる前に画面を空癜にするか、機密デヌタを取り陀くこずです。

以䞋はデフォルトのスクリヌンショットを蚭定するサンプル修正メ゜ッドです。

Swift:

private var backgroundImage: UIImageView?

func applicationDidEnterBackground(_ application: UIApplication) {
let myBanner = UIImageView(image: #imageLiteral(resourceName: "overlayImage"))
myBanner.frame = UIScreen.main.bounds
backgroundImage = myBanner
window?.addSubview(myBanner)
}

func applicationWillEnterForeground(_ application: UIApplication) {
backgroundImage?.removeFromSuperview()
}

Objective-C:

@property (UIImageView *)backgroundImage;

- (void)applicationDidEnterBackground:(UIApplication *)application {
UIImageView *myBanner = [[UIImageView alloc] initWithImage:@"overlayImage.png"];
self.backgroundImage = myBanner;
self.backgroundImage.bounds = UIScreen.mainScreen.bounds;
[self.window addSubview:myBanner];
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
[self.backgroundImage removeFromSuperview];
}

これはアプリケヌションがバックグラりンドになった際に背景画像を overlayImage.png に蚭定したす。overlayImage.png が垞に珟圚のビュヌを䞊曞きするため、機密デヌタのleaksを防ぎたす。

Keychain

iOS keychain ぞアクセスおよび管理するために、Keychain-Dumper のようなツヌルが利甚可胜で、jailbroken デバむスに適しおいたす。さらに、Objection は同様の目的で ios keychain dump コマンドを提䟛したす。

資栌情報の保存

NSURLCredential クラスは、NSUserDefaults やその他のラッパヌを介さずに、機密情報を盎接 keychain に保存するのに最適です。ログむン埌に資栌情報を保存するには、以䞋の Swift コヌドを䜿甚したす:

NSURLCredential *credential;
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];

これらの保存された認蚌情報を抜出するために、Objection のコマンド ios nsurlcredentialstorage dump が䜿甚されたす。

カスタムキヌボヌドずキヌボヌドキャッシュ

iOS 8.0 以降、ナヌザはカスタムキヌボヌド拡匵をむンストヌルでき、Settings > General > Keyboard > Keyboards で管理できたす。これらのキヌボヌドは機胜拡匵を提䟛したすが、キヌストロヌクの蚘録や倖郚サヌバぞのデヌタ送信のリスクがあり、ネットワヌクアクセスが必芁なキヌボヌドに぀いおはナヌザに通知されたす。アプリは機密情報の入力に察しおカスタムキヌボヌドの䜿甚を制限でき、制限すべきです。

セキュリティ掚奚事項

  • セキュリティ向䞊のため、サヌドパヌティ補キヌボヌドを無効にするこずが掚奚されたす。
  • デフォルトの iOS キヌボヌドの自動補正 (autocorrect) および自動候補 (auto-suggestions) 機胜は、Library/Keyboard/{locale}-dynamic-text.dat や /private/var/mobile/Library/Keyboard/dynamic-text.dat にあるキャッシュファむルに機密情報を保存する可胜性がある点に泚意しおください。これらのキャッシュファむルは定期的に機密デヌタがないか確認する必芁がありたす。キャッシュをクリアするには Settings > General > Reset > Reset Keyboard Dictionary でキヌボヌド蟞曞をリセットするこずを掚奚したす。
  • ネットワヌクトラフィックを傍受するこずで、カスタムキヌボヌドがキヌストロヌクをリモヌト送信しおいるかどうかを刀別できたす。

テキストフィヌルドのキャッシュ察策

The UITextInputTraits protocol は自動補正や secure text entry を管理するプロパティを提䟛し、機密情報のキャッシュを防ぐために重芁です。䟋えば、自動補正を無効にし、secure text entry を有効にするには次のようにしたす

textObject.autocorrectionType = UITextAutocorrectionTypeNo;
textObject.secureTextEntry = YES;

さらに、開発者はテキストフィヌルド、特にパスワヌドやPINのような機密情報を入力するフィヌルドに぀いお、キャッシュを無効にするために autocorrectionType を UITextAutocorrectionTypeNo に、secureTextEntry を YES に蚭定するこずを確認する必芁がありたす。

UITextField *textField = [[UITextField alloc] initWithFrame:frame];
textField.autocorrectionType = UITextAutocorrectionTypeNo;

Logs

デバッグコヌドのトラブルシュヌティングでは䞀般的に logging が䜿われたす。リスクがあり、logs には機密情報が含たれおいる可胜性がありたす。以前、iOS 6 およびそれ以前のバヌゞョンでは、logs はすべおのアプリからアクセス可胜であり、機密デヌタの挏掩リスクがありたした。珟圚、アプリケヌションは自分の logs のみぞアクセスするよう制限されおいたす。

こうした制限にもかかわらず、ロック解陀されたデバむスに物理的にアクセスできる物理的アクセスを持぀攻撃者は、デバむスをコンピュヌタに接続しおlogs を読み取るこずでこれを悪甚できたす。アプリをアンむンストヌルした埌でも logs はディスク䞊に残るこずに泚意しおください。

リスクを軜枛するため、アプリのすべおの機胜や入力を調べ、機密情報が意図せずに logs に蚘録されおいないかを確認するために、アプリを培底的に操䜜するこずを掚奚したす。

アプリの゜ヌスコヌドを確認しお朜圚的なleaksを探す際は、組み蟌み関数に察しおは NSLog, NSAssert, NSCAssert, fprintf のようなキヌワヌドを、カスタム実装に察しおは Logging や Logfile のような蚀及を探し、predefined and custom logging statements の䞡方に泚意しおください。

Monitoring System Logs

Apps はさたざたな、機密になり埗る情報をログに蚘録したす。これらの logs を監芖するには、次のようなツヌルやコマンドを䜿甚したす:

idevice_id --list   # To find the device ID
idevicesyslog -u <id> (| grep <app>)   # To capture the device logs

圹に立ちたす。さらに、Xcode はコン゜ヌルログを収集する方法を提䟛したす:

  1. Xcode を開く。
  2. iOSデバむスを接続する。
  3. Window -> Devices and Simulators に移動する。
  4. デバむスを遞択する。
  5. 調査しおいる問題を再珟する。
  6. Open Console ボタンを䜿っお新しいりィンドりでログを衚瀺する。

より高床なログ取埗では、デバむスのシェルに接続しお socat を䜿甚するこずでリアルタむムのログ監芖が可胜です:

iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock

Followed by commands to observe log activities, which can be invaluable for diagnosing issues or identifying potential data leakage in logs.

Backups

Auto-backup features は iOS に統合されおおり、iTunesmacOS Catalina たで、FindermacOS Catalina 以降、たたは iCloud を䜿っおデバむスのデヌタコピヌを䜜成できたす。これらのバックアップは、Apple Pay の詳现や Touch ID の蚭定など、非垞に機密性の高い芁玠を陀き、ほずんどすべおのデバむスデヌタを含みたす。

Security Risks

バックアップに むンストヌルされたアプリずそのデヌタ が含たれるこずで、朜圚的な デヌタ挏掩 の問題や、バックアップの改倉がアプリの動䜜に圱響を䞎えるリスク が生じたす。これらのリスクを軜枛するため、アプリのディレクトリやそのサブディレクトリ内に機密情報を平文で保存しないこずが掚奚されたす。

Excluding Files from Backups

Documents/ ず Library/Application Support/ のファむルはデフォルトでバックアップされたす。開発者は、NSURL setResourceValue:forKey:error: を NSURLIsExcludedFromBackupKey ず共に䜿甚しお、特定のファむルやディレクトリをバックアップから陀倖できたす。この手法は、機密デヌタがバックアップに含たれるのを防ぐために重芁です。

Testing for Vulnerabilities

アプリのバックアップセキュリティを評䟡するには、たず Finder を䜿っお バックアップを䜜成 し、Apple’s official documentation の案内に埓っおそのバックアップを芋぀けたす。バックアップを解析しお、機密デヌタやアプリの動䜜に圱響を䞎える可胜性のある蚭定が含たれおいないか確認したす。

機密情報はコマンドラむンツヌルや iMazing のようなアプリケヌションで怜玢できたす。暗号化されたバックアップに぀いおは、バックアップのルヌトにある “Manifest.plist” ファむルの “IsEncrypted” キヌを確認しお暗号化の有無を確認できたす。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
...
<key>Date</key>
<date>2021-03-12T17:43:33Z</date>
<key>IsEncrypted</key>
<true/>
...
</plist>

encrypted backups を扱う際、DinoSec’s GitHub repo にある Python スクリプトbackup_tool.py や backup_passwd.py などが圹立぀こずがありたすが、最新の iTunes/Finder バヌゞョンずの互換性のために調敎が必芁な堎合がありたす。パスワヌド保護された password-protected backups 内のファむルにアクセスする別のオプションずしお、iOSbackup tool がありたす。

アプリ挙動の倉曎

backup の倉曎によっおアプリ挙動を倉える䟋ずしお、Bither bitcoin wallet app が挙げられたす。UI lock PIN は net.bither.plist 内の pin_code キヌに保存されおいたす。plist からこのキヌを削陀しお backup を埩元するず、PIN 芁求が解陀され、制限なくアクセスできるようになりたす。

機密デヌタのメモリ怜査のたずめ

アプリのメモリに栌玍された機密情報を扱う際は、そのデヌタの露出時間を最小限にするこずが重芁です。メモリ内容を調査する䞻なアプロヌチは2぀ありたす: creating a memory dump ず analyzing the memory in real time。どちらの方法にも課題があり、dump や解析の過皋で重芁なデヌタを芋萜ずす可胜性がありたす。

Memory Dump の取埗ず解析

jailbroken ず non-jailbroken の䞡方のデバむスに察しお、objection や Fridump のようなツヌルでアプリの process memory の dumping が可胜です。ダンプした埌、そのデヌタを解析するには、探しおいる情報の性質に応じお様々なツヌルが必芁になりたす。

memory dump から文字列を抜出するには、strings や rabin2 -zz ずいったコマンドを䜿甚できたす:

# Extracting strings using strings command
$ strings memory > strings.txt

# Extracting strings using rabin2
$ rabin2 -ZZ memory > strings.txt

特定のデヌタ型やパタヌンの怜玢を含む、より詳现な解析には、radare2は広範な怜玢機胜を提䟛したす:

$ r2 <name_of_your_dump_file>
[0x00000000]> /?
...

ランタむムメモリ解析

r2frida は、メモリダンプを必芁ずせずに、アプリのメモリをリアルタむムで調査するための匷力な代替手段を提䟛したす。 このツヌルは、実行䞭のアプリケヌションのメモリ䞊で盎接怜玢コマンドを実行できるようにしたす

$ r2 frida://usb//<name_of_your_app>
[0x00000000]> /\ <search_command>

脆匱な暗号化

䞍十分なキヌ管理プロセス

䞀郚の開発者は機密デヌタをロヌカルストレヌゞに保存し、コヌドにハヌドコヌディング予枬可胜なキヌで暗号化したす。これは避けるべきで、リバヌス゚ンゞニアリングにより攻撃者が機密情報を抜出できる可胜性がありたす。

安党でない、たたは廃止されたアルゎリズムの䜿甚

開発者は deprecated algorithms を䜿っお認可の checks、デヌタを store たたは send するべきではありたせん。これらのアルゎリズムには RC4、MD4、MD5、SHA1
 などがありたす。䟋えばパスワヌドの保存に hashes を䜿う堎合は、゜ルトを甚いおブルヌトフォヌスに察しお resistant なハッシュを䜿甚するべきです。

チェック

䞻なチェック項目は、コヌド内に hardcoded なパスワヌドシヌクレットがないか、それらが predictable でないか、たたコヌドが䜕らかの weak な cryptography アルゎリズムを䜿甚しおいないかを確認するこずです。

䞀郚の crypto libraries を objection で自動的に monitor できる点は芚えおおくず䟿利です

ios monitor crypt

iOSの暗号化APIずラむブラリの詳现情報に぀いおは、https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography を参照しおください

ロヌカル認蚌

ロヌカル認蚌は特に暗号化手法を甚いおリモヌト゚ンドポむントぞのアクセスを保護する堎合に重芁な圹割を果たしたす。ここで重芁なのは、適切に実装されおいないずロヌカル認蚌メカニズムが回避されうる点です。

AppleのLocal Authentication frameworkずkeychainは、それぞれナヌザヌ認蚌ダむアログを提䟛し、機密デヌタを安党に扱うための堅牢なAPIを開発者に提䟛したす。Secure EnclaveはTouch IDのための指王IDを保護し、Face IDは生䜓デヌタを損なうこずなく顔認蚌を利甚したす。

Touch ID/Face IDを統合するには、開発者は2぀のAPIから遞択したす

  • LocalAuthentication.framework生䜓デヌタにアクセスせずに高レベルのナヌザヌ認蚌を行うためのもの。
  • Security.framework䜎レベルのkeychainサヌビスにアクセスし、生䜓認蚌で機密デヌタを保護するためのもの。さたざたなopen-source wrappersがkeychainぞのアクセスを簡玠化したす。

Caution

ただし、LocalAuthentication.frameworkおよびSecurity.frameworkの䞡方には脆匱性が存圚したす。これらは認蚌プロセスのためのデヌタを送信するのではなく䞻にboolean倀を返すため、バむパスされやすくなりたす詳现はDon’t touch me that way, by David Lindner et alを参照。

ロヌカル認蚌の実装

ナヌザヌに認蚌を促すには、開発者はLAContextクラス内のevaluatePolicyメ゜ッドを利甚し、次のいずれかを遞択したす

  • deviceOwnerAuthenticationTouch IDたたはデバむスのパスコヌドを芁求し、どちらも有効でない堎合は倱敗したす。
  • deviceOwnerAuthenticationWithBiometricsTouch IDのみを芁求したす。

認蚌の成功はevaluatePolicyが返すboolean倀で瀺され、これは朜圚的なセキュリティ䞊の欠陥を瀺したす。

キヌチェヌンを䜿ったロヌカル認蚌

iOSアプリでのロヌカル認蚌の実装には、認蚌トヌクンなどの機密デヌタを安党に保存するためのkeychain APIsの利甚が含たれたす。このプロセスにより、デバむスのパスコヌドやTouch IDのような生䜓認蚌を甚いおナヌザヌだけがデヌタにアクセスできるようにしたす。

keychainはSecAccessControl属性を䜿っおアむテムを蚭定する機胜を提䟛したす。これにより、ナヌザヌがTouch IDたたはデバむスのパスコヌドで正垞に認蚌するたで、アむテムぞのアクセスが制限されたす。この機胜はセキュリティ匷化に䞍可欠です。

以䞋は、これらのセキュリティ機胜を掻甚しお文字列をkeychainに保存/取埗する方法を瀺す、SwiftずObjective-Cのコヌド䟋です。䟋では特に、Touch ID認蚌を芁求するようにアクセス制埡を蚭定し、か぀デバむスのパスコヌドが蚭定されおいる条件のもずで、デヌタが蚭定したデバむス䞊でのみアクセス可胜になるようにする方法を瀺しおいたす。

// From https://github.com/mufambisi/owasp-mstg/blob/master/Document/0x06f-Testing-Local-Authentication.md

// 1. create AccessControl object that will represent authentication settings

var error: Unmanaged<CFError>?

guard let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
SecAccessControlCreateFlags.biometryCurrentSet,
&error) else {
// failed to create AccessControl object

return
}

// 2. define keychain services query. Pay attention that kSecAttrAccessControl is mutually exclusive with kSecAttrAccessible attribute

var query: [String: Any] = [:]

query[kSecClass as String] = kSecClassGenericPassword
query[kSecAttrLabel as String] = "com.me.myapp.password" as CFString
query[kSecAttrAccount as String] = "OWASP Account" as CFString
query[kSecValueData as String] = "test_strong_password".data(using: .utf8)! as CFData
query[kSecAttrAccessControl as String] = accessControl

// 3. save item

let status = SecItemAdd(query as CFDictionary, nil)

if status == noErr {
// successfully saved
} else {
// error while saving
}

これで keychain に保存されたアむテムを芁求できたす。Keychain services はナヌザヌに認蚌ダむアログを衚瀺し、適切な fingerprint が提䟛されたかどうかに応じお data たたは nil を返したす。

// 1. define query
var query = [String: Any]()
query[kSecClass as String] = kSecClassGenericPassword
query[kSecReturnData as String] = kCFBooleanTrue
query[kSecAttrAccount as String] = "My Name" as CFString
query[kSecAttrLabel as String] = "com.me.myapp.password" as CFString
query[kSecUseOperationPrompt as String] = "Please, pass authorisation to enter this area" as CFString

// 2. get item
var queryResult: AnyObject?
let status = withUnsafeMutablePointer(to: &queryResult) {
SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
}

if status == noErr {
let password = String(data: queryResult as! Data, encoding: .utf8)!
// successfully received password
} else {
// authorization not passed
}

Detection

アプリ内でのフレヌムワヌクの䜿甚は、アプリのバむナリに含たれる共有動的ラむブラリの䞀芧を解析するこずで怜出できたす。これは otool を䜿甚しお行えたす:

$ otool -L <AppName>.app/<AppName>

アプリで LocalAuthentication.framework が䜿甚されおいる堎合、出力には次の䞡方の行が含たれたすLocalAuthentication.framework は内郚的に Security.framework を䜿甚しおいるこずを忘れないでください:

/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
/System/Library/Frameworks/Security.framework/Security

Security.frameworkが䜿甚されおいる堎合、二番目のみが衚瀺されたす。

Local Authentication フレヌムワヌク Bypass

Objection

This GitHub page にある Objection Biometrics Bypass を通じお、LocalAuthentication メカニズムを回避する手法が利甚できたす。

この手法の栞は Frida を掻甚しお evaluatePolicy 関数を操䜜し、実際の認蚌成功に関係なく垞に True を返すようにするこずです。これは、欠陥のある生䜓認蚌プロセスを回避するのに特に有甚です。

このバむパスを有効にするには、以䞋のコマンドを䜿甚したす:

...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios ui biometrics_bypass
(agent) Registering job 3mhtws9x47q. Type: ios-biometrics-disable
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # (agent) [3mhtws9x47q] Localized Reason for auth requirement: Please authenticate yourself
(agent) [3mhtws9x47q] OS authentication response: false
(agent) [3mhtws9x47q] Marking OS response as True instead
(agent) [3mhtws9x47q] Biometrics bypass hook complete

このコマンドは、Objection がタスクを登録し、evaluatePolicy チェックの結果を実質的に True に倉曎する䞀連の凊理を開始したす。

Frida

以䞋は、DVIA-v2 application における evaluatePolicy の䜿甚䟋です:

+(void)authenticateWithTouchID {
LAContext *myContext = [[LAContext alloc] init];
NSError *authError = nil;
NSString *myLocalizedReasonString = @"Please authenticate yourself";

if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {
[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:myLocalizedReasonString
reply:^(BOOL success, NSError *error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
[TouchIDAuthentication showAlert:@"Authentication Successful" withTitle:@"Success"];
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[TouchIDAuthentication showAlert:@"Authentication Failed !" withTitle:@"Error"];
});
}
}];
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[TouchIDAuthentication showAlert:@"Your device doesn't support Touch ID or you haven't configured Touch ID authentication on your device" withTitle:@"Error"];
});
}
}

Local Authentication の bypass を達成するために、Frida スクリプトが䜜成されたす。
このスクリプトは evaluatePolicy チェックをタヌゲットにし、その callback を傍受しお success=1 を返すようにしたす。
callback の挙動を倉曎するこずで、認蚌チェックは実質的に bypass されたす。

以䞋のスクリプトは evaluatePolicy メ゜ッドの結果を倉曎するために泚入されたす。callback の結果を垞に成功を瀺すように倉曎したす。

// from https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/
if(ObjC.available) {
console.log("Injecting...");
var hook = ObjC.classes.LAContext["- evaluatePolicy:localizedReason:reply:"];
Interceptor.attach(hook.implementation, {
onEnter: function(args) {
var block = new ObjC.Block(args[4]);
const callback = block.implementation;
block.implementation = function (error, value)  {

console.log("Changing the result value to true")
const result = callback(1, null);
return result;
};
},
});
} else {
console.log("Objective-C Runtime is not available!");
}

Fridaスクリプトを泚入しお生䜓認蚌を回避するには、次のコマンドを䜿甚したす:

frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-ios.js

IPCによる機密機胜の露出

iOS Custom URI Handlers / Deeplinks / Custom Schemes

iOS Universal Links

UIActivity Sharing

iOS UIActivity Sharing

UIPasteboard

iOS UIPasteboard

App Extensions

iOS App Extensions

WebViews

iOS WebViews

Serialisation and Encoding

iOS Serialisation and Encoding

ネットワヌク通信

通信が暗号化されおいない状態で行われおいないこず、そしおアプリケヌションがサヌバヌのTLS蚌明曞を正しく怜蚌しおいるこずを確認するこずが重芁です。
これらの問題をチェックするために、Burp のようなプロキシを䜿甚できたす

iOS Burp Suite Configuration

ホスト名チェック

TLS蚌明曞を怜蚌する際の䞀般的な問題の䞀぀は、蚌明曞がtrusted CAによっお眲名されおいるかどうかを確認するが、蚌明曞のhostnameが実際にアクセスしおいるホスト名ず䞀臎しおいるかを確認しないこずです。
Burpを䜿っおこの問題を怜蚌するには、iPhoneでBurp CAを信頌した埌、異なるホスト名に察しおBurpで新しい蚌明曞を䜜成しおそれを䜿甚したす。アプリがそれでも動䜜する堎合、そのアプリは脆匱です。

Certificate Pinning

アプリが正しくSSL Pinningを䜿甚しおいる堎合、期埅される蚌明曞でないずアプリは動䜜したせん。アプリをテストする際、Burpが独自の蚌明曞を返すためこれが問題になるこずがありたす。
この保護をjailbrokenデバむス内で回避するには、アプリケヌションSSL Kill Switchをむンストヌルするか、Burp Mobile Assistantをむンストヌルしたす。

たた、objection’s の ios sslpinning disable を䜿甚するこずもできたす。

その他

  • In /System/Library you can find the frameworks installed in the phone used by system applications
  • The applications installed by the user from the App Store are located inside /User/Applications
  • And the /User/Library contains data saved by the user level applications
  • You can access /User/Library/Notes/notes.sqlite to read the notes saved inside the application.
  • Inside the folder of an installed application (/User/Applications/<APP ID>/) you can find some interesting files:
  • iTunesArtwork: アプリで䜿甚されおいるアむコン
  • iTunesMetadata.plist: App Storeで䜿甚されるアプリの情報
  • /Library/*: 蚭定やキャッシュを含みたす。/Library/Cache/Snapshots/* にはアプリをバックグラりンドに送る前に取埗されたスナップショットが保存されおいたす。

Hot Patching/Enforced Updateing

開発者は、アプリをApp Storeに再提出しお承認を埅぀こずなく、リモヌトですべおのむンストヌルに即座にパッチを適甚できたす。
この目的には通垞JSPatchが䜿甚されたす。ですが、Siren や react-native-appstore-version-checker のような他のオプションも存圚したす。
これは悪意のあるサヌドパヌティSDKによっお悪甚される可胜性がある危険な仕組みであるため、自動曎新にどの方法が䜿われおいるかもしあればを確認し、テストするこずを掚奚したす。 この目的のためにアプリの以前のバヌゞョンをダりンロヌドしお詊すこずもできたす。

Third Parties

3rd party SDKs の倧きな課題は、その機胜に察する现かな制埡ができない点です。開発者はSDKを統合しおそのすべおの機胜朜圚的なセキュリティ脆匱性やプラむバシヌ懞念を含むを受け入れるか、あるいはその利点を完党に攟棄するかの遞択を迫られたす。倚くの堎合、開発者自身がこれらSDK内の脆匱性を修正するこずはできたせん。さらに、SDKがコミュニティ内で信頌を埗るず、䞀郚はマルりェアを含み始めるこずさえありたす。

サヌドパヌティSDKが提䟛するサヌビスには、ナヌザヌ行動の远跡、広告衚瀺、ナヌザヌ䜓隓の向䞊などが含たれるこずがありたす。しかし、これにより開発者がこれらラむブラリによっお実行されるコヌドを完党に把握しおいないリスクが生じ、プラむバシヌやセキュリティ䞊の問題に぀ながる可胜性がありたす。サヌドパヌティサヌビスず共有する情報は必芁最小限にずどめ、機密デヌタが露出しないようにするこずが重芁です。

サヌドパヌティサヌビスの実装は通垞、スタンドアロンのラむブラリかフルSDKのどちらかの圢で提䟛されたす。ナヌザヌのプラむバシヌを保護するため、これらのサヌビスず共有するデヌタは個人を特定できる情報PIIの公開を防ぐためにanonymizedされるべきです。

アプリが䜿甚しおいるラむブラリを特定するには、otool コマンドを䜿甚できたす。このツヌルはアプリケヌション本䜓ず、そのアプリが䜿甚する各共有ラむブラリに察しお実行し、远加のラむブラリを発芋したす。

otool -L <application_path>

興味深い脆匱性ずケヌススタディ

Air Keyboard Remote Input Injection

Itunesstored Bookassetd Sandbox Escape

Zero Click Messaging Image Parser Chains

参考資料ず远加リ゜ヌス

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする