---
title: Hạn chế tính năng nhạy cảm trên jailbroken device
impact: MEDIUM
impactDescription: Trên jailbroken device, Keychain có thể bị extract, SSL pinning bị bypass bởi SSL Kill Switch, và file system accessible không có restriction. Banking/healthcare app cần detect jailbreak để warn hoặc restrict.
tags: swift, ios, jailbreak-detection, root-detection, security-posture, masvs, security
---

## Hạn chế tính năng nhạy cảm trên jailbroken device

Jailbreak detection giúp app nhận biết môi trường không tin cậy để warn user hoặc disable tính năng có rủi ro cao (như lưu credential, xem sensitive data). Lưu ý: detection không 100% và có thể bị bypass, nhưng vẫn là lớp bảo vệ quan trọng cho app tài chính/y tế.

**Incorrect (không có jailbreak awareness):**

```swift
// App banking hoạt động bình thường trên device đã jailbreak
// Keychain contents bị extract bằng keychain-dumper
// Certificate pinning bị bypass bằng SSL Kill Switch 2
// File sandbox bị đọc bởi bất kỳ process nào có root
```

**Correct (basic jailbreak detection với graceful response):**

```swift
import UIKit
import Foundation

struct JailbreakDetector {
    // Chỉ run trong production build
    #if !targetEnvironment(simulator)
    static func isJailbroken() -> Bool {
        return hasJailbreakFiles()
            || canWriteOutsideSandbox()
            || hasSuspiciousApps()
            || hasDynamicLibraryInjection()
    }
    #else
    static func isJailbroken() -> Bool { return false }
    #endif

    // Kiểm tra file đặc trưng của jailbreak tools
    private static func hasJailbreakFiles() -> Bool {
        let jailbreakPaths = [
            "/Applications/Cydia.app",
            "/Applications/Sileo.app",
            "/Library/MobileSubstrate/MobileSubstrate.dylib",
            "/bin/bash",
            "/usr/sbin/sshd",
            "/etc/apt",
            "/private/var/lib/apt/",
            "/private/var/lib/cydia",
            "/usr/bin/ssh",
            "/var/jb"  // Palera1n
        ]
        return jailbreakPaths.contains { FileManager.default.fileExists(atPath: $0) }
    }

    // Thử ghi file ngoài sandbox - chỉ jailbroken device cho phép
    private static func canWriteOutsideSandbox() -> Bool {
        let testPath = "/private/jailbreak_test_\(UUID().uuidString)"
        do {
            try "test".write(toFile: testPath, atomically: true, encoding: .utf8)
            try FileManager.default.removeItem(atPath: testPath)
            return true
        } catch {
            return false
        }
    }

    // Kiểm tra app jailbreak phổ biến qua URL scheme
    private static func hasSuspiciousApps() -> Bool {
        let schemes = ["cydia://", "sileo://", "zbra://", "filza://"]
        return schemes.contains { scheme in
            guard let url = URL(string: scheme) else { return false }
            return UIApplication.shared.canOpenURL(url)
        }
    }

    // Kiểm tra DYLD injection
    private static func hasDynamicLibraryInjection() -> Bool {
        if let dyldEnv = ProcessInfo.processInfo.environment["DYLD_INSERT_LIBRARIES"],
           !dyldEnv.isEmpty {
            return true
        }
        return false
    }
}

// SAFE: Respond gracefully - warn, không block hoàn toàn (tránh false positive)
class SecurityCheckManager {
    enum SecurityRisk {
        case jailbroken
        case clean
    }

    func assessSecurityRisk() -> SecurityRisk {
        return JailbreakDetector.isJailbroken() ? .jailbroken : .clean
    }

    // Tùy từng loại app mà quyết định hành động
    func handleJailbreakDetected(in viewController: UIViewController) {
        let alert = UIAlertController(
            title: "Security Risk Detected",
            message: "Your device appears to be modified (jailbroken). " +
                     "This app's security features may not work as expected. " +
                     "Sensitive features have been disabled for your protection.",
            preferredStyle: .alert
        )
        // Tài chính/banking: offer option để proceed với risk accepted
        alert.addAction(UIAlertAction(title: "I Understand", style: .destructive) { _ in
            // Disable high-risk features: biometric storage, show account numbers, etc.
            SecurityFeatureFlags.disableHighRiskFeatures()
        })
        alert.addAction(UIAlertAction(title: "Exit", style: .cancel) { _ in
            exit(0)  // Hoặc chỉ close app, không kill process
        })
        viewController.present(alert, animated: true)
    }
}

struct SecurityFeatureFlags {
    static var highRiskFeaturesEnabled = true

    static func disableHighRiskFeatures() {
        highRiskFeaturesEnabled = false
        // Disable: show full card number, biometric auto-fill, remember device, etc.
    }
}
```

**Tools:** IOSSecuritySuite (library - comprehensive detection), DTTJailbreakDetection, OWASP MASVS-RESILIENCE-1, frida-ios-dump (test bypass)

**Note:** Jailbreak detection là một lớp bảo vệ trong defense-in-depth, không phải giải pháp duy nhất. Thiết kế hệ thống sao cho server-side security không phụ thuộc vào integrity của client.
