
Libreria Swift per la sicurezza della piattaforma iOS e anti-manomissione
## ⭐️ Vuoi diventare un ingegnere certificato di sicurezza delle applicazioni iOS? ⭐️
Dai un'occhiata al nostro corso pratico e completamente online su: [https://courses.securing.pl/courses/iase](https://courses.securing.pl/courses/iase?utm_source=githubiosss&utm_medium=githubiosss&utm_campaign=githubiosss&utm_id=githubiosss)

## Descrizione ISS

### di [@_r3ggi](https://twitter.com/_r3ggi)
🌏 iOS Security Suite è una libreria avanzata e facile da usare per la sicurezza della piattaforma e anti-manomissione scritta in puro Swift! Se sviluppi per iOS e vuoi proteggere la tua app secondo lo standard OWASP [MASVS](https://github.com/OWASP/owasp-masvs) capitolo v8, allora questa libreria potrebbe farti risparmiare molto tempo. 🚀
Cosa rileva ISS:
* Jailbreak 🧨
* Debugger collegato 👨🏻🚀
* Se un'app è stata eseguita in un emulatore 👽
* Strumenti comuni di reverse engineering in esecuzione sul dispositivo 🔭
## Configurazione
Ci sono 4 modi per iniziare a utilizzare IOSSecuritySuite
### 1. Aggiungere il codice sorgente
Aggiungi i file `IOSSecuritySuite/*.swift` al tuo progetto
### 2. Configurare con CocoaPods
`pod 'IOSSecuritySuite'`
### 3. Configurare con Carthage
`github "securing/IOSSecuritySuite"`
### 4. Configurare con Swift Package Manager
```swift
.package(url: "https://github.com/securing/IOSSecuritySuite.git", from: "1.5.0")
```
### Aggiornare Info.plist
Dopo aver aggiunto ISS al tuo progetto, dovrai anche aggiornare il tuo Info.plist principale. C'è un controllo nel modulo di rilevamento jailbreak che utilizza il metodo ```canOpenURL(_:)``` e [richiede](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl) di specificare gli URL che verranno interrogati.
```xml
<key>LSApplicationQueriesSchemes</key>
<array>
<string>undecimus</string>
<string>sileo</string>
<string>zbra</string>
<string>filza</string>
</array>
```
### Prezzi
Controlla la nostra licenza EULA per i dettagli.
TLDR:
Se la tua azienda impiega:
* 0-99 persone - **gratuito da usare**
* 100-1000 - 3.000 EUR/anno
* 1000+ - 10.000 EUR/anno
Se vuoi vendere un modulo che utilizza iOS Security Suite (non utilizzato direttamente nella tua app) - 10.000 EUR/anno
### Avviso
iOS Security Suite è pensato per essere utilizzato su iOS/iPadOS. Non dovrebbe essere utilizzato su Mac con Apple Silicon.
## Come usarlo
### Modulo rilevatore di jailbreak
* **Il metodo più semplice** restituisce Vero/Falso se vuoi solo sapere se il dispositivo è jailbroken o meno
```Swift
if IOSSecuritySuite.amIJailbroken() {
print("This device is jailbroken")
} else {
print("This device is not jailbroken")
}
```
* **Verboso**, se vuoi anche sapere quali indicatori sono stati identificati
```Swift
let jailbreakStatus = IOSSecuritySuite.amIJailbrokenWithFailMessage()
if jailbreakStatus.jailbroken {
print("This device is jailbroken")
print("Because: \(jailbreakStatus.failMessage)")
} else {
print("This device is not jailbroken")
}
```
Il failMessage è una stringa contenente indicatori separati da virgole come mostrato nell'esempio qui sotto:
`sileo:// URL scheme detected, Suspicious file exists: /Library/MobileSubstrate/MobileSubstrate.dylib, Fork was able to create a new process`
* **Verboso e filtrabile**, se vuoi anche, ad esempio, identificare dispositivi che erano jailbroken in passato, ma ora non lo sono più
```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")
}
}
```
### Modulo rilevatore di debugger
```Swift
let amIDebugged: Bool = IOSSecuritySuite.amIDebugged()
```
### Negare il debugger completamente
```Swift
IOSSecuritySuite.denyDebugger()
```
### Modulo rilevatore di emulatore
```Swift
let runInEmulator: Bool = IOSSecuritySuite.amIRunInEmulator()
```
### Modulo rilevatore di strumenti di reverse engineering
* **Il metodo più semplice** restituisce Vero/Falso se vuoi solo sapere se il dispositivo ha evidenze di reverse engineering
```Swift
if IOSSecuritySuite.amIReverseEngineered() {
print("This device has evidence of reverse engineering")
} else {
print("This device hasn't evidence of reverse engineering")
}
```
* **Verboso e filtrabile**, se vuoi anche la lista dei controlli effettuati
```Swift
let reverseStatus = IOSSecuritySuite.amIReverseEngineeredWithFailedChecks()
if reverseStatus.reverseEngineered {
// check for reverseStatus.failedChecks for more details
}
```
### Modulo rilevatore di proxy di sistema
Ora puoi anche rilevare se un'app è connessa a VPN
```Swift
let amIProxied: Bool = IOSSecuritySuite.amIProxied(considerVPNConnectionAsProxy: true)
```
### Modulo rilevatore della modalità di blocco
```Swift
let amIInLockdownMode: Bool = IOSSecuritySuite.amIInLockdownMode()
```
## Funzionalità sperimentali
### Modulo rilevatore di hook runtime
```Swift
let amIRuntimeHooked: Bool = amIRuntimeHook(dyldWhiteList: dylds, detectionClass: SomeClass.self, selector: #selector(SomeClass.someFunction), isClassMethod: false)
```
### Modulo di negazione degli hook dei simboli
```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()
```
### Modulo rilevatore di 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)
```
### Modulo di negazione di 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()
}
```
### Modulo di verifica dell'integrità dei file
```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.")
}
```
### Modulo di rilevamento dei breakpoint
```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")
}
```
### Modulo di rilevamento dei watchpoint
```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()
}
```
## Considerazioni sulla sicurezza
Prima di utilizzare questo e altri controllori di sicurezza della piattaforma, devi capire che:
* Includere questo strumento nel tuo progetto non è l'unica cosa che dovresti fare per migliorare la sicurezza della tua app! Puoi leggere un whitepaper generale sulla sicurezza mobile [qui](https://www.securing.biz/en/mobile-application-security-best-practices/index.html).
* Rilevare se un dispositivo è jailbroken viene fatto localmente sul dispositivo. Ciò significa che ogni rilevatore di jailbreak può essere bypassato (anche questo)!
* Il codice Swift è considerato più difficile da manipolare dinamicamente rispetto a Objective-C. Poiché questa libreria è stata scritta in puro Swift, i metodi di IOSSecuritySuite non dovrebbero essere esposti al runtime di Objective-C (il che rende più difficile il bypass ✅). Devi sapere che un attaccante è ancora in grado di eseguire MSHookFunction/MSFindSymbol su simboli Swift e modificare dinamicamente il flusso di esecuzione del codice Swift.
## Contributi ❤️
Sì, per favore! Se hai un'idea migliore o vuoi semplicemente migliorare questo progetto, contattami su [Twitter](https://twitter.com/_r3ggi) o [LinkedIn](https://www.linkedin.com/in/wojciech-regula/). Le pull request sono più che benvenute!
### Ringraziamenti speciali: 👏🏻
* [kubajakowski](https://github.com/kubajakowski) per aver segnalato il problema con il metodo ```canOpenURL(_:)```
* [olbartek](https://github.com/olbartek) per la revisione del codice e la pull request
* [benbahrenburg](https://github.com/benbahrenburg) per vari miglioramenti a ISS
* [fotiDim](https://github.com/fotiDim) per aver aggiunto nuovi percorsi di file da controllare
* [gcharita](https://github.com/gcharita) per aver aggiunto il supporto per Swift Package Manager
* [rynaardb](https://github.com/rynaardb) per aver creato il metodo `amIJailbrokenWithFailedChecks()`
* [undeaDD](https://github.com/undeaDD) per vari miglioramenti a ISS
* [fnxpt](https://github.com/fnxpt) per aver aggiunto multiple rilevazioni di jailbreak
* [TannerJin](https://github.com/TannerJin) per i moduli MSHook, RuntimeHook, SymbolHook e Watchpoint Detection
* [NikoXu](https://github.com/NikoXu) per aver aggiunto il modulo di integrità dei file
* [hellpf](https://github.com/hellpf) per aver risolto un problema di socket pendente
* [Ant-tree](https://github.com/Ant-tree) per aver migliorato la resistenza agli hook
* [izmcm](https://github.com/izmcm) per aver implementato il metodo `amIReverseEngineeredWithFailedChecks()`
* [sanu](https://github.com/sanu) per aver fornito nuovi controlli sui file
* [marsepu](https://github.com/marsepu) per una pull request ben fatta con nuovi miglioramenti
* [mkj-is](https://github.com/mkj-is) per una pull request che migliora le prestazioni di ISS 🚄
* [LongXiangGuo](https://github.com/LongXiangGuo) per una pull request che aggiunge il manifesto della privacy
* [Coeur](https://github.com/Coeur) per miglioramenti e correzioni di bug in ISS
* [Adobels](https://github.com/Adobels) per aver adattato ISS ai nuovi requisiti di Apple
## TODO
* [ ] Ricerca sul rilevamento di Installer5 e Zebra Package Manager (Alternative a Cydia)
* [ ] Rilevatore Dopamine hidejb
## Licenza
Vedi il file LICENSE.
## Riferimenti
Mentre creavo questo strumento ho utilizzato:
* 🔗 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" di David Thiel