[อัปเดต: ช่องโหว่ที่สองได้รับการแก้ไขแล้ว] ค้นพบข้อบกพร่องด้านความปลอดภัย Bootloader ที่สำคัญของ OnePlus 3/3T สองรายการ มีการแก้ไขหนึ่งรายการและอื่น ๆ ได้รับการแก้ไขแล้ว

พบข้อบกพร่องสองประการที่เกี่ยวข้องกับ bootloader สำหรับ OnePlus 3 และ OnePlus 3T อันหนึ่งได้รับการแก้ไขแล้ว ส่วนอีกอันกำลังได้รับการแก้ไข

นับตั้งแต่บทความนี้เผยแพร่ Oxygen OS เวอร์ชัน 4.0.3 ได้แก้ไขช่องโหว่ด้านความปลอดภัยที่สองที่กล่าวถึงในบทความนี้ ซึ่งก็คือ dm-verity

ก่อนที่จะเข้าสู่โลกมหัศจรรย์ของการรูท Android, ROM แบบกำหนดเอง, เคอร์เนล และการดัดแปลงอื่น ๆ คุณต้องปลดล็อคโปรแกรมโหลดบูตบนอุปกรณ์ของคุณก่อน

ในอุปกรณ์บางชนิด (โดยเฉพาะแบรนด์ของผู้ให้บริการ) สิ่งนี้ทำให้เกิดปัญหาเนื่องจากผู้ใช้ต้องจัดการกับอุปสรรคทางเทคนิคที่สำคัญก่อนจึงจะสามารถปลดล็อคโปรแกรมโหลดบูตได้ อุปกรณ์อื่น ๆ เช่นโทรศัพท์ Huawei กำหนดให้คุณต้องยื่นคำร้องต่อ OEM เพื่อขอรหัสปลดล็อค bootloader ที่ไม่ซ้ำใคร ซึ่งเป็นอุปสรรคเล็กน้อยในการเข้าใช้งาน แต่ก็ไม่ยากนัก ยิ่งไปกว่านั้นคือโทรศัพท์ซีรีส์ Google Nexus/Pixel หรือ OnePlus ที่ต้องการให้คุณทำเครื่องหมายที่ตัวเลือกในการตั้งค่านักพัฒนาซอฟต์แวร์เท่านั้น จากนั้นส่งบางอย่าง บูตเร็ว คำสั่ง

แต่ไม่ว่าการปลดล็อค bootloader ของคุณจะยากแค่ไหน สิ่งหนึ่งที่จะยังคงเหมือนเดิมเสมอ: ข้อกำหนดในการล้างข้อมูลอุปกรณ์เมื่อปลดล็อค การดำเนินการนี้ด้วยเหตุผลด้านความปลอดภัยที่ชัดเจน เนื่องจากสามารถแยกพาร์ติชันข้อมูลทั้งหมดของคุณได้อย่างง่ายดายเมื่อปลดล็อคโปรแกรมโหลดบูตแล้ว หน่วยงานที่เป็นอันตราย (ที่มีความรู้ด้านเทคนิค) สามารถแฟลชบูตการกู้คืนแบบกำหนดเองและแยกข้อมูลสำรองทั้งหมดของอุปกรณ์ของคุณหากพวกเขาสามารถเข้าถึงข้อมูลของคุณได้ นั่นเป็นสาเหตุที่การปลดล็อค Bootloader ของคุณถือเป็นความเสี่ยงด้านความปลอดภัย และเป็นสาเหตุที่ทำให้อุปกรณ์ของคุณถูกล้างข้อมูลหลังจากปลดล็อค สมมติว่าทุกอย่างเป็นไปตามที่ควร ผู้ใช้ทั่วไปควรจะปลอดภัยจากผู้โจมตีที่ปลดล็อคโปรแกรมโหลดบูตเพื่อหลีกเลี่ยงวิธีการล็อคมาตรฐานของ Android อย่างไรก็ตามทุกอย่างไม่เป็นไปตามแผน


OnePlus 3/3T Bootloader ปลดล็อกช่องโหว่

ชุดช่องโหว่ใหม่คือ เพิ่งเปิดเผย โดย โรอี้ เฮย์ (@roeehay) ตัวแรกอนุญาตให้ปลดล็อค bootloader ของ OnePlus 3/3T ได้ โดยไม่ต้องยืนยันจากผู้ใช้และไม่มีการรีเซ็ตเป็นค่าจากโรงงาน ช่องโหว่นี้มีป้ายกำกับ CVE-2017-5625ถือเป็นช่องโหว่ระดับร้ายแรงและส่งผลกระทบต่ออุปกรณ์ OnePlus 3/3T ทั้งหมดที่ทำงานบน OxygenOS 3.2-4.0.1 ผู้ใช้ที่ได้อัปเกรดเป็น OxygenOS 4.0.2 ที่เพิ่มขึ้น อัปเดต จะไม่ได้รับผลกระทบ โดยช่องโหว่ดังกล่าว ดังที่ Mr. Hay ได้เปิดเผยข้อบกพร่องนี้ให้ OnePlus ทราบเป็นการส่วนตัว ในวันที่ 23 มกราคม เพื่อให้พวกเขาสามารถแก้ไขปัญหาได้ทันที

ข้อบกพร่องนี้ทำงานโดยการส่งคำสั่ง fastboot ที่เป็นกรรมสิทธิ์และซ่อนไว้: fastboot oem 4F500301. โดยการส่งคำสั่งนี้ สถานะการล็อก bootloader ของผู้ใช้จะถูกข้ามไป (แม้ว่าจะไม่ได้เปิดใช้งาน "อนุญาต OEM Unlocking" ในการตั้งค่านักพัฒนาก็ตาม) อุปกรณ์ไม่แจ้งให้ผู้ใช้ทราบหรือล้างข้อมูลอุปกรณ์ตามที่ควรจะเป็น ที่จริงแล้ว อุปกรณ์จะยังคงรายงานว่า Bootloader ถูกล็อค! คำสั่ง fastboot อื่น fastboot oem 4F500302จะรีเซ็ตการตั้งค่า bootloader บางอย่าง และสามารถใช้เพื่อล็อคอุปกรณ์ที่ปลดล็อคแล้ว

มิสเตอร์เฮย์ค้นพบว่าคำสั่ง fastboot คำสั่งแรกจะกำหนดสิ่งที่เขาเรียกว่า "magicFlag" ซึ่งแทนที่การตรวจสอบที่กำหนดสถานะการล็อคของ bootloader เมื่อดำเนินการคำสั่งแฟลชหรือการลบ

// 'oem 4F500301' handler
intsub_918427F0()
{
magicFlag_dword_91989C10 = 1;
if ( dword_9198D804 != dword_9198D804 )
assert(1, dword_9198D804, dword_9198D804);
return sendOK((int)"", dword_9198D804);
}

ตัวจัดการแฟลช Fastboot


// 'flash' handler
constchar *__fastcall sub_91847EEC(char *partitionName, int *a2, int a3)
{
char *pname; // r5@1
...
pname = partitionName;
v4 = a2;
v5 = a3;
if ( returnTRUE1(partitionName, (int)a2) )
{
result = (constchar *)sub_918428F0(pname, v6);
if ( (result || magicFlag_dword_91989C10)
&& ((result = (constchar *)sub_91842880(pname, v10)) != 0 || magicFlag_dword_91989C10) )
{
result = (constchar *)sub_918428F0(pname, v10);
if ( !result || magicFlag_dword_91989C10 )
goto LABEL_7;
v8 = dword_9198D804;
if ( dword_9198D804 != dword_9198D804 )
goto LABEL_28;
v11 = "Critical partition flashing is not allowed";
}
else
{
v8 = dword_9198D804;
if ( dword_9198D804 != dword_9198D804 )
goto LABEL_28;
v11 = "Partition flashing is not allowed";
}
return (constchar *)FAIL2((int)v11, v10);
}
LABEL_7:
...
if ( *v4 != 0xED26FF3A )
{
if ( *v4 == 0xCE1AD63C )
cmd_flash_meta_img(pname, (unsigned int)v4, v5);
else
cmd_flash_mmc_img(pname, (int)v4, v5);
goto LABEL_10;
}
v7 = v4;
}
cmd_flash_mmc_sparse_img(pname, (int)v7, v5);
...
 }

อ่านเพิ่มเติม

ตัวจัดการการลบ Fastboot


// 'erase' handler
int __fastcall sub_91847118(char *partitionName, int a2, int a3)
{
 ...
v3 = partitionName;
v4 = returnTRUE1(partitionName, a2);
if ( !v4 )
{
LABEL_7:
...
if ( v4 )
{
if ( dword_9198D804 == dword_9198D804 )
return eraseParition(v3);
}
...
}
v4 = sub_918428F0(v3, v5);
if ( !v4 && !magicFlag_dword_91989C10 )
{
v6 = dword_9198D804;
if ( dword_9198D804 == dword_9198D804 )
{
v7 = "Partition erase is not allowed";
return FAIL2((int)v7, v5);
}
goto LABEL_23;
}
v4 = sub_91842880(v3, v5);
if ( !v4 && !magicFlag_dword_91989C10 )
{
v6 = dword_9198D804;
if ( dword_9198D804 == dword_9198D804 )
{
v7 = "Partition flashing is not allowed";
return FAIL2((int)v7, v5);
}
LABEL_23:
assert(v4, v5, v6);
}
v4 = sub_918428F0(v3, v5);
if ( !v4 || magicFlag_dword_91989C10 )
goto LABEL_7;
v6 = dword_9198D804;
...
v7 = "Critical partition erase is not allowed";
return FAIL2((int)v7, v5);
}

อ่านเพิ่มเติม

CVE-2017-5626 สามารถใช้งานได้ รันโค้ดเคอร์เนล. ผู้โจมตีสามารถแฟลชอิมเมจสำหรับบูตที่ต้องการได้ แม้ว่าหากพวกเขาแฟลชอิมเมจสำหรับบูตที่แก้ไขแล้ว Verified Boot ก็จะเริ่มทำงานและเตือนผู้ใช้ว่าตรวจพบการแก้ไขแล้ว วิธีหนึ่งที่สามารถหลีกเลี่ยงสิ่งนี้ได้คือการแฟลชอิมเมจสำหรับบูตรุ่นเก่าที่ยังไม่ได้แก้ไข ซึ่งเป็นอิมเมจที่มีช่องโหว่ที่เก่ากว่าซึ่งได้รับการแพตช์แล้ว ถึงกระนั้น "คำเตือน" ที่คุณได้รับจะคงอยู่เพียง 5 วินาทีเท่านั้น และมันจะยกเลิกตัวเองโดยอัตโนมัติและบูตเข้าสู่สถานะ VerifyBoot ซึ่งโค้ดของผู้โจมตีจะยังคงทำงานอยู่

นายเฮย์กล่าวว่ามีหลายวิธีที่สามารถใช้ประโยชน์จากข้อบกพร่องนี้ในลักษณะที่เป็นอันตรายได้ ตัวอย่างเช่น เขาแก้ไขอิมเมจสำหรับบูตเพื่อตั้งค่าโหมด SELinux อนุญาต รวมถึงรวมการเข้าถึง ADB โดยอัตโนมัติเมื่อบูตเครื่อง จากนั้น หลังจากที่ใช้ช่องโหว่นี้เพื่อแฟลชอิมเมจสำหรับบูตที่แก้ไขแล้ว เขาก็สามารถเข้าถึง รูทเชลล์ก่อนที่ผู้ใช้จะสามารถป้อนข้อมูลรับรองได้

OnePlus3:/ # id
uid=0(root) gid=0(root) groups=0(root),1004(input),1007(log),1011(adb),
1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),
3003(inet),3006(net_bw_stats),3009(readproc) context=u: r: su: s0

OnePlus3:/ # getenforce
Permissive

ไม่จำเป็นต้องพูดนี่ค่อนข้างจริงจัง อุปกรณ์ที่ถูกขโมยหรือถูกบล็อกที่คุณคิดว่าปลอดภัยเนื่องจากมาตรการรักษาความปลอดภัยโดยทั่วไปของคุณสามารถเอาชนะได้อย่างสมบูรณ์โดยใช้ช่องโหว่นี้


ช่องโหว่ OnePlus 3/3T SELinux

ช่องโหว่ที่สองที่มีป้ายกำกับ CVE-2017-5624, ส่งผลกระทบ OxygenOS ทุกรุ่น และอนุญาตให้ใครคนหนึ่ง ปิดการใช้งาน dm-verity นายเฮย์ได้เปิดเผยช่องโหว่นี้ให้ทีมงาน OnePlus Security ทราบแล้ว 16 มกราคมแต่ควรสังเกตว่า XDA Senior Member th3g1zค้นพบช่องโหว่นี้โดยอิสระ บน 23 มกราคม. เราได้พูดคุยกับ OnePlus ที่มี ยืนยันว่าพวกเขารับทราบแล้วและจะแก้ไขช่องโหว่ที่สองนี้ ในการอัปเดตในอนาคต

การโจมตีนี้ทำได้ค่อนข้างง่ายเช่นกัน เราต้องการเพียงคำสั่ง fastboot คำสั่งเดียวเพื่อปิดการใช้งาน (หรือเปิดใช้งาน) dm-verity: fastboot oem disable dm-verity. หากต้องการเปิดใช้งาน เพียงแค่ออก fastboot oem enable dm-verity. ตัวจัดการสำหรับคำสั่งนี้ ซึ่งนำมาจากดัมพ์ของ bootloader มีแสดงอยู่ด้านล่าง


// 'oem disable_dm_verity' handler
intsub_9183B8EC()
{
int v0; // r0@1
int v1; // r1@1

dmVerity_dword_91960740 = 0;
v0 = sub_91845E10("ANDROID-BOOT!");
if ( dword_9198D804 != dword_9198D804 )
assert(v0, v1, dword_9198D804);
return sendOK((int)"", v1);
}

การออกคำสั่งนี้จะตั้งค่าสถานะ ซึ่ง Mr. Hay เรียกว่า dmVerity ซึ่งใช้โดยโปรแกรมโหลดบูตเพื่อส่งอาร์กิวเมนต์บรรทัดคำสั่งเคอร์เนลซึ่งสามารถเปิดหรือปิดใช้งาน dm-verity

สามารถใช้ร่วมกับช่องโหว่แรกในการรันโค้ดสิทธิพิเศษสูงบน OnePlus 3/3T โดยไม่ได้รับความยินยอมจากผู้ใช้ - และสามารถเข้าถึงข้อมูลของผู้ใช้ได้ ตัวอย่างเช่น มิสเตอร์เฮย์สามารถติดตั้งแอปพลิเคชันลงใน /system/priv-app ซึ่งทำให้แอปพลิเคชันถูกเพิ่มลงในโดเมน priv-app ซึ่งช่วยให้แอปพลิเคชันที่เป็นอันตรายสามารถเข้าถึงฟังก์ชันที่มีสิทธิพิเศษสูงบนอุปกรณ์ได้ คุณเฮย์สาธิตช่องโหว่ทั้งสองนี้ที่ถูกนำไปใช้พร้อมกันในวิดีโอด้านล่าง อย่างที่คุณเห็น เมื่อเขาบูทอุปกรณ์ แอปพลิเคชันที่เขาสร้างขึ้นจะแสดงว่ามีการติดตั้งไว้ล่วงหน้าแล้ว


บทสรุปและหมายเหตุจาก OnePlus

การละเมิดช่องโหว่ด้านความปลอดภัยทั้งสองนี้อาจเป็นสิ่งที่น่ากลัว เราขอชมเชยคุณ Hay ที่เปิดเผยช่องโหว่เหล่านี้เป็นการส่วนตัวและรวดเร็วแก่ OnePlus ถึงกระนั้น เราก็อดไม่ได้ที่จะตื่นตระหนกว่าคำสั่ง fastboot ดังกล่าวสามารถเข้าถึงได้บนอุปกรณ์เหล่านี้ เมื่อเราเขียนคำแนะนำเกี่ยวกับวิธีการ ค้นพบคำสั่ง fastboot ที่ซ่อนอยู่ความตั้งใจของเราคือการแจ้งให้ผู้ใช้ทราบว่าอาจมีคำสั่งที่น่าสนใจที่พวกเขาสามารถใช้เพื่อปรับปรุงประสบการณ์ของตนได้ เราไม่เคยคิดเลยว่าคำสั่งที่มีสิทธิพิเศษสูงเช่นนี้จะอยู่ในโค้ด bootloader. ส่วน "ทำไม" คำสั่ง fastboot เหล่านี้รวมอยู่ในเฟิร์มแวร์ เราได้รับ "ไม่มีความเห็น." 

สำหรับตอนนี้ หากคุณยังไม่ได้อัปเดต OnePlus 3/3T ทันทีที่ Oxygen OS แต่ละรุ่นออกวางจำหน่าย เราขอแนะนำให้คุณ อัปเดตทันที การอัปเดตเป็น Oxygen OS 4.0.2 จะป้องกันคุณจากช่องโหว่แรก แต่เราจะต้องรอจนกว่า OnePlus เปิดตัวการอัปเดตที่จะแก้ไขช่องโหว่ที่สองก่อนที่เราจะบอกว่าคุณปลอดภัยจากสิ่งเหล่านี้โดยสมบูรณ์ การหาประโยชน์ เราจะต้องคอยจับตาดูการหาประโยชน์ประเภทนี้ต่อไปในอนาคต


ที่มา: โรอี้ เฮย์