
IOSSecuritySuite v2.3.0
Bibliothèque Swift de sécurité et d'anti-altération pour la plateforme iOS
⭐️ Voulez-vous devenir un ingénieur certifié en sécurité des applications iOS ? ⭐️
Découvrez notre cours pratique et entièrement en ligne sur : https://courses.securing.pl/courses/iase

Description d'ISS

par @_r3ggi
🌏 iOS Security Suite est une bibliothèque de sécurité de plateforme avancée et facile à utiliser, écrite en pure Swift ! Si vous développez pour iOS et que vous souhaitez protéger votre application selon la norme OWASP MASVS, chapitre v8, alors cette bibliothèque pourrait vous faire gagner beaucoup de temps. 🚀
Ce que ISS détecte :
- Jailbreak 🧨
- Débogueur attaché 👨🏻🚀
- Si une application a été exécutée dans un émulateur 👽
- Outils de rétro-ingénierie courants exécutés sur l'appareil 🔭
Configuration
Il y a 4 façons de commencer à utiliser IOSSecuritySuite
1. Ajouter la source
Ajoutez les fichiers IOSSecuritySuite/*.swift à votre projet
2. Configuration avec CocoaPods
pod 'IOSSecuritySuite'
3. Configuration avec Carthage
github "securing/IOSSecuritySuite"
4. Configuration avec Swift Package Manager
.package(url: "https://github.com/securing/IOSSecuritySuite.git", from: "1.5.0")
Mettre à jour Info.plist
Après avoir ajouté ISS à votre projet, vous devrez également mettre à jour votre Info.plist principal. Il y a une vérification dans le module de détection de jailbreak qui utilise la méthode canOpenURL(_:) et nécessite de spécifier les URL qui seront interrogées.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>undecimus</string>
<string>sileo</string>
<string>zbra</string>
<string>filza</string>
</array>
Tarifs
Consultez notre licence EULA pour les détails.
TLDR : Si votre entreprise emploie :
- 0-99 personnes - gratuit
- 100-1000 - 3k EUR/an
- 1000+ - 10k EUR/an
Si vous souhaitez vendre un module qui utilise iOS Security Suite (il n'est pas utilisé directement dans votre application) - 10k EUR/an
Avis
iOS Security Suite est destiné à être utilisé sur iOS/iPadOS. Il ne doit pas être utilisé sur les Mac avec Apple Silicon.
Comment utiliser
Module de détection de jailbreak
- La méthode la plus simple renvoie True/False si vous voulez simplement savoir si l'appareil est jailbreaké ou non
if IOSSecuritySuite.amIJailbroken() {
print("This device is jailbroken")
} else {
print("This device is not jailbroken")
}
- Verbeux, si vous voulez aussi savoir quels indicateurs ont été identifiés
let jailbreakStatus = IOSSecuritySuite.amIJailbrokenWithFailMessage()
if jailbreakStatus.jailbroken {
print("This device is jailbroken")
print("Because: \(jailbreakStatus.failMessage)")
} else {
print("This device is not jailbroken")
}
Le failMessage est une chaîne de caractères contenant des indicateurs séparés par des virgules, comme illustré dans l'exemple ci-dessous :
sileo:// URL scheme detected, Suspicious file exists: /Library/MobileSubstrate/MobileSubstrate.dylib, Fork was able to create a new process
- Verbeux et filtrable, si vous voulez par exemple identifier les appareils qui ont été jailbreakés dans le passé, mais qui sont maintenant non jailbreakés
let jailbreakStatus = IOSSecuritySuite.amIJailbrokenWithFailedChecks()
if jailbreakStatus.jailbroken {
if (jailbreakStatus.failedChecks.contains { $0.check == .existenceOfSuspiciousFiles }) && (jailbreakStatus.failedChecks.contains { $0.check == .suspiciousFilesCanBeOpened }) {
print("This is real jailbroken device")
}
}
Module de détection de débogueur
let amIDebugged: Bool = IOSSecuritySuite.amIDebugged()
Refuser le débogueur complètement
IOSSecuritySuite.denyDebugger()
Module de détection d'émulateur
let runInEmulator: Bool = IOSSecuritySuite.amIRunInEmulator()
Module de détection d'outils de rétro-ingénierie
- La méthode la plus simple renvoie True/False si vous voulez simplement savoir si l'appareil présente des preuves de rétro-ingénierie
if IOSSecuritySuite.amIReverseEngineered() {
print("This device has evidence of reverse engineering")
} else {
print("This device hasn't evidence of reverse engineering")
}
- Verbeux et filtrable, si vous voulez aussi la liste des vérifications effectuées
let reverseStatus = IOSSecuritySuite.amIReverseEngineeredWithFailedChecks()
if reverseStatus.reverseEngineered {
// check for reverseStatus.failedChecks for more details
}
Module de détection de proxy système
Vous pouvez maintenant aussi détecter si une application est connectée à un VPN
let amIProxied: Bool = IOSSecuritySuite.amIProxied(considerVPNConnectionAsProxy: true)
Module de détection du mode verrouillage
let amIInLockdownMode: Bool = IOSSecuritySuite.amIInLockdownMode()
Fonctionnalités expérimentales
Module de détection de hook d'exécution
let amIRuntimeHooked: Bool = amIRuntimeHook(dyldWhiteList: dylds, detectionClass: SomeClass.self, selector: #selector(SomeClass.someFunction), isClassMethod: false)
Module de refus de hook de symbole
// If we want to deny symbol hook of Swift function, we have to pass mangled name of that function
denySymbolHook("$s10Foundation5NSLogyySS_s7CVarArg_pdtF") // denying hooking for the NSLog function
NSLog("Hello Symbol Hook")
denySymbolHook("abort")
abort()
Module de détection MSHook
// Function declaration
func someFunction(takes: Int) -> Bool {
return false
}
// Defining FunctionType : @convention(thin) indicates a “thin” function reference, which uses the Swift calling convention with no special “self” or “context” parameters.
typealias FunctionType = @convention(thin) (Int) -> (Bool)
// Getting pointer address of function we want to verify
func getSwiftFunctionAddr(_ function: @escaping FunctionType) -> UnsafeMutableRawPointer {
return unsafeBitCast(function, to: UnsafeMutableRawPointer.self)
}
let funcAddr = getSwiftFunctionAddr(someFunction)
let amIMSHooked = IOSSecuritySuite.amIMSHooked(funcAddr)
Module de refus MSHook
// Function declaration
func denyDebugger(value: Int) {
}
// Defining FunctionType : @convention(thin) indicates a “thin” function reference, which uses the Swift calling convention with no special “self” or “context” parameters.
typealias FunctionType = @convention(thin) (Int)->()
// Getting original function address
let funcDenyDebugger: FunctionType = denyDebugger
let funcAddr = unsafeBitCast(funcDenyDebugger, to: UnsafeMutableRawPointer.self)
if let originalDenyDebugger = denyMSHook(funcAddr) {
// Call the original function with 1337 as Int argument
unsafeBitCast(originalDenyDebugger, to: FunctionType.self)(1337)
} else {
denyDebugger()
}
Module de vérification d'intégrité des fichiers
// Determine if application has been tampered with
if IOSSecuritySuite.amITampered([.bundleID("biz.securing.FrameworkClientApp"),
.mobileProvision("2976c70b56e9ae1e2c8e8b231bf6b0cff12bbbd0a593f21846d9a004dd181be3"),
.machO("IOSSecuritySuite", "6d8d460b9a4ee6c0f378e30f137cebaf2ce12bf31a2eef3729c36889158aa7fc")]).result {
print("I have been Tampered.")
}
else {
print("I have not been Tampered.")
}