Voltar às atualizações
New releaseAug 5, 2026

IOSSecuritySuite v2.3.0

Biblioteca Swift de segurança da plataforma iOS e antimanipulação

Compartilhar

⭐️ 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

Logotipo do iASE

Descrição do ISS

Logotipo 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.")
}

Categorias