تشريح AirDrop الكامل.
AirDrop ليس «مجرّد نقل ملف»؛ هو مكدّس من أربع تقنيات تتعاون. BLE للاكتشاف، AWDL للنقل السريع، Bonjour/mDNS لتحديد الخدمة، وHTTPS/TLS للنقل الآمن. فهم هذا التقسيم يفسّر لماذا AirDrop آمن نسبياً، ولماذا يتسرّب منه ما يتسرّب.
لماذا هذا التقسيم الهجين؟
استخدام AWDL طوال الوقت مكلف للطاقة (يبقي الراديو يقفز). الحلّ الذكي:
BLE — Bluetooth Low Energy
رخيص جداً للطاقة → يبقى يعمل دائماً للاكتشاف الأولي. لا يحمل بيانات ثقيلة.
AWDL — Wi-Fi peer link
سريع لكنه مكلف → لا يُفعّل إلا بعد أن يثبت BLE وجود طرف مهتمّ وموثوق.
تدفّق المصافحة الكامل
مرحلة BLE: الإعلان والـ Contact Hashes
- المرسل يبثّ إعلان BLE يحمل بيانات الشركة المصنّعة الخاصة بـ Apple، نوعها
0x05(AirDrop). - الحمولة تتضمّن hashes مختصرة (أوّل بايتين من SHA-256) لكل من: البريد/البريدات وأرقام الهاتف المُطبّعة (normalized) المرتبطة بـ Apple ID للمرسل.
- المستقبِل يفحص: هل أيّ من هذه الـ hashes يطابق hash لأحد جهات اتصاله؟ إن نعم → الطرف «معروف» (Contacts Only يسمح به).
ble · apple manufacturer data · airdrop adv frame
# BLE manufacturer-specific advertisement
manufacturer_id : 0x004C # Apple
apple_type : 0x05 # AirDrop
flags : 0x00 # status / mode
version : 0x01
contact_hashes : [h1, h2, h3, h4] # 2 bytes each, truncated SHA-256
▲
UNSALTED + 2 BYTES = guessable
# each hash:
h_i = SHA-256(normalized_identifier)[0:2]
where normalized_identifier ∈ {phone_E164, email_lowercase}
هذه الـ hashes غير مملّحة (unsalted) ومختصرة جداً. هذا يجعل عكسها (لكشف رقم الهاتف/البريد) ممكناً عبر جداول قوس قزح (rainbow tables) أو هجوم قاموس — وهي الثغرة التي استغلّتها أبحاث وجهات إنفاذ قانون لاحقاً. التفاصيل في الوحدة 6.
التحقق من الهوية وأوضاع AirDrop
أوضاع المستقبِل الثلاثة تحدّد سلوك المطابقة:
| الوضع | السلوك | قابلية المحاكاة |
|---|---|---|
| Receiving Off | لا يستجيب لإعلانات BLE أصلاً. | N/A |
| Contacts Only | يكمل المصافحة فقط إذا طابق أحد الـ hashes جهة اتصال معروفة، ويتحقّق عبر شهادات هوية موقّعة من Apple (سلسلة ثقة) من سجلّ تحقّق متبادل. | HARD |
| Everyone (أو "Everyone for 10 Minutes") | يقبل من الجميع لفترة، دون اشتراط مطابقة جهة اتصال. هذا الوضع هو ما تتطلّبه توافقية Quick Share مع Android. | FEASIBLE |
OpenDrop (الوحدة 4) ومحاكي Google داخل Quick Share يستهدفان Everyone. Contacts Only يتطلّب سلسلة شهادات Apple التي لا يمكن تزويرها من خارج النظام البيئي.
اكتشاف الخدمة عبر mDNS/Bonjour
- بعد تفعيل AWDL وتثبيت رابط IPv6، يعلن المستقبِل خدمة من نوع
_airdrop._tcp.local.عبر multicast DNS على رابط AWDL. - يرافقها سجل TXT يحمل القدرات (الإصدار، دعم الوسائط المتدفّقة، متطلبات التشفير، الـ flags).
- المرسل يحلّ من mDNS: عنوان IPv6 للمستقبِل + منفذ TCP لخادم AirDrop.
mDNS · multicast DNS over awdl0
# discovery (receiver announces)
PTR : _airdrop._tcp.local. → "4F2A19BB"._airdrop._tcp.local.
SRV : "4F2A19BB"._airdrop._tcp.local. → port=8770 host=macbook.local.
AAAA: macbook.local. → fe80::ae3d:82ff:fe1c:9912
TXT : flags=901 ver=2
# sender now knows: [fe80::ae3d:82ff:fe1c:9912]:8770 → HTTPS endpoint
بروتوكول النقل: HTTPS فوق TLS متبادل المصادقة
المستقبِل يشغّل خادم HTTPS صغيراً. المصافحة TLS 1.2+ متبادلة (mutual TLS): الطرفان يقدّمان شهادات هوية، والثقة مبنية على ما تأسّس عبر BLE/سلسلة شهادات Apple. ثم يتبادلان عبر واجهة HTTP بسيطة بثلاث نقاط نهاية:
| الطلب | الغرض | الحمولة |
|---|---|---|
POST /Discover |
هل يرغب المستقبِل أن يُكتشف من هذا المرسِل؟ | سجل تحقّق (plist) |
POST /Ask |
«أريد أن أرسل لك» — يظهر تنبيه القبول للمستخدم | اسم المرسل، أيقونة، أسماء/أنواع الملفات (plist) |
POST /Upload |
الرفع الفعلي بعد القبول | الملفات كأرشيف cpio مضغوط بـ gzip |
صيغة الحمولات
POST /Ask · request body (plist + binary)
# /Ask payload (XML plist)
<?xml version="1.0"?>
<plist>
<dict>
<key>SenderComputerName</key>
<string>Khaled's MacBook</string>
<key>SenderID</key>
<string>2D9F4-...-A1B2</string>
<key>BundleID</key>
<string>com.apple.finder</string>
<key>Files</key>
<array>
<dict>
<key>FileName</key> <string>payload.bin</string>
<key>FileType</key> <string>public.data</string>
<key>FileBomPath</key> <string>./payload.bin</string>
<key>FileSize</key> <integer>2483712</integer>
<key>FileIsDirectory</key> <false/>
</dict>
</array>
</dict>
</plist>
POST /Upload · content-type: application/x-cpio
# body is: gzip( cpio( files... ) )
# on macOS: bsdtar + gzip equivalent
$ ls files/
payload.bin thumb.jpg
$ tar -cf - --format=odc files/ | gzip -9 > body.cpio.gz
$ file body.cpio.gz
body.cpio.gz: gzip compressed data, original size 2.4 MB
# sent inside the TLS tunnel as raw POST body
- الرسائل (records) بصيغة Apple Property List (plist).
- الملفات تُجمَّع في أرشيف cpio (نوع المحتوى
application/x-cpio) ثم تُضغط، وتُرسَل داخل نفق TLS. - السرعة النظرية للرابط الأساسي AWDL قد تصل إلى ~200 Mbps في ظروف مثالية، محكومة بازدحام القناة وطبيعة الوسط المشترك.
سلسلة الثقة والشهادات
- Apple تُصدر لكل جهاز/حساب شهادة هوية موقّعة من سلطة تصديق خاصة بها (Apple Root CA).
- في وضع Contacts Only، يتحقّق كل طرف من أن شهادة الآخر تعود لهوية ضمن جهات اتصاله (عبر سجل التحقّق وربطه بالـ hashes).
- هذه السلسلة المغلقة هي ما يصعّب على طرف ثالث (محاكٍ) انتحال «جهة اتصال معروفة» — بينما وضع Everyone أسهل بكثير للمحاكاة لأنه لا يتطلّب إثبات قرابة جهة اتصال.
نقاط ارتكاز الوحدة 2
- AirDrop = BLE (اكتشاف) + AWDL (رابط) + Bonjour (تحديد الخدمة) + HTTPS/mTLS (نقل آمن).
- BLE يحمل hashes مختصرة غير مملّحة لهويات جهات الاتصال → نقطة ضعف الخصوصية.
- النقل عبر 3 نقاط:
/Discover,/Ask,/Upload؛ الملفات أرشيف cpio مضغوط داخل TLS. - وضع Everyone أسهل بكثير في المحاكاة من Contacts Only (لا يحتاج سلسلة ثقة جهات الاتصال).
تمارين الوحدة 2
- لماذا فصلت Apple الاكتشاف (BLE) عن النقل (AWDL)؟ حلّل المقايضة بين الطاقة والأداء والخصوصية.
- ارسم ما الذي يحتاج المحاكي توليده/تقليده في كلٍّ من نقاط
/Discover,/Ask,/Upload. - لماذا يكون انتحال «Contacts Only» أصعب من «Everyone»؟ اربط الجواب بسلسلة الشهادات.