
IOSSecuritySuite v2.3.0
Biblioteca Swift de segurança da plataforma iOS e antimanipulação
⭐️ Você quer se tornar um Engenheiro de Segurança de Aplicativos iOS certificado? ⭐️
Confira nosso curso prático e totalmente online em: https://courses.securing.pl/courses/iase

Descrição do ISS

por @_r3ggi
🌏 O iOS Security Suite é uma biblioteca de segurança de plataforma e anti-adulteração avançada e fácil de usar, escrita em Swift puro! Se você está desenvolvendo para iOS e deseja proteger seu aplicativo de acordo com o padrão OWASP MASVS, capítulo v8, esta biblioteca pode economizar muito tempo. 🚀
O que o ISS detecta:
- Jailbreak 🧨
- Depurador anexado 👨🏻🚀
- Se um aplicativo foi executado em um emulador 👽
- Ferramentas comuns de engenharia reversa em execução no dispositivo 🔭
Configuração
Existem 4 maneiras de começar a usar o IOSSecuritySuite
1. Adicionar fonte
Adicione os arquivos IOSSecuritySuite/*.swift ao seu projeto
2. Configurar com CocoaPods
pod 'IOSSecuritySuite'
3. Configurar com Carthage
github "securing/IOSSecuritySuite"
4. Configurar com Swift Package Manager
.package(url: "https://github.com/securing/IOSSecuritySuite.git", from: "1.5.0")
Atualizar o Info.plist
Após adicionar o ISS ao seu projeto, você também precisará atualizar seu Info.plist principal. Há uma verificação no módulo de detecção de jailbreak que usa o método canOpenURL(_:) e requer a especificação das URLs que serão consultadas.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>undecimus</string>
<string>sileo</string>
<string>zbra</string>
<string>filza</string>
</array>
Preços
Consulte nosso contrato de licença EULA para mais detalhes.
Resumo: Se sua empresa possui:
- 0-99 pessoas - uso gratuito
- 100-1000 - 3k EUR/ano
- 1000+ - 10k EUR/ano
Se você quiser vender um módulo que utiliza o iOS Security Suite (não usado diretamente no seu aplicativo) - 10k EUR/ano
Aviso
O iOS Security Suite deve ser usado no iOS/iPadOS. Não deve ser usado em Macs com Apple Silicon.
Como usar
Módulo de detecção de Jailbreak
- O método mais simples retorna True/False se você apenas deseja saber se o dispositivo está com jailbreak ou não
if IOSSecuritySuite.amIJailbroken() {
print("This device is jailbroken")
} else {
print("This device is not jailbroken")
}
- Detalhado, se você também quiser saber quais indicadores foram identificados
let jailbreakStatus = IOSSecuritySuite.amIJailbrokenWithFailMessage()
if jailbreakStatus.jailbroken {
print("This device is jailbroken")
print("Because: \(jailbreakStatus.failMessage)")
} else {
print("This device is not jailbroken")
}
A failMessage é uma String contendo indicadores separados por vírgula, conforme mostrado no exemplo abaixo:
sileo:// URL scheme detected, Suspicious file exists: /Library/MobileSubstrate/MobileSubstrate.dylib, Fork was able to create a new process
- Detalhado e filtrável, se você também quiser, por exemplo, identificar dispositivos que já tiveram jailbreak no passado, mas agora estão sem
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")
}
}
Módulo de detecção de depurador
let amIDebugged: Bool = IOSSecuritySuite.amIDebugged()
Negar depurador completamente
IOSSecuritySuite.denyDebugger()
Módulo de detecção de emulador
let runInEmulator: Bool = IOSSecuritySuite.amIRunInEmulator()
Módulo de detecção de ferramentas de engenharia reversa
- O método mais simples retorna True/False se você apenas deseja saber se o dispositivo tem evidências de engenharia reversa
if IOSSecuritySuite.amIReverseEngineered() {
print("This device has evidence of reverse engineering")
} else {
print("This device hasn't evidence of reverse engineering")
}
- Detalhado e filtrável, se você também quiser a lista de verificações realizadas
let reverseStatus = IOSSecuritySuite.amIReverseEngineeredWithFailedChecks()
if reverseStatus.reverseEngineered {
// check for reverseStatus.failedChecks for more details
}
Módulo de detecção de proxy do sistema
Agora você também pode detectar se um aplicativo está conectado a uma VPN
let amIProxied: Bool = IOSSecuritySuite.amIProxied(considerVPNConnectionAsProxy: true)
Módulo de detecção do modo de bloqueio
let amIInLockdownMode: Bool = IOSSecuritySuite.amIInLockdownMode()
Funcionalidades experimentais
Módulo de detecção de hook em tempo de execução
let amIRuntimeHooked: Bool = amIRuntimeHook(dyldWhiteList: dylds, detectionClass: SomeClass.self, selector: #selector(SomeClass.someFunction), isClassMethod: false)
Módulo de negação de hook de símbolo
// 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()
Módulo de detecção de 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)
Módulo de negação de 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()
}
Módulo de verificação de integridade de arquivos
// 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.")
}
Módulo de detecção de breakpoint
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")
}
Módulo de detecção de watchpoint
// 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()
}
Considerações de segurança
Antes de usar esta e outras ferramentas de verificação de segurança de plataforma, você precisa entender que:
- Incluir esta ferramenta no seu projeto não é a única coisa que você deve fazer para melhorar a segurança do seu aplicativo! Você pode ler um whitepaper geral de segurança móvel aqui.
- A detecção de se um dispositivo está com jailbreak é feita localmente no dispositivo. Isso significa que qualquer detector de jailbreak pode ser contornado (até mesmo este)!
- O código Swift é considerado mais difícil de manipular dinamicamente do que Objective-C. Como esta biblioteca foi escrita em Swift puro, os métodos do IOSSecuritySuite não devem ser expostos ao runtime do Objective-C (o que torna mais difícil contorná-lo ✅). Você precisa saber que um atacante ainda pode usar MSHookFunction/MSFindSymbol em símbolos Swift e alterar dinamicamente o fluxo de execução do código Swift.
Contribuição ❤️
Sim, por favor! Se você tem uma ideia melhor ou apenas deseja melhorar este projeto, entre em contato comigo no Twitter ou LinkedIn. Pull requests são mais que bem-vindos!
Agradecimentos especiais: 👏🏻
- kubajakowski por apontar o problema com o método
canOpenURL(_:) - olbartek pela revisão de código e pull request
- benbahrenburg por várias melhorias no ISS
- fotiDim por adicionar novos caminhos de arquivo para verificar
- gcharita por adicionar suporte ao Swift Package Manager
- rynaardb por criar o método
amIJailbrokenWithFailedChecks() - undeaDD por várias melhorias no ISS
- fnxpt por adicionar múltiplas detecções de JB
- TannerJin pelos módulos de detecção de MSHook, RuntimeHook, SymbolHook e Watchpoint
- NikoXu por adicionar o módulo de integridade de arquivos
- hellpf por corrigir um problema de socket pendente
- Ant-tree por melhorar a resistência a hooks
- izmcm por implementar o método
amIReverseEngineeredWithFailedChecks() - sanu por fornecer novas verificações de arquivos
- marsepu por um PR bem feito com novas melhorias
- mkj-is por um PR melhorando o desempenho do ISS 🚄
- LongXiangGuo por um PR adicionando o manifesto de privacidade
- Coeur por melhorias e correções de bugs no ISS
- Adobels por ajustar o ISS aos novos requisitos da Apple
A FAZER
- Pesquisar detecção do Installer5 e Zebra Package Manager (alternativas ao Cydia)
- Detector de hidejb do Dopamine
Licença
Consulte o arquivo LICENSE.
Referências
Durante a criação desta ferramenta, utilizei:
- 🔗 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" por David Thiel