วิธีที่ DevTeam พิชิต iPhone
(fabiensanglard.net)- iPhone รุ่นแรกในปี 2007 ไม่สามารถเปิดใช้งานได้หากไม่สมัครใช้งาน AT&T ในสหรัฐฯ และ iPhone Dev Team ก็เดินหน้าค้นหาวิธีใช้งานกับเครือข่ายอื่นด้วยซอฟต์แวร์ล้วนอย่างเปิดเผย
- งานนี้สรุปได้เป็น 6 หมุดหมาย ตั้งแต่การถอดรหัสเฟิร์มแวร์, การข้ามขั้นตอนการเปิดใช้งาน, การได้สิทธิ์เขียน, การสร้าง toolchain สำหรับ ARM/Mach-O, การรันแอปจากภายนอก, ไปจนถึงการปลดล็อกผู้ให้บริการเครือข่าย
- จุดทะลวงแรก ๆ คือการวิเคราะห์ ramdisk และ DMG ที่เข้ารหัสภายใน
.ipswรวมถึงการใช้ช่องโหว่การส่งซ้ำในการตรวจสอบการเปิดใช้งานของlockdowndเพื่อเข้าถึงหน้าจอโฮม - สิทธิ์เขียนได้มาจากการโหลด ramdisk และ kernelcache ใน Recovery Mode แล้วแก้
fstabกับServices.plistเพื่อให้จัดการ root filesystem ได้ แทนafcdที่เดิมถูกกักไว้ใน/root/Media - การปลดล็อกขั้นสุดท้ายถูกทำให้เป็นอัตโนมัติด้วย anySIM ที่ดัมพ์ แพตช์ และอัปโหลดเฟิร์มแวร์ baseband ใหม่ พร้อมรัน
AT+CLCK="PN",0,"00000000"และ Apple ก็ออก firmware v1.1.1 มาตอบโต้ในวันที่ 27 กันยายน 2007
iPhone ปี 2007 และเป้าหมายของ DevTeam
- Apple เปิดตัว iPhone เมื่อวันที่ 29 มิถุนายน 2007 โดยตอนนั้นราคาอยู่ที่ $499 สำหรับรุ่น 4GB และ $599 สำหรับรุ่น 8GB
- iPhone ที่แกะออกจากกล่องจะอยู่ในสถานะยังไม่เปิดใช้งานและแสดงเพียงหน้าจอ
Connect to iTunesโดยผู้ใช้ต้องสมัคร สมาชิก AT&T ผ่าน iTunes - แม้สมัครแล้ว ตัวเครื่องก็ยังคงถูกล็อกไว้กับ AT&T
- แคนาดาไม่มีแผนวางจำหน่าย iPhone รุ่นแรกในช่วงต้น และ Apple ก็เพิ่งตกลงกับ Rogers พร้อม iPhone 3G ในวันที่ 11 กรกฎาคม 2008
- iPhone Dev Team รวมตัวกันโดยมีเป้าหมายให้ใช้งานเครื่องกับผู้ให้บริการรายใดก็ได้ด้วยซอฟต์แวร์ล้วน และมักอัปเดตความคืบหน้าผ่านบล็อก iphone.fiveforty.net
- วันที่ 3 กรกฎาคม 2007 มีการโพสต์อัปเดต 8 ครั้งตั้งแต่เที่ยงคืนถึง 21:00 น.
6 หมุดหมายของ DevTeam
- การทำให้เครื่องที่ถูกล็อกใช้งานได้เหมือนสมาร์ตโฟนทั่วไป ต้องผ่านขั้นตอนต่อไปนี้
- สิทธิ์อ่านเพื่อทำความเข้าใจระบบ: Break DMG Password
- หลุดจากสถานะยังไม่เปิดใช้งาน: Bypass Activation
- สิทธิ์เขียนเพื่อแก้ไขระบบ: Get Write Access
- Working Toolchain สำหรับสร้างไฟล์รันแบบกำหนดเอง
- Unlock เพื่อให้ baseband เชื่อมต่อกับผู้ให้บริการรายใดก็ได้
- แอปสำหรับทำทั้งกระบวนการให้เป็นอัตโนมัติ: Enable Third-Party Applications
- ตามข้อมูลจาก Wayback Machine ณ วันที่ 6 กรกฎาคม 2007 มีหมุดหมายสำเร็จแล้ว 2 จาก 6 และการเดินทางนี้สิ้นสุดลงในวันที่ 12 กันยายน 2007
- หน้าสถานะที่ถูกเก็บเมื่อวันที่ 25 กันยายน 2007 แสดงว่า
Decrypt Firmware,Bypass Activation,Get Write Access,Get Working Toolchain,Enable Third-party Applications,Unlock Phoneเสร็จสมบูรณ์แล้ว
การวิเคราะห์ .ipsw และการอ่านไฟล์ระบบ
- iTunes ดาวน์โหลด iPhone Software archive นามสกุล
.ipswสำหรับกู้คืนอุปกรณ์ และไฟล์นี้มีรูปแบบเป็น zip - ภายใน
iPhone1,1_1.0_1A543a_Restore.ipswมีอิมเมจกู้คืนแบบimg2, โฟลเดอร์Firmwareที่เกี่ยวข้องกับ baseband,kernelcacheซึ่งเป็นเคอร์เนล iOS, และไฟล์ DMG ขนาดใหญ่ 2 ไฟล์- ขนาดรวมของ archive สำหรับกู้คืน iOS อยู่ที่ประมาณ 105MiB
- DMG แรก
694-5259-38.dmgเป็น ramdisk ที่ใช้ตอนกู้คืน และไม่ได้เข้ารหัส จึงสามารถเมานต์ด้วยddได้ - แม้ ramdisk จะไม่ใช่ไฟล์ระบบ iOS ทั้งหมด แต่ก็ทำให้ตรวจสอบรหัสผ่านของผู้ใช้
mobileที่ใช้รันแอป และrootที่ใช้รันโปรเซสอื่น ๆ ได้จาก/private/etc/master.passwd - DMG ที่สอง
694-5262-39.dmgเป็นไฟล์ระบบ iOS สำหรับการบูตปกติและถูกเข้ารหัสไว้- พบคีย์อยู่ใน
/usr/sbin/asrบน ramdisk - เนื่องจากเป็นคีย์ไม่ใช่ passphrase จึงใช้
hdiutilไม่ได้ และ DevTeam ก็เขียนเครื่องมือถอดรหัสของตัวเองชื่อvfdecrypt.c - หลังถอดรหัสแล้ว จึงได้ สิทธิ์อ่าน ไฟล์ระบบทั้งหมดขณะรันจริง
- พบคีย์อยู่ใน
การข้ามขั้นตอนการเปิดใช้งาน
- การเปิดใช้งานตามปกติเกี่ยวข้องกับ iTunes, เซิร์ฟเวอร์ Apple
albert.apple.com, และlockdowndบน iPhone- iTunes รวบรวม
DeviceID,IMEI,ICCIDของอุปกรณ์ - ส่งค่าทั้งสามที่รวมเป็นโทเคนไปยังเซิร์ฟเวอร์ Apple
- เซิร์ฟเวอร์ Apple ลงลายเซ็นโทเคนด้วย private key แล้วส่งกลับ
lockdowndที่รออยู่ผ่าน USB จะตรวจสอบโทเคนด้วย public key ของ Apple- หากโทเคนมาจาก Apple และตรงกับข้อมูลเครื่อง สถานะจะเปลี่ยนเป็น Activated
- iTunes รวบรวม
PhoneActivationServerของ dvdjon แพตช์ iTunes ให้เข้าถึงเซิร์ฟเวอร์เปิดใช้งานผ่าน HTTP แทน HTTPS และเปลี่ยนปลายทางคำขอไปยังเซิร์ฟเวอร์ของตัวเอง- แก่นสำคัญคือไม่ได้สร้าง signed token ใหม่ แต่ใช้วิธีส่งซ้ำโดยคืน signed token เดิมที่ดักจับมาจากการเปิดใช้งานที่สำเร็จแล้ว โดยไม่สนค่าขาเข้า
- ตามคำอธิบายของ George Hotz นั้น
lockdowndไม่ได้ตรวจว่าค่าDeviceID,IMEI,ICCIDในคำตอบตรงกับค่าจริงของอุปกรณ์หรือไม่ - DevTeam สร้าง CLI
toolsที่อ่าน signed token แบบฮาร์ดโค้ดจาก plist แล้วส่งไปยัง iPhone และภายหลังพัฒนาเป็นiPhoneInterfaceที่ทำงานได้โดยไม่ต้องใช้ iTunes
สิทธิ์เขียนและการเจลเบรก
- iPhone ที่เปิดใช้งานแล้วสามารถอัปโหลดไฟล์อย่างเพลงและรูปผ่าน iTunes ได้ แต่โปรเซส
afcdที่รับหน้าที่อัปโหลดถูกขังอยู่ใน chroot jail ที่/root/Media - มีเพียงพาร์ทิชันผู้ใช้เท่านั้นที่เมานต์แบบอ่าน/เขียน (
rw) ส่วนพาร์ทิชันระบบเป็นแบบอ่านอย่างเดียว (r) - เป้าหมายคือหลุดจาก chroot jail และเขียนถึงพาร์ทิชันระบบได้ ซึ่งเป็นที่มาของคำว่า jailbreaking
- การบูตของ iPhone แบ่งเป็นโหมดปกติและ Recovery Mode
- โหมดปกติเป็นลำดับ BootROM → LLB → iBoot → Kernel → Normal Mode โดยแต่ละขั้นจะตรวจสอบลายเซ็นของขั้นถัดไป
- Recovery Mode จะหยุดที่ขั้น iBoot และ iTunes จะโหลด ramdisk, kernelcache ฯลฯ เข้า RAM เพื่อเข้าสู่โหมดกู้คืน
- DevTeam ตรวจสอบวิธีที่ iTunes เขียนลงไฟล์ระบบระหว่างการกู้คืนจาก
iTunesMobile.dllและพบคำสั่งอย่างmount,umount,ditto iPHUCเป็นเครื่องมือ CLI ที่ใช้เมธอดภายในที่ไม่เปิดเผยของiTunesMobile.dllเพื่อสื่อสารกับอุปกรณ์ใน Recovery Mode- ผู้ใช้ทำให้อุปกรณ์เข้าสู่ Recovery Mode
- ส่ง ramdisk ไปยังอุปกรณ์และโหลดเข้า RAM
- ส่ง kernelcache แล้วบูตเคอร์เนลให้ชี้ไปยัง ramdisk
- อุปกรณ์จะเข้าสู่ Restore Mode
- ขั้นตอนเจลเบรกจริงเกิดจากการแก้
fstabและServices.plist- ใน
fstabเปลี่ยนให้พาร์ทิชันระบบเมานต์แบบ rw แทนอ่านอย่างเดียว - ใน
Services.plistสร้างบริการafcdตัวที่สองที่อ้างอิงจาก/แทน/root/Media - หลังรีบูต iTunes จะมองเห็นไฟล์ระบบทั้งหมดผ่าน
afcd2และทั้งพาร์ทิชันระบบกับผู้ใช้ก็อ่าน/เขียนได้
- ใน
- หลังจากนั้นการเปิดใช้งานและการได้สิทธิ์เขียนก็ถูกทำให้เป็นอัตโนมัติผ่านแอปเดสก์ท็อป Mac OS X ชื่อ INdependence
Toolchain และแอปจากภายนอก
- มีข้อมูลสาธารณะเกี่ยวกับขั้นตอนสร้าง toolchain และการรันแอปภายนอกไม่มากนัก แต่มีผู้ร่วมงานอย่างน้อย 12 คน
- เมื่อวันที่ 19 กรกฎาคม 2007 binutils toolchain ที่ตั้งเป้า ARM ก็เสร็จสมบูรณ์ ทำให้ DevTeam สามารถรันโปรแกรมที่พวกเขาสร้างเองบน iPhone ได้
ARM/Mach-O Toolchainของ Nightwatch ถูกใช้คอมไพล์แอปHello Worldแบบอิสระตัวแรกและรันบน iPhone ได้สำเร็จ- GeoHotz อธิบายว่าก่อนหน้านั้นไม่มีชุดผสม Mach-O กับ ARM นอก Apple จึงต้องเขียนขึ้นมาเอง
- อีกเป้าหมายหนึ่งของ toolchain คือการสร้าง
MobileTerminal.hขึ้นใหม่เพื่อเปิดเผยฟังก์ชันภายในที่ไม่เปิดเผยของiTunesMobile.soและสื่อสารกับafcได้โดยไม่ต้องรัน iTunes - แม้บางการบรรยายจะบอกว่าเคอร์เนลตรวจลายเซ็นไฟล์รันก่อน
execlแต่สรุปได้ว่า iPhone รุ่นแรกยังไม่ทำเช่นนั้น และน่าจะเพิ่งถูกนำมาใช้ใน v1.1.1
การปลดล็อก baseband และ anySIM
- iPhone แยกออกเป็นส่วนสมาร์ตโฟนที่รัน iOS และส่วน baseband ที่ทำหน้าที่โทรศัพท์/โมเด็ม
- ทั้งสองระบบมี RAM, CPU, สตอเรจ, เฟิร์มแวร์ และออสซิลเลเตอร์ของตัวเอง
- ทั้งคู่สื่อสารกันผ่านสาย UART ที่เมานต์เป็น
/dev/tty.basebandโดยใช้คำสั่ง AT
- คำสั่ง AT ที่จำเป็นต่อการปลดล็อกเป็นที่รู้กันตั้งแต่ช่วงต้น
AT+CLCK="PN",0,"xxxxxxxx"xxxxxxxxคือ NCK หรือ Network Control Key ซึ่งเชื่อว่ามีค่าเฉพาะต่อเครื่อง- จำนวนครั้งที่ลองถูกจำกัดไว้ที่ 3 ถึง 10 ครั้ง และหลังจากนั้นเฟิร์มแวร์อาจล็อกกับ AT&T แบบถาวร
- baseband เองก็มี BootROM และ chain of trust พร้อมการตรวจสอบลายเซ็นเช่นกัน
- MuscleNerd อธิบายว่า baseband ไม่มีตาข่ายนิรภัยอย่าง DFU/Recovery Mode ดังนั้นถ้าแตะ NOR หรืออิมเมจพลาด อุปกรณ์อาจพังถาวรได้
- ในเดือนกรกฎาคม 2007 DevTeam ทำ reverse engineer baseband ภายใน
.ipswและวิเคราะห์/usr/local/bin/bbupdaterบน ramdisk เพื่อหาคำสั่งสำหรับอัปโหลด baseband ใหม่ - CLI ตัวแรก
iUnlockต้องใช้หลายไฟล์ เช่น เฟิร์มแวร์ที่ดัมพ์ออกมาnorและICE03.12.06_G.fls - ต่อมามีแอป
anySIMที่ใช้งานง่ายกว่า เพียงนำขึ้นเครื่องแล้วกดปุ่มเดียวก็รันได้ anySIMทำงานตามลำดับดังนี้- เปิด
/dev/tty.basebandและตั้งค่าพารามิเตอร์ของโมเด็ม - ดัมพ์ baseband ขนาด 4MiB หรือก็คือ NOR ไปยัง
/tmp - โหลด baseband เข้า RAM
- โหลด secpack
ICE03.12.06_G.flsจาก ramdisk - แพตช์คำสั่งของ baseband ใน RAM เพื่อให้ NCK ใด ๆ ก็ปลดล็อกได้
- อัปโหลด baseband ที่แพตช์แล้วกลับเข้าไป
- รัน
AT+CLCK="PN",0,"00000000"และAT+CLCK="PN",2
- เปิด
ทริก -0x400
- ตามปกติแล้วเฟิร์มแวร์ baseband ที่ถูกแพตช์ไม่ควรผ่านการตรวจลายเซ็น และการอัปโหลดก็ควรล้มเหลว
- วิธีข้ามคือใช้ออฟเซ็ต minus 0x400
- GeoHotz อธิบายว่า
0x400ไบต์แรกจะยังไม่ถูกใช้งานจนกว่าจะตรวจลายเซ็นเสร็จ ดังนั้นจึงเริ่มเขียนจากตำแหน่งก่อนหน้า0x400ไบต์ได้ - ต่อมาจากคำอธิบายของผู้อ่าน Hacker News ระบุว่า baseband รับเฟิร์มแวร์ใหม่เป็นชังก์ขนาดสูงสุด
0x800ไบต์- ไม่ได้เก็บทั้ง 4MiB ไว้ใน RAM ก่อนแล้วค่อยตรวจ checksum และเขียนลงแฟลช
- ไบต์ที่รับมาจะถูกเขียนลงแฟลชทันที แต่
0x400ไบต์แรกเท่านั้นที่จะถูกบัฟเฟอร์ไว้ใน RAM - เมื่ออัปโหลดเสร็จ baseband จะตรวจ checksum
- ถ้าล้มเหลว
0x400ไบต์แรกที่บัฟเฟอร์ไว้จะไม่ถูกเขียนลงแฟลชและถูกทิ้งไป
- วิธี
-0x400คือเริ่มจากเขียนข้อมูลขยะลงไปก่อนหน้าตำแหน่งเฟิร์มแวร์จริง0x400ไบต์ แล้วค่อยส่งเฟิร์มแวร์ 4MiB ตามมา- checksum จะล้มเหลว ทำให้ข้อมูลขยะ
0x400ไบต์ถูกทิ้ง - แต่เฟิร์มแวร์ใหม่ส่วนที่เหลือได้ถูกเขียนลงแฟลชในตำแหน่งที่ถูกต้องไปแล้ว
- checksum จะล้มเหลว ทำให้ข้อมูลขยะ
ความสำเร็จและเกมแมวจับหนูหลังจากนั้น
- คำแนะนำการปลดล็อกด้วยซอฟต์แวร์ทั้งหมดถูกเผยแพร่เมื่อวันที่ 12 กันยายน 2007
- มีการเผยแพร่กรณีใช้งานสำเร็จจากหลายทวีปพร้อมกัน และมีกรณีจากแคนาดารวมอยู่ด้วย
- Apple ออก iPhone firmware v1.1.1 อย่างรวดเร็วในวันที่ 27 กันยายน 2007
- แถบสถานะความคืบหน้าของ DevTeam ถูกรีเซ็ตเป็น
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 - จากจุดนั้น เกมแบบ แมวจับหนู ระหว่าง Apple กับชุมชนแฮ็ก iPhone ก็เริ่มต้นขึ้นและดำเนินต่อไปหลังจากนั้น
1 ความคิดเห็น
ความเห็นจาก Hacker News
เมื่อไม่มีเฮดเดอร์ก็จะไม่ไปสู่การรันโค้ดจึงปลอดภัย แล้วตอนท้ายจะตรวจสอบลายเซ็นของทั้งชุด หากผ่านก็เขียนเฮดเดอร์เพื่อทำให้อิมเมจทั้งหมดใช้งานได้
กลเม็ดตรงนี้คือเขียนขยะ 0x400 ไบต์ก่อนตำแหน่งที่ต้องการเขียนจริงอยู่ 0x400 ไบต์ ส่วนนี้จะถูกมองเป็นเฮดเดอร์จึงแค่ถูกบัฟเฟอร์ไว้และไม่ถูกเขียนจริง ส่วนข้อมูลที่ส่งที่เหลือจะถูกเขียนลงตำแหน่งที่ต้องการจริง ๆ หลังจากนั้นการตรวจสอบลายเซ็นจะล้มเหลว และ 0x400 ไบต์แรกที่เดิมไม่ต้องการก็จะไม่ถูกเขียน จึงถือว่าสำเร็จ
ส่วนการ ขยับ -0x400 ก่อนเขียนข้อมูล ถ้ามีใครอธิบายเพิ่มอีกหน่อยก็น่าจะเข้าใจครบถ้วน
ใช้
Seek(fd, 0xA0020000 - 0x400);เพื่อเลื่อนไปก่อนตำแหน่งที่จะเขียนข้อมูลจริง 0x400 ไบต์ แล้วใช้SendWrite(fd, foo, 0x400, false);เพื่อเติม 0 ลงใน 0x400 ไบต์แรก ที่อยากเขียนจากนั้นใช้
SendWrite(fd, fw, fwsize, true);เพื่อใส่ไบต์ที่เหลือด้วยข้อมูลจริง แล้วเรียกSendEndSecpack(fd);ตัว iPhone จะคัดลอกข้อมูลหลัง 0x400 ไบต์ นั่นคือข้อมูลทั้งหมดที่เราอยากเขียน แล้วลองตรวจสอบลายเซ็นและล้มเหลว หากการตรวจสอบลายเซ็นสำเร็จ 0x400 ไบต์แรกที่ปล่อยไว้เป็น 0 ก็คงจะถูกคัดลอกในตอนนั้นด้วยเท่าที่จำได้ เขาน่าจะเป็นคนจัดการ PDF หรือ TIFF exploit ที่ใช้ปลดล็อก PSP ด้วย เหมือนจะอาศัยและทำงานอยู่แถวมหาวิทยาลัยสักแห่งในอเมริกาใต้ แต่ฉันรู้แค่นั้น
มันเป็นช่วงเวลาที่สนุกมากและได้เรียนรู้อะไรเยอะมาก เพียงแต่ George Hotz ทำให้ความปลอดภัยของบางคนที่ช่วยเขาเข้าถึงเอกสารภาษาญี่ปุ่นตกอยู่ในความเสี่ยง ทั้งที่มีการขอซ้ำแล้วซ้ำเล่าว่าอย่าทำแบบนั้น ซึ่งน่าหงุดหงิดมาก และสุดท้ายก็เป็นเหตุผลที่ dev team ถอนตัวจากโปรเจกต์
lockdowndบนอุปกรณ์จะตรวจสอบด้วยกุญแจสาธารณะของ Apple แล้วเปลี่ยนสถานะเป็น “Activated” ฟังดูเหมือนบรรพบุรุษของ OAuth ในทุกวันนี้/root/Mediaที่ iTunes เข้าถึงได้ ไปยัง/ลิงก์นี้ยังคงอยู่ระหว่างการอัปเกรด และหลังจากนั้นเมื่ออัปเดตเฟิร์มแวร์ก็จะเข้าถึง
rootfsได้ ตอนนั้นมันยังไม่ชื่อ iOS แต่ชื่อ iPhone OSคล้ายกับผู้ผลิตรถยนต์เหมือนกัน คือไม่ควรซื้อ รุ่นปีแรก ๆ ของสินค้าหรือแพลตฟอร์มใหม่
โดยทั่วไป “S” มักเป็นสัญลักษณ์ว่ามีการ อัปเกรดเล็กน้อย จากรุ่นพื้นฐาน