معلومات التحدي

هذا التحدي مصمم لمتخصصي الأمن السيبراني الذين يرغبون في تطوير مهاراتهم في تحليل وتأمين تطبيقات iOS. ستتعلم من خلاله تقنيات متقدمة لاكتشاف الثغرات الأمنية وكيفية معالجتها.

المستوى

متقدم

المدة المتوقعة

2-3 ساعات

الأدوات المطلوبة

Xcode, Burp Suite, Frida

النقاط

200 نقطة

سيناريو التحدي

أنت محلل أمني في شركة تقنية، وقد طُلِب منك تحليل تطبيق iOS خاص بالخدمات المصرفية للكشف عن أي ثغرات أمنية محتملة. التطبيق يحتوي على عدة نقاط ضعف يجب اكتشافها وتقديم تقرير عنها.

التحدي الأول: اكتشاف ثغرة تخزين البيانات

متوسط

اكتشف أن التطبيق يقوم بتخزين بيانات حساسة (كلمات المرور، tokens) في مكان غير آمن. حدد مكان التخزين غير الآمن واقترح حلاً مناسباً.

// جزء من كود التطبيق
func saveCredentials(username: String, password: String) {
  let credentials = ["username": username, "password": password]
  UserDefaults.standard.set(credentials, forKey: "user_credentials")
  print("تم حفظ بيانات الاعتماد")
}

تلميح

ابحث عن كيفية تخزين البيانات الحساسة في تطبيقات iOS والأماكن الآمنة المناسبة لذلك.

الحل

المشكلة: التطبيق يستخدم UserDefaults لتخزين بيانات حساسة وهي غير آمنة ويمكن الوصول إليها بسهولة.

الحل: استخدام Keychain لتخزين البيانات الحساسة بشكل آمن:

func saveCredentials(username: String, password: String) {
  let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: username,
    kSecValueData as String: password.data(using: .utf8)!
  ]
  let status = SecItemAdd(query as CFDictionary, nil)
  guard status == errSecSuccess else { return }
  print("تم حفظ بيانات الاعتماد بشكل آمن")
}

التحدي الثاني: ثغرة SSL Pinning

صعب

اكتشف أن التطبيق لا يستخدم SSL Pinning مما يجعله عرضة لهجمات Man-in-the-Middle. كيف يمكنك تنفيذ هذه الحماية؟

// جزء من كود الاتصال بالخادم
let url = URL(string: "https://api.bankapp.com/login")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
  // معالجة الاستجابة
}
task.resume()

تلميح

ابحث عن تقنيات SSL Pinning في iOS وكيفية تنفيذها باستخدام URLSession.

الحل

المشكلة: التطبيق لا يستخدم SSL Pinning مما يسمح لهجمات Man-in-the-Middle.

الحل: تنفيذ SSL Pinning باستخدام URLSessionDelegate:

class SSLPinningDelegate: NSObject, URLSessionDelegate {
  func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    guard let serverTrust = challenge.protectionSpace.serverTrust else {
      return completionHandler(.cancelAuthenticationChallenge, nil)
    }
    // التحقق من صحة الشهادة هنا
    if verifyCertificate(serverTrust: serverTrust) {
      let credential = URLCredential(trust: serverTrust)
      completionHandler(.useCredential, credential)
    } else {
      completionHandler(.cancelAuthenticationChallenge, nil)
    }
  }
  
  private func verifyCertificate(serverTrust: SecTrust) -> Bool {
    // تنفيذ التحقق من صحة الشهادة
    return true
  }
}

التحدي الثالث: ثغرة Jailbreak Detection

متوسط

اكتشف أن التطبيق لا يحتوي على آلية لاكتشاف الأجهزة المخترقة (Jailbreak). كيف يمكنك تنفيذ هذه الآلية؟

// كود التطبيق الحالي لا يحتوي على Jailbreak detection
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  // إعداد التطبيق
  return true
}

تلميح

ابحث عن طرق اكتشاف Jailbreak في iOS وتقنيات التهرب من هذه الآليات.

الحل

المشكلة: التطبيق لا يتحقق من وجود Jailbreak مما يعرضه للخطر على الأجهزة المخترقة.

الحل: إضافة آلية لاكتشاف Jailbreak:

func isJailbroken() -> Bool {
  // التحقق من وجود ملفات مرتبطة بالـ Jailbreak
  let paths = [
    "/Applications/Cydia.app",
    "/Library/MobileSubstrate/MobileSubstrate.dylib",
    "/bin/bash",
    "/usr/sbin/sshd"
  ]
  
  for path in paths {
    if FileManager.default.fileExists(atPath: path) {
      return true
    }
  }
  
  return false
}

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
  if isJailbroken() {
    // إجراء مناسب مثل إغلاق التطبيق أو عرض تحذير
    exit(0)
  }
  return true
}