
مكتبة سويفت لأمان منصة iOS ومكافحة العبث
## ⭐️ هل ترغب في أن تصبح مهندس أمان معتمد لتطبيقات iOS؟ ⭐️
اطلع على دورتنا العملية والكامله عبر الإنترنت على: [https://courses.securing.pl/courses/iase](https://courses.securing.pl/courses/iase?utm_source=githubiosss&utm_medium=githubiosss&utm_campaign=githubiosss&utm_id=githubiosss)

## وصف ISS

### بواسطة [@_r3ggi](https://twitter.com/_r3ggi)
🌏 iOS Security Suite هي مكتبة أمان منصة متقدمة وسهلة الاستخدام لمكافحة التلاعب، مكتوبة بلغة Swift النقية! إذا كنت تطور لتطبيقات iOS وتريد حماية تطبيقك وفقًا لمعيار OWASP [MASVS](https://github.com/OWASP/owasp-masvs)، الفصل v8، فإن هذه المكتبة قد توفر لك الكثير من الوقت. 🚀
ما يكشفه ISS:
* كسر الحماية (Jailbreak) 🧨
* مصحح أخطاء متصل 👨🏻🚀
* إذا تم تشغيل تطبيق في محاكٍ 👽
* أدوات الهندسة العكسية الشائعة قيد التشغيل على الجهاز 🔭
## الإعداد
هناك 4 طرق يمكنك بها البدء في استخدام IOSSecuritySuite
### 1. إضافة المصدر
أضف ملفات `IOSSecuritySuite/*.swift` إلى مشروعك
### 2. الإعداد باستخدام CocoaPods
`pod 'IOSSecuritySuite'`
### 3. الإعداد باستخدام Carthage
`github "securing/IOSSecuritySuite"`
### 4. الإعداد باستخدام Swift Package Manager
```swift
.package(url: "https://github.com/securing/IOSSecuritySuite.git", from: "1.5.0")
```
### تحديث Info.plist
بعد إضافة ISS إلى مشروعك، ستحتاج أيضًا إلى تحديث ملف Info.plist الرئيسي. يوجد فحص في وحدة كشف كسر الحماية يستخدم طريقة ```canOpenURL(_:)``` و[يتطلب](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl) تحديد عناوين URL التي سيتم الاستعلام عنها.
```xml
<key>LSApplicationQueriesSchemes</key>
<array>
<string>undecimus</string>
<string>sileo</string>
<string>zbra</string>
<string>filza</string>
</array>
```
### التسعير
تحقق من ترخيص EULA الخاص بنا للحصول على التفاصيل.
TLDR:
إذا كانت شركتك توظف:
* 0-99 شخصًا - **مجاني الاستخدام**
* 100-1000 - 3000 يورو/السنة
* 1000+ - 10000 يورو/السنة
إذا كنت ترغب في بيع وحدة تستخدم iOS Security Suite (لا تُستخدم مباشرة في تطبيقك) - 10000 يورو/السنة
### ملاحظة
iOS Security Suite مخصص للاستخدام على iOS/iPadOS. لا ينبغي استخدامه على أجهزة Mac بمعالجات Apple Silicon.
## كيفية الاستخدام
### وحدة كشف كسر الحماية
* **الطريقة الأبسط** ترجع True/False إذا كنت تريد فقط معرفة ما إذا كان الجهاز مكسور الحماية أم لا.
```Swift
if IOSSecuritySuite.amIJailbroken() {
print("هذا الجهاز مكسور الحماية")
} else {
print("هذا الجهاز ليس مكسور الحماية")
}
```
* **مفصلة**، إذا كنت تريد أيضًا معرفة المؤشرات التي تم تحديدها
```Swift
let jailbreakStatus = IOSSecuritySuite.amIJailbrokenWithFailMessage()
if jailbreakStatus.jailbroken {
print("هذا الجهاز مكسور الحماية")
print("لأن: \(jailbreakStatus.failMessage)")
} else {
print("هذا الجهاز ليس مكسور الحماية")
}
```
`failMessage` هو نص يحتوي على مؤشرات مفصولة بفواصل كما هو موضح في المثال أدناه:
`sileo:// تم اكتشاف مخطط URL، ملف مشبوه موجود: /Library/MobileSubstrate/MobileSubstrate.dylib، تمكن Fork من إنشاء عملية جديدة`
* **مفصلة وقابلة للتصفية**، إذا كنت تريد مثلاً تحديد الأجهزة التي كانت مكسورة الحماية في الماضي ولكنها الآن محصورة
```Swift
let jailbreakStatus = IOSSecuritySuite.amIJailbrokenWithFailedChecks()
if jailbreakStatus.jailbroken {
if (jailbreakStatus.failedChecks.contains { $0.check == .existenceOfSuspiciousFiles }) && (jailbreakStatus.failedChecks.contains { $0.check == .suspiciousFilesCanBeOpened }) {
print("هذا جهاز مكسور الحماية حقيقي")
}
}
```
### وحدة كشف المصحح
```Swift
let amIDebugged: Bool = IOSSecuritySuite.amIDebugged()
```
### منع المصحح تمامًا
```Swift
IOSSecuritySuite.denyDebugger()
```
### وحدة كشف المحاكي
```Swift
let runInEmulator: Bool = IOSSecuritySuite.amIRunInEmulator()
```
### وحدة كشف أدوات الهندسة العكسية
* **الطريقة الأبسط** ترجع True/False إذا كنت تريد فقط معرفة ما إذا كان الجهاز يحتوي على دليل على الهندسة العكسية
```Swift
if IOSSecuritySuite.amIReverseEngineered() {
print("هذا الجهاز يحتوي على دليل على الهندسة العكسية")
} else {
print("هذا الجهاز لا يحتوي على دليل على الهندسة العكسية")
}
```
* **مفصلة وقابلة للتصفية**، إذا كنت تريد أيضًا قائمة الفحوصات التي تمت
```Swift
let reverseStatus = IOSSecuritySuite.amIReverseEngineeredWithFailedChecks()
if reverseStatus.reverseEngineered {
// تحقق من reverseStatus.failedChecks لمزيد من التفاصيل
}
```
### وحدة كشف البروكسي للنظام
يمكنك الآن أيضًا اكتشاف ما إذا كان التطبيق متصلاً بشبكة VPN
```Swift
let amIProxied: Bool = IOSSecuritySuite.amIProxied(considerVPNConnectionAsProxy: true)
```
### وحدة كشف وضع الإغلاق (Lockdown Mode)
```Swift
let amIInLockdownMode: Bool = IOSSecuritySuite.amIInLockdownMode()
```
## الميزات التجريبية
### وحدة كشف خطافات وقت التشغيل
```Swift
let amIRuntimeHooked: Bool = amIRuntimeHook(dyldWhiteList: dylds, detectionClass: SomeClass.self, selector: #selector(SomeClass.someFunction), isClassMethod: false)
```
### وحدة منع خطافات الرموز
```Swift
// إذا أردنا منع خطاف رمز لدالة Swift، يجب تمرير الاسم المُشَوَّه (mangled name) لتلك الدالة
denySymbolHook("$s10Foundation5NSLogyySS_s7CVarArg_pdtF") // منع خطاف الدالة NSLog
NSLog("Hello Symbol Hook")
denySymbolHook("abort")
abort()
```
### وحدة كشف MSHook
```Swift
// تعريف الدالة
func someFunction(takes: Int) -> Bool {
return false
}
// تعريف FunctionType : @convention(thin) يشير إلى مرجع دالة "رفيع" يستخدم اصطلاح استدعاء Swift بدون معاملات "self" أو "context" خاصة.
typealias FunctionType = @convention(thin) (Int) -> (Bool)
// الحصول على عنوان المؤشر للدالة التي نريد التحقق منها
func getSwiftFunctionAddr(_ function: @escaping FunctionType) -> UnsafeMutableRawPointer {
return unsafeBitCast(function, to: UnsafeMutableRawPointer.self)
}
let funcAddr = getSwiftFunctionAddr(someFunction)
let amIMSHooked = IOSSecuritySuite.amIMSHooked(funcAddr)
```
### وحدة منع MSHook
```Swift
// تعريف الدالة
func denyDebugger(value: Int) {
}
// تعريف FunctionType : @convention(thin) يشير إلى مرجع دالة "رفيع"
typealias FunctionType = @convention(thin) (Int)->()
// الحصول على عنوان الدالة الأصلية
let funcDenyDebugger: FunctionType = denyDebugger
let funcAddr = unsafeBitCast(funcDenyDebugger, to: UnsafeMutableRawPointer.self)
if let originalDenyDebugger = denyMSHook(funcAddr) {
// استدعاء الدالة الأصلية مع 1337 كمعامل Int
unsafeBitCast(originalDenyDebugger, to: FunctionType.self)(1337)
} else {
denyDebugger()
}
```
### وحدة التحقق من سلامة الملفات
```Swift
// تحديد ما إذا كان التطبيق قد تم التلاعب به
if IOSSecuritySuite.amITampered([.bundleID("biz.securing.FrameworkClientApp"),
.mobileProvision("2976c70b56e9ae1e2c8e8b231bf6b0cff12bbbd0a593f21846d9a004dd181be3"),
.machO("IOSSecuritySuite", "6d8d460b9a4ee6c0f378e30f137cebaf2ce12bf31a2eef3729c36889158aa7fc")]).result {
print("لقد تم التلاعب بي.")
}
else {
print("لم يتم التلاعب بي.")
}
// التحقق يدويًا من قيمة تجزئة SHA256 لمكتبة dylib محملة
if let hashValue = IOSSecuritySuite.getMachOFileHashValue(.custom("IOSSecuritySuite")), hashValue == "6d8d460b9a4ee6c0f378e30f137cebaf2ce12bf31a2eef3729c36889158aa7fc" {
print("لم يتم التلاعب بي.")
}
else {
print("لقد تم التلاعب بي.")
}
// التحقق من قيمة تجزئة SHA256 للملف التنفيذي الرئيسي
// تلميح: يمكن لتطبيقك استرداد هذه القيمة من الخادم
if let hashValue = IOSSecuritySuite.getMachOFileHashValue(.default), hashValue == "your-application-executable-hash-value" {
print("لم يتم التلاعب بي.")
}
else {
print("لقد تم التلاعب بي.")
}
```
### وحدة كشف نقاط التوقف (Breakpoint)
```Swift
func denyDebugger() {
// ضع نقطة توقف هنا
}
typealias FunctionType = @convention(thin) ()->()
let func_denyDebugger: FunctionType = denyDebugger // `: FunctionType` ضروري
let func_addr = unsafeBitCast(func_denyDebugger, to: UnsafeMutableRawPointer.self)
let hasBreakpoint = IOSSecuritySuite.hasBreakpointAt(func_addr, functionSize: nil)
if hasBreakpoint {
print("تم العثور على نقطة توقف في الدالة المحددة")
} else {
print("لم يتم العثور على نقطة توقف في الدالة المحددة")
}
```
### وحدة كشف نقاط المراقبة (Watchpoint)
```Swift
// ضع نقطة توقف في الدالة testWatchpoint
func testWatchpoint() -> Bool{
// lldb: watchpoint set expression ptr
var ptr = malloc(9)
// lldb: watchpoint set variable count
var count = 3
return IOSSecuritySuite.hasWatchpoint()
}
```
## اعتبارات أمنية
قبل استخدام هذه الأداة وغيرها من أدوات التحقق من أمان المنصة، يجب أن تفهم ما يلي:
* تضمين هذه الأداة في مشروعك ليس الشيء الوحيد الذي يجب عليك فعله لتحسين أمان تطبيقك! يمكنك قراءة ورقة بيضاء عامة حول أمان الأجهزة المحمولة [هنا](https://www.securing.biz/en/mobile-application-security-best-practices/index.html).
* يتم اكتشاف ما إذا كان الجهاز مكسور الحماية محليًا على الجهاز. وهذا يعني أنه يمكن تجاوز أي كاشف لكسر الحماية (حتى هذا)!
* يُعتبر كود Swift أكثر صعوبة في التلاعب به ديناميكيًا مقارنةً بـ Objective-C. نظرًا لأن هذه المكتبة كُتبت بلغة Swift النقية، يجب ألا تتعرض طرق IOSSecuritySuite لبيئة تشغيل Objective-C (مما يجعل تجاوزها أكثر صعوبة ✅). يجب أن تعلم أن المهاجم لا يزال قادرًا على استخدام MSHookFunction/MSFindSymbol لرموز Swift وتغيير تدفق تنفيذ كود Swift ديناميكيًا.
## المساهمة ❤️
نعم، من فضلك! إذا كانت لديك فكرة أفضل أو ترغب فقط في تحسين هذا المشروع، يرجى مراسلتي على [Twitter](https://twitter.com/_r3ggi) أو [LinkedIn](https://www.linkedin.com/in/wojciech-regula/). طلبات السحب (Pull requests) مرحب بها أكثر من أي وقت مضى!
### شكر خاص: 👏🏻
* [kubajakowski](https://github.com/kubajakowski) للإشارة إلى مشكلة طريقة ```canOpenURL(_:)```
* [olbartek](https://github.com/olbartek) لمراجعة الكود وطلب السحب
* [benbahrenburg](https://github.com/benbahrenburg) للتحسينات المختلفة في ISS
* [fotiDim](https://github.com/fotiDim) لإضافة مسارات ملفات جديدة للفحص
* [gcharita](https://github.com/gcharita) لإضافة دعم Swift Package Manager
* [rynaardb](https://github.com/rynaardb) لإنشاء طريقة `amIJailbrokenWithFailedChecks()`
* [undeaDD](https://github.com/undeaDD) للتحسينات المختلفة في ISS
* [fnxpt](https://github.com/fnxpt) لإضافة اكتشافات متعددة لكسر الحماية
* [TannerJin](https://github.com/TannerJin) لوحدات MSHook و RuntimeHook و SymbolHook وكشف نقاط المراقبة
* [NikoXu](https://github.com/NikoXu) لإضافة وحدة سلامة الملفات
* [hellpf](https://github.com/hellpf) لإصلاح مشكلة socket معلق
* [Ant-tree](https://github.com/Ant-tree) لتحسين مقاومة الاختراق
* [izmcm](https://github.com/izmcm) لتنفيذ طريقة `amIReverseEngineeredWithFailedChecks()`
* [sanu](https://github.com/sanu) لتقديم فحوصات ملفات جديدة
* [marsepu](https://github.com/marsepu) لطلب سحب جيد مع تحسينات جديدة
* [mkj-is](https://github.com/mkj-is) لطلب سحب يحسن أداء ISS 🚄
* [LongXiangGuo](https://github.com/LongXiangGuo) لطلب سحب يضيف بيان الخصوصية
* [Coeur](https://github.com/Coeur) لتحسينات ISS وإصلاح الأخطاء
* [Adobels](https://github.com/Adobels) لتكييف ISS مع متطلبات Apple الجديدة
## المهام المستقبلية
* [ ] بحث حول كشف Installer5 و Zebra Package Manager (بدائل Cydia)
* [ ] كاشف إخفاء كسر الحماية لـ Dopamine
## الترخيص
راجع ملف LICENSE.
## المراجع
أثناء إنشاء هذه الأداة استخدمت:
* 🔗 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" بقلم David Thiel