
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](https://courses.securing.pl/courses/iase?utm_source=githubiosss&utm_medium=githubiosss&utm_campaign=githubiosss&utm_id=githubiosss)

## Description d'ISS

### par [@_r3ggi](https://twitter.com/_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](https://github.com/OWASP/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
```swift
.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](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl) de spécifier les URL qui seront interrogées.
```xml
<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
```Swift
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
```Swift
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
```Swift
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
```Swift
let amIDebugged: Bool = IOSSecuritySuite.amIDebugged()
```
### Refuser le débogueur complètement
```Swift
IOSSecuritySuite.denyDebugger()
```
### Module de détection d'émulateur
```Swift
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
```Swift
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
```Swift
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
```Swift
let amIProxied: Bool = IOSSecuritySuite.amIProxied(considerVPNConnectionAsProxy: true)
```
### Module de détection du mode verrouillage
```Swift
let amIInLockdownMode: Bool = IOSSecuritySuite.amIInLockdownMode()
```
## Fonctionnalités expérimentales
### Module de détection de hook d'exécution
```Swift
let amIRuntimeHooked: Bool = amIRuntimeHook(dyldWhiteList: dylds, detectionClass: SomeClass.self, selector: #selector(SomeClass.someFunction), isClassMethod: false)
```
### Module de refus de hook de symbole
```Swift
// 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
```Swift
// 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
```Swift
// 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
```Swift
// 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.")
}
// Manually verify SHA256 hash value of a loaded dylib
if let hashValue = IOSSecuritySuite.getMachOFileHashValue(.custom("IOSSecuritySuite")), hashValue == "6d8d460b9a4ee6c0f378e30f137cebaf2ce12bf31a2eef3729c36889158aa7fc" {
print("I have not been Tampered.")
}
else {
print("I have been Tampered.")
}
// Check SHA256 hash value of the main executable
// Tip: Your application may retrieve this value from the server
if let hashValue = IOSSecuritySuite.getMachOFileHashValue(.default), hashValue == "your-application-executable-hash-value" {
print("I have not been Tampered.")
}
else {
print("I have been Tampered.")
}
```
### Module de détection de point d'arrêt
```Swift
func denyDebugger() {
// Set breakpoint here
}
typealias FunctionType = @convention(thin) ()->()
let func_denyDebugger: FunctionType = denyDebugger // `: FunctionType` is a must
let func_addr = unsafeBitCast(func_denyDebugger, to: UnsafeMutableRawPointer.self)
let hasBreakpoint = IOSSecuritySuite.hasBreakpointAt(func_addr, functionSize: nil)
if hasBreakpoint {
print("Breakpoint found in the specified function")
} else {
print("Breakpoint not found in the specified function")
}
```
### Module de détection de point de surveillance
```Swift
// Set a breakpoint at the testWatchpoint function
func testWatchpoint() -> Bool{
// lldb: watchpoint set expression ptr
var ptr = malloc(9)
// lldb: watchpoint set variable count
var count = 3
return IOSSecuritySuite.hasWatchpoint()
}
```
## Considérations de sécurité
Avant d'utiliser cet outil et d'autres vérificateurs de sécurité de plateforme, vous devez comprendre que :
* Inclure cet outil dans votre projet n'est pas la seule chose que vous devriez faire pour améliorer la sécurité de votre application ! Vous pouvez lire un livre blanc général sur la sécurité mobile [ici](https://www.securing.biz/en/mobile-application-security-best-practices/index.html).
* La détection si un appareil est jailbreaké est effectuée localement sur l'appareil. Cela signifie que tout détecteur de jailbreak peut être contourné (même celui-ci) !
* Le code Swift est considéré comme plus difficile à manipuler dynamiquement que l'Objective-C. Puisque cette bibliothèque a été écrite en pure Swift, les méthodes de IOSSecuritySuite ne devraient pas être exposées au runtime Objective-C (ce qui les rend plus difficiles à contourner ✅). Vous devez savoir qu'un attaquant peut toujours utiliser MSHookFunction/MSFindSymbol sur les symboles Swift et modifier dynamiquement le flux d'exécution du code Swift.
## Contribution ❤️
Oui, s'il vous plaît ! Si vous avez une meilleure idée ou si vous souhaitez simplement améliorer ce projet, envoyez-moi un message sur [Twitter](https://twitter.com/_r3ggi) ou [LinkedIn](https://www.linkedin.com/in/wojciech-regula/). Les pull requests sont les bienvenues !
### Remerciements particuliers : 👏🏻
* [kubajakowski](https://github.com/kubajakowski) pour avoir signalé le problème avec la méthode ```canOpenURL(_:)```
* [olbartek](https://github.com/olbartek) pour la revue de code et la pull request
* [benbahrenburg](https://github.com/benbahrenburg) pour diverses améliorations d'ISS
* [fotiDim](https://github.com/fotiDim) pour avoir ajouté de nouveaux chemins de fichiers à vérifier
* [gcharita](https://github.com/gcharita) pour avoir ajouté le support de Swift Package Manager
* [rynaardb](https://github.com/rynaardb) pour avoir créé la méthode `amIJailbrokenWithFailedChecks()`
* [undeaDD](https://github.com/undeaDD) pour diverses améliorations d'ISS
* [fnxpt](https://github.com/fnxpt) pour avoir ajouté plusieurs détections JB
* [TannerJin](https://github.com/TannerJin) pour les modules de détection MSHook, RuntimeHook, SymbolHook et Watchpoint
* [NikoXu](https://github.com/NikoXu) pour avoir ajouté le module d'intégrité des fichiers
* [hellpf](https://github.com/hellpf) pour avoir corrigé un problème de socket pendante
* [Ant-tree](https://github.com/Ant-tree) pour avoir amélioré la résistance au hooking
* [izmcm](https://github.com/izmcm) pour avoir implémenté la méthode `amIReverseEngineeredWithFailedChecks()`
* [sanu](https://github.com/sanu) pour avoir fourni de nouvelles vérifications de fichiers
* [marsepu](https://github.com/marsepu) pour une pull request bien faite avec de nouvelles améliorations
* [mkj-is](https://github.com/mkj-is) pour une pull request améliorant les performances d'ISS 🚄
* [LongXiangGuo](https://github.com/LongXiangGuo) pour une pull request ajoutant le manifeste de confidentialité
* [Coeur](https://github.com/Coeur) pour des améliorations et corrections de bugs d'ISS
* [Adobels](https://github.com/Adobels) pour avoir adapté ISS aux nouvelles exigences d'Apple
## À faire
* [ ] Recherche sur la détection d'Installer5 et Zebra Package Manager (alternatives à Cydia)
* [ ] Détecteur de Dopamine hidejb
## Licence
Voir le fichier LICENSE.
## Références
Lors de la création de cet outil, j'ai utilisé :
* 🔗 https://github.com/TheSwiftyCoder/JailBreak-Detection
* 🔗 https://github.com/abhinashjain/jailbreakdetection
* 🔗 https://gist.github.com/ddrccw/8412847
* 🔗 https://gist.github.com/bugaevc/4307eaf045e4b4264d8e395b5878a63b
* 📚 "iOS Application Security" de David Thiel