AWDL://CRSE MODULE 02 / 07 TOPIC AirDrop · STACK STATUS APP_LAYER SIGNAL_LIVE
// MODULE_02 APP_LAYER BLE+AWDL+mDNS+TLS

تشريح AirDrop الكامل.

AirDrop ليس «مجرّد نقل ملف»؛ هو مكدّس من أربع تقنيات تتعاون. BLE للاكتشاف، AWDL للنقل السريع، Bonjour/mDNS لتحديد الخدمة، وHTTPS/TLS للنقل الآمن. فهم هذا التقسيم يفسّر لماذا AirDrop آمن نسبياً، ولماذا يتسرّب منه ما يتسرّب.

لماذا هذا التقسيم الهجين؟

استخدام AWDL طوال الوقت مكلف للطاقة (يبقي الراديو يقفز). الحلّ الذكي:

CHANNEL_A

BLE — Bluetooth Low Energy

رخيص جداً للطاقة → يبقى يعمل دائماً للاكتشاف الأولي. لا يحمل بيانات ثقيلة.

CHANNEL_B

AWDL — Wi-Fi peer link

سريع لكنه مكلف → لا يُفعّل إلا بعد أن يثبت BLE وجود طرف مهتمّ وموثوق.

تدفّق المصافحة الكامل

FIG_2.1aAIRDROP · 4-STAGE HANDSHAKE
SENDER (S) RECEIVER (R) ① BLE DISCOVERY · always-on, low power BLE adv · Apple manufacturer data · type 0x05 + hashes match hash[ ] vs my contacts ② AWDL + IPv6 · spin up high-speed link R activates awdl0 + joins channel sequence Neighbor Discovery · IPv6 link-local fe80::/10 ③ BONJOUR / mDNS · what service, what port? advertise _airdrop._tcp.local + TXT record + TCP port S resolves R's IPv6 + port ④ HTTPS · mutual-TLS · the actual transfer POST /Discover   — "may I introduce myself?" POST /Ask   — sender name, icon, file metadata (plist) 202 Accepted   — user approves on R POST /Upload   — files as gzipped cpio archive 200 OK · transfer complete
المصافحة الكاملة لـ AirDrop: من إعلان BLE حتى آخر بايت من الملف. أربع مراحل، أربع تقنيات.

مرحلة BLE: الإعلان والـ Contact Hashes

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-256UNSALTED + 2 BYTES = guessable

# each hash:
  h_i = SHA-256(normalized_identifier)[0:2]
  where normalized_identifier ∈ {phone_E164, email_lowercase}
// VULN_SEED · MODULE_06

هذه الـ 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
// PRACTICAL_NOTE

OpenDrop (الوحدة 4) ومحاكي Google داخل Quick Share يستهدفان Everyone. Contacts Only يتطلّب سلسلة شهادات Apple التي لا يمكن تزويرها من خارج النظام البيئي.

اكتشاف الخدمة عبر mDNS/Bonjour

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

سلسلة الثقة والشهادات

FIG_2.6aAPPLE TRUST CHAIN · CONTACTS-ONLY MODE
Apple Root CA trust anchor Apple ID Validation CA issued by root Sender Identity Cert CN = sender's Apple ID SAN = phone hashes / email signed by ↑ Receiver Identity Cert CN = receiver's Apple ID SAN = phone hashes / email signed by ↑ mTLS handshake each side validates the other سلسلة مغلقة. شهادة هوية مزيّفة = فشل المصافحة. هذا ما يمنع المحاكي من انتحال Contacts Only.
سلسلة الثقة المغلقة لـ Apple. الشهادات تربط الـ hashes بهويات حقيقية، وكلتاهما موقّعة من سلطة Apple.

نقاط ارتكاز الوحدة 2

  • AirDrop = BLE (اكتشاف) + AWDL (رابط) + Bonjour (تحديد الخدمة) + HTTPS/mTLS (نقل آمن).
  • BLE يحمل hashes مختصرة غير مملّحة لهويات جهات الاتصال → نقطة ضعف الخصوصية.
  • النقل عبر 3 نقاط: /Discover, /Ask, /Upload؛ الملفات أرشيف cpio مضغوط داخل TLS.
  • وضع Everyone أسهل بكثير في المحاكاة من Contacts Only (لا يحتاج سلسلة ثقة جهات الاتصال).

تمارين الوحدة 2

  1. لماذا فصلت Apple الاكتشاف (BLE) عن النقل (AWDL)؟ حلّل المقايضة بين الطاقة والأداء والخصوصية.
  2. ارسم ما الذي يحتاج المحاكي توليده/تقليده في كلٍّ من نقاط /Discover, /Ask, /Upload.
  3. لماذا يكون انتحال «Contacts Only» أصعب من «Everyone»؟ اربط الجواب بسلسلة الشهادات.