1 पॉइंट द्वारा GN⁺ 2024-03-11 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • 2007 का पहला iPhone अमेरिका में AT&T subscription के बिना activate नहीं होता था, और iPhone Dev Team ने सिर्फ software के जरिए उसे दूसरे carriers पर इस्तेमाल करने का तरीका सार्वजनिक रूप से खोजा
  • इस काम को 6 milestones में समेटा गया: firmware decrypt करना, activation bypass करना, write access पाना, ARM/Mach-O toolchain बनाना, third-party apps चलाना, और carrier lock हटाना
  • शुरुआती breakthrough .ipsw के अंदर मौजूद ramdisk और encrypted DMG का analysis, और lockdownd activation verification में replay flaw का इस्तेमाल कर Home screen तक पहुंचना था
  • write access Recovery Mode में ramdisk और kernelcache load करने के बाद fstab और Services.plist बदलकर हासिल किया गया, जिससे /root/Media में बंद afcd की जगह root filesystem handle किया जा सके
  • final unlock baseband firmware को dump, patch और re-upload करने तथा AT+CLCK="PN",0,"00000000" चलाने वाले anySIM से automate हुआ; Apple ने 27 सितंबर 2007 को firmware v1.1.1 से जवाब दिया

2007 का iPhone और DevTeam का लक्ष्य

  • Apple ने 29 जून 2007 को iPhone लॉन्च किया, और उस समय कीमत 4GB मॉडल के लिए $499, 8GB मॉडल के लिए $599 थी
  • बॉक्स से निकला iPhone inactive state में था और सिर्फ Connect to iTunes screen दिखाता था; user को iTunes में AT&T membership लेनी पड़ती थी
  • subscription के बाद भी device AT&T पर locked रहता था
  • Canada में शुरुआती iPhone launch schedule नहीं था, और Apple ने 11 जुलाई 2008 को iPhone 3G के साथ Rogers से agreement किया
  • iPhone Dev Team इस लक्ष्य के साथ इकट्ठा हुई कि device को सिर्फ software के जरिए किसी भी carrier पर इस्तेमाल किया जा सके, और iphone.fiveforty.net blog पर progress अक्सर public की
    • 3 जुलाई 2007 को 00:00 से 21:00 तक 8 updates post किए गए

DevTeam के 6 milestones

  • locked device को सामान्य smartphone की तरह इस्तेमाल करने के लिए ये steps जरूरी थे
    • system समझने के लिए read access: Break DMG Password
    • inactive state से निकलना: Bypass Activation
    • system modify करने के लिए write access: Get Write Access
    • custom executable बनाने के लिए Working Toolchain
    • baseband को किसी भी carrier से connect करने योग्य बनाना: Unlock
    • पूरे process को automate करने वाली app: Enable Third-Party Applications
  • Wayback Machine के अनुसार 6 जुलाई 2007 तक 6 में से 2 milestones पूरे हो चुके थे, और यह journey 12 सितंबर 2007 को खत्म हुई
  • 25 सितंबर 2007 को crawled status page में Decrypt Firmware, Bypass Activation, Get Write Access, Get Working Toolchain, Enable Third-party Applications, Unlock Phone completed status में दिखाए गए

.ipsw analysis और filesystem read access

  • iTunes device restore के लिए .ipsw extension वाला iPhone Software archive download करता था, और यह file zip format में थी
  • iPhone1,1_1.0_1A543a_Restore.ipsw के अंदर img2 recovery images, baseband-related Firmware folder, iOS kernel kernelcache, और दो बड़े DMG files थे
    • पूरे iOS restore archive का size लगभग 105MiB था
  • पहला DMG 694-5259-38.dmg restore में इस्तेमाल होने वाला ramdisk था और encrypted नहीं था, इसलिए उसे dd से mount किया जा सकता था
  • ramdisk पूरा iOS filesystem नहीं था, लेकिन /private/etc/master.passwd में app चलाने वाले user mobile और बाकी processes चलाने वाले root के passwords देखने देता था
  • दूसरा DMG 694-5262-39.dmg normal execution के समय इस्तेमाल होने वाला iOS filesystem था और encrypted था
    • key ramdisk के /usr/sbin/asr में मिली
    • यह passphrase नहीं बल्कि key थी, इसलिए hdiutil इस्तेमाल नहीं किया जा सकता था; DevTeam ने अपना decryption tool vfdecrypt.c लिखा
    • decrypt करने के बाद runtime filesystem पूरे का read access मिल गया

Activation bypass

  • normal activation में iTunes, Apple server albert.apple.com, और iPhone का lockdownd शामिल होते हैं
    • iTunes device का DeviceID, IMEI, ICCID collect करता है
    • तीनों values को token में बांधकर Apple server को भेजता है
    • Apple server अपनी private key से token sign करके वापस भेजता है
    • USB पर इंतजार कर रहा lockdownd Apple public key से token verify करता है
    • अगर token Apple से आया हो और device info से match करे, तो state Activated में बदल जाती है
  • dvdjon के PhoneActivationServer ने iTunes को patch किया ताकि वह HTTPS की जगह HTTP से activation server access करे, और requests को अपने server पर redirect किया
  • अहम बात signed token नया बनाना नहीं थी, बल्कि successful activation से capture किया गया वही signed token input से स्वतंत्र रूप से वापस लौटाने वाला replay तरीका था
  • George Hotz की presentation के अनुसार lockdownd response में मौजूद DeviceID, IMEI, ICCID को actual values से match करके check नहीं करता था
  • DevTeam ने एक CLI tools बनाया जो plist से hardcoded signed token पढ़कर iPhone को भेजता था, और बाद में इसे iTunes के बिना काम करने वाले iPhoneInterface में improve किया

Write access और jailbreak

  • activated iPhone में iTunes से music और photos जैसी files upload की जा सकती थीं, लेकिन upload संभालने वाला process afcd /root/Media में chroot jail में बंद था
  • सिर्फ user partition read/write (rw) के रूप में mount था, और system partition read-only (r) था
  • लक्ष्य chroot jail से बाहर निकलकर system partition तक write करने योग्य बनाना था, और यहीं से jailbreaking शब्द आया
  • iPhone boot दो हिस्सों में बंटा था: normal mode और Recovery Mode
    • normal mode BootROM → LLB → iBoot → Kernel → Normal Mode के रूप में आगे बढ़ता है, और हर stage अगले stage की signature check करती है
    • Recovery Mode iBoot stage पर रुकता है, और iTunes ramdisk व kernelcache आदि को RAM में load कर restore mode में प्रवेश कराता है
  • DevTeam ने iTunesMobile.dll में iTunes द्वारा restore के दौरान filesystem में write करने का तरीका investigate किया और mount, umount, ditto जैसे commands पहचाने
  • iPHUC, iTunesMobile.dll के private methods से Recovery Mode device से communicate करने वाला CLI tool था
    • user device को Recovery Mode में डालता है
    • ramdisk device में transfer कर RAM में load किया जाता है
    • kernelcache भेजकर kernel को ramdisk की ओर point करते हुए boot किया जाता है
    • device Restore Mode में प्रवेश करता है
  • actual jailbreak process fstab और Services.plist modify करके किया गया
    • fstab में system partition को read-only की जगह rw के रूप में mount करने के लिए बदला गया
    • Services.plist में /root/Media के बजाय / को base मानने वाली दूसरी afcd service बनाई गई
    • reboot के बाद iTunes afcd2 के जरिए पूरा filesystem देख सकता था, और system व user partitions दोनों पर read/write संभव हो गया
  • बाद में activation और write access को Mac OS X desktop app INdependence से automate किया गया

Toolchain और third-party apps

  • toolchain और third-party app execution की process पर public जानकारी ज्यादा नहीं है, लेकिन कम से कम 12 लोग इस काम में शामिल थे
  • 19 जुलाई 2007 को ARM target करने वाली binutils toolchain पूरी हो गई, जिससे DevTeam अपने बनाए programs iPhone पर चला सकी
  • Nightwatch के ARM/Mach-O Toolchain से पहला independent Hello World application compile हुआ और iPhone पर चला
  • GeoHotz ने बताया कि Apple के बाहर Mach-O और ARM का combination पहले नहीं था और उसे खुद लिखना पड़ा
  • toolchain का एक और लक्ष्य iTunesMobile.so के private functions expose करने वाले MobileTerminal.h को reconstruct करना था, ताकि iTunes चलाए बिना afc से communicate किया जा सके
  • कुछ presentations कहती हैं कि kernel execl से पहले executable signature check करता है, लेकिन निष्कर्ष यह है कि पहले iPhone में ऐसा नहीं था और संभवतः यह v1.1.1 में introduce हुआ

Baseband unlock और anySIM

  • iPhone दो हिस्सों में बंटा था: iOS चलाने वाला smartphone हिस्सा और phone/modem की भूमिका निभाने वाला baseband हिस्सा
    • दोनों systems के पास अलग-अलग RAM, CPU, storage, firmware और oscillator थे
    • दोनों /dev/tty.baseband पर mounted UART line से AT commands exchange करते थे
  • unlock के लिए जरूरी AT command शुरू से ही ज्ञात था
    • AT+CLCK="PN",0,"xxxxxxxx"
    • xxxxxxxx Network Control Key यानी NCK है, और माना जाता था कि यह हर device के लिए unique है
    • attempts 3–10 बार तक limited थे, जिसके बाद firmware AT&T पर hard-lock हो सकता था
  • baseband में भी BootROM और trust chain थी, और signature verification लागू था
  • MuscleNerd ने समझाया कि baseband में DFU/Recovery Mode जैसा safety net नहीं है, इसलिए NOR या image से गलत छेड़छाड़ करने पर device permanent रूप से brick हो सकता है
  • जुलाई 2007 में DevTeam ने .ipsw के अंदर baseband को reverse engineer किया, और ramdisk में /usr/local/bin/bbupdater भी analyze कर नया baseband upload करने के commands समझे
  • पहला CLI iUnlock dumped firmware nor और ICE03.12.06_G.fls जैसी कई files मांगता था
  • बाद में ज्यादा simple anySIM app आई, जिसे phone पर डालकर एक button से चलाया जा सकता था
  • anySIM इस क्रम में काम करती है
    • /dev/tty.baseband खोलकर modem parameters set करती है
    • 4MiB size का baseband, यानी NOR, /tmp में dump करती है
    • baseband को RAM में load करती है
    • ramdisk से आया ICE03.12.06_G.fls secpack load करती है
    • RAM में baseband command patch करती है ताकि कोई भी NCK unlock allow कर दे
    • patched baseband को फिर upload करती है
    • AT+CLCK="PN",0,"00000000" और AT+CLCK="PN",2 चलाती है

-0x400 trick

  • patched baseband firmware को normally signature check pass नहीं करना चाहिए था, इसलिए upload fail होना चाहिए था
  • bypass ने minus 0x400 offset का इस्तेमाल किया
  • GeoHotz ने समझाया कि शुरुआती 0x400 bytes signature verify होने तक इस्तेमाल नहीं होते, इसलिए 0x400 bytes पहले से write शुरू कर देना काफी था
  • बाद में Hacker News readers की explanation के अनुसार baseband नया firmware maximum 0x800 byte chunks में receive करता है
    • पूरा 4MiB RAM में store करके checksum check करने और flash में write करने वाली structure नहीं थी
    • received bytes तुरंत flash में लिखे जाते थे, लेकिन पहले 0x400 bytes ही RAM में buffer होते थे
    • upload खत्म होने पर baseband checksum check करता था
    • fail होने पर buffered पहले 0x400 bytes flash में write नहीं होते और discard कर दिए जाते
  • -0x400 method पहले original firmware location से 0x400 bytes पहले garbage data लिखता है, फिर 4MiB firmware भेजता है
    • checksum fail होता है और garbage 0x400 bytes discard हो जाते हैं
    • लेकिन बाकी नया firmware पहले ही सही location पर flash हो चुका होता है

Completion और उसके बाद का cat-and-mouse game

  • full software unlock instructions 12 सितंबर 2007 को public किए गए
  • साथ में continent-wise success cases public किए गए, जिनमें Canada का case भी शामिल था
  • Apple ने तेजी से 27 सितंबर 2007 को iPhone firmware v1.1.1 release किया
  • DevTeam की progress status bar Decrypt 1.1.1, Get Write Access 1.1.1, Activate 1.1.1, Unlock 1.1.1, Enable Third-party Applications 1.1.1 पर reset हो गई
  • यहीं से Apple और iPhone hacking community के बीच cat-and-mouse game शुरू हुआ और आगे भी जारी रहा

1 टिप्पणियां

 
GN⁺ 2024-03-11
Hacker News टिप्पणियां
  • firmware updates में यह आम तरीका है। शुरू के 0x400 bytes एक header होते हैं, जिन्हें पिछले stage loader को इस stage को boot करने से पहले verify करना होता है, इसलिए वह data लेकर मनचाही तरह लिखता है, लेकिन header नहीं लिखता
    header नहीं है, इसलिए यह code execution तक नहीं जाता और safe रहता है; आखिर में पूरे signature को verify किया जाता है, और अगर वह pass हो जाए तो header लिखकर पूरी image को valid बना दिया जाता है
    यहां trick यह है कि जहां लिखना है, उससे 0x400 bytes पहले garbage 0x400 bytes लिखे जाएं। यह हिस्सा header माना जाता है, इसलिए सिर्फ buffer होता है और वास्तव में लिखा नहीं जाता, जबकि transfer data का बाकी हिस्सा इच्छित जगह पर सचमुच लिखा जाता है। बाद में signature verification fail हो जाता है, और वे शुरुआती 0x400 bytes जो असल में चाहिए भी नहीं थे, लिखे नहीं जाते—यानी काम सफल
    • जिस हिस्से को “recovery mode” कहा गया है, उस समय शायद उसे DFU mode कहते थे। यह “Device firmware update” था, और तब उसे “recovery” कहा जाता था या नहीं, 15 साल से ज्यादा हो जाने के बाद पक्का नहीं कह सकता
    • iZsh(https://x.com/izsh1911) भी शायद जानता हो, लेकिन 10 साल से ज्यादा पहले संपर्क टूट गया था
  • Fabien की post जैसी उम्मीद थी, वैसी ही अच्छी लिखी गई और बहुत detailed है। मुझे याद है कि उस समय इस iPhone protection mechanism का analysis होते देखा था, और उसके बाद से यह वाकई लंबा सफर रहा है
    data लिखने से पहले लगाए गए -0x400 shift को भी अगर कोई और समझा दे, तो बात पूरी तरह साफ हो जाएगी
    • -0x400 shift मोटे तौर पर कुछ इस तरह काम करता दिखता है
      Seek(fd, 0xA0020000 - 0x400); से उस जगह से 0x400 पहले seek किया जाता है जहां data लिखना है, और SendWrite(fd, foo, 0x400, false); से लिखे जाने वाले पहले 0x400 bytes को zero से भर दिया जाता है
      इसके बाद SendWrite(fd, fw, fwsize, true); से बाकी bytes को असली data से भरा जाता है और SendEndSecpack(fd); call किया जाता है। iPhone 0x400 bytes के बाद का data, यानी पूरा data जिसे लिखना था, copy करता है और फिर signature verification की कोशिश करता है, जो fail हो जाती है। अगर signature verification सफल होता, तो zero छोड़े गए पहले 0x400 bytes भी उसी समय copy हुए होते
  • इतिहास के record के लिए: iPHUC मैंने बनाया था, और यह नाम मैंने 19 साल की उम्र में रखा था। “nightwatch” nick इस्तेमाल करने वाला व्यक्ति early jailbreaking और “jailbreak” term गढ़ने वाले मुख्य लोगों में था, और उसके साथ काम करना सचमुच शानदार था
    मुझे लगता है कि PSP को unlock करने वाला PDF या TIFF exploit भी शायद उसी ने संभाला था। वह शायद South America में कहीं, शायद किसी university में काम करते हुए रहता था, लेकिन मुझे बस इतना ही पता है
    वह वाकई मजेदार दौर था और बहुत कुछ सीखने को मिला। हालांकि George Hotz ने Japanese documents तक access में मदद करने वाले कुछ लोगों की safety को, ऐसा न करने की बार-बार की requests के बावजूद, खतरे में डाल दिया; यह बहुत frustrate करने वाला था और आखिरकार dev team के project छोड़ने की वजह यही बनी
    • मुझे याद आता है कि ARM architecture समझने में मदद करने वालों में “pineapple” nick वाला एक व्यक्ति था। उस समय ARM अपेक्षाकृत नया था, इसलिए शुरुआती UIs में pineapple बहुत दिखता था। वे सचमुच अच्छे लोग थे, और अफसोस है कि संपर्क बनाए नहीं रख पाया
    • मानहानि के मुकदमे के risk के बिना जितना कहा जा सकता है, George Hotz ने लोगों की safety को कैसे खतरे में डाला, यह और सुनना चाहूंगा
  • DeviceID, IMEI, ICCID को जोड़कर token बनाना, उसे Apple server albert.apple.com पर भेजकर Apple की private key से sign करवाना, और फिर device पर lockdownd द्वारा Apple public key से verify करके status को “Activated” में बदलना—यह structure आज के OAuth का precursor जैसा लगता है
  • आह, अच्छे दिन थे। जब iPhone hacking आसान थी… आसान कहने से ज्यादा सही होगा कि आज की तुलना में बहुत ज्यादा आसान थी
  • flowchart किस tool से बनाया गया, जानने की उत्सुकता है। text-based जैसा दिखता है और शायद mermaid से बेहतर भी लग रहा है
    • मैं https://asciiflow.com इस्तेमाल करता हूं
    • यह Monodraw जैसा दिखता है। कुछ दिन पहले भी HN पर फिर से आया था
  • याद आने वाला एक किस्सा: जब iPhone OS 1.1 release ने jailbreak को रोक दिया था, तब मैं IRC channel में था। उस समय मिले तरीकों में से एक था 1.0.2 पर downgrade करना, phone को jailbreak करना, और फिर iTunes से accessible /root/Media directory को / पर symbolic link करना
    यह link upgrade के दौरान भी बना रहा, और बाद में firmware update करने पर rootfs तक access मिल गया। उस समय नाम iOS नहीं, iPhone OS था
  • शुरुआती iPhone में “S” शायद security के लिए था। पहले product को launch करने की कोशिश में बात कुछ ऐसी ही हो गई थी
    car manufacturers के साथ भी ऐसा ही है। कोई नया product या नया platform आए तो उसके शुरुआती कुछ model years नहीं खरीदना बेहतर है
    • “S” का मतलब क्या था, इस पर कोई consensus नहीं है, और Apple ने भी आधिकारिक तौर पर कभी नहीं बताया। “Successor”, “Second”, “Speed” सभी कुछ हद तक सही लगते हैं, लेकिन असली जवाब नहीं है
      आम तौर पर “S” base model की तुलना में minor upgrade दिखाने वाला marker था