معلومات التحدي
هذا التحدي مصمم لمتخصصي الأمن السيبراني الذين يرغبون في تطوير مهاراتهم في تحليل وتأمين تطبيقات 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 لتخزين البيانات الحساسة بشكل آمن:
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:
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). كيف يمكنك تنفيذ هذه الآلية؟
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// إعداد التطبيق
return true
}
تلميح
ابحث عن طرق اكتشاف Jailbreak في iOS وتقنيات التهرب من هذه الآليات.
الحل
المشكلة: التطبيق لا يتحقق من وجود Jailbreak مما يعرضه للخطر على الأجهزة المخترقة.
الحل: إضافة آلية لاكتشاف Jailbreak:
// التحقق من وجود ملفات مرتبطة بالـ 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
}