[Pembaruan: Kerentanan Kedua Ditambal] Dua Kelemahan Keamanan Bootloader OnePlus 3/3T Kritis Ditemukan, Satu Ditambal dan Lainnya Telah Diatasi

Dua kelemahan terkait bootloader telah ditemukan untuk OnePlus 3 dan OnePlus 3T. Yang satu sudah diperbaiki, yang satu lagi sedang ditangani.

Sejak artikel ini diterbitkan, Oxygen OS versi 4.0.3 telah menambal kerentanan keamanan kedua yang dibahas dalam artikel ini, yaitu kerentanan dm-verity.

Sebelum memasuki dunia menakjubkan rooting Android, ROM khusus, kernel, dan modifikasi lainnya, Anda harus terlebih dahulu membuka kunci bootloader pada perangkat Anda.

Pada beberapa perangkat (terutama yang bermerek operator), hal ini menimbulkan masalah karena pengguna harus menghadapi kendala teknis yang signifikan sebelum mereka dapat membuka kunci bootloader. Perangkat lain seperti ponsel Huawei mengharuskan Anda mengajukan petisi kepada OEM untuk mendapatkan kode buka kunci bootloader yang unik - sebuah hambatan kecil untuk masuk, namun tidak terlalu sulit. Yang lebih baik lagi adalah ponsel seri Google Nexus/Pixel atau OnePlus yang hanya mengharuskan Anda mencentang opsi di Pengaturan Pengembang lalu mengirimkan beberapa boot cepat perintah.

Namun betapapun sulitnya membuka kunci bootloader Anda, satu hal yang akan selalu tetap: persyaratan untuk menghapus perangkat saat membuka kunci. Hal ini dilakukan untuk alasan keamanan yang jelas, karena seluruh partisi data Anda dapat dengan mudah diekstraksi setelah bootloader dibuka kuncinya. Entitas jahat (yang memiliki pengetahuan teknis) dapat mem-flash boot pemulihan khusus dan mengekstrak cadangan lengkap perangkat Anda jika mereka mendapatkan akses ke data Anda. Itu sebabnya membuka kunci bootloader Anda dianggap sebagai risiko keamanan, dan itulah sebabnya perangkat Anda dihapus setelah membuka kuncinya. Dengan asumsi semuanya berjalan sebagaimana mestinya, pengguna biasa harus aman dari penyerang yang membuka kunci bootloader untuk melewati metode kunci Android standar. Namun, tidak semuanya berjalan sesuai rencana.


Kerentanan Membuka Kunci Bootloader OnePlus 3/3T

Serangkaian kerentanan baru telah terjadi baru saja diungkapkan oleh Roee Hay (@roeehay), yang pertama memungkinkan bootloader OnePlus 3/3T dibuka kuncinya tanpa konfirmasi pengguna dan tanpa memicu reset pabrik. Kerentanan ini, diberi label CVE-2017-5625, dianggap sebagai kerentanan tingkat keparahan kritis dan memengaruhi semua perangkat OnePlus 3/3T yang menjalankan OxygenOS 3.2-4.0.1. Pengguna yang telah mengupgrade ke OxygenOS 4.0.2 tambahan memperbarui tidak terpengaruh oleh kerentanan ini, karena Mr. Hay secara pribadi mengungkapkan kelemahan ini kepada OnePlus pada tanggal 23 Januari sehingga mereka dapat segera memperbaiki masalahnya.

Cacatnya bekerja dengan mengirimkan perintah fastboot tersembunyi dan berpemilik: fastboot oem 4F500301. Dengan mengirimkan perintah ini, status kunci bootloader pengguna dilewati (meskipun "Izinkan OEM Membuka Kunci" belum diaktifkan di Pengaturan Pengembang). Perangkat tidak meminta pengguna atau menghapus perangkat sebagaimana mestinya - faktanya, perangkat akan tetap melaporkan bahwa bootloader terkunci! Perintah fastboot lainnya, fastboot oem 4F500302, akan mengatur ulang beberapa pengaturan bootloader, dan dapat digunakan untuk mengunci perangkat yang sudah dibuka kuncinya.

Tuan Hay menemukan bahwa perintah fastboot pertama menetapkan apa yang dia sebut sebagai "bendera ajaib" yang mengesampingkan pemeriksaan yang menentukan status kunci bootloader saat melakukan perintah flashing atau penghapusan.

// '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);
}

Penangan Flash 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);
...
 }

Baca selengkapnya

Penangan Penghapusan 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);
}

Baca selengkapnya

CVE-2017-5626 dapat digunakan untuk mengeksekusi kode kernel. Penyerang dapat mem-flash image boot apa pun yang mereka inginkan. Padahal, jika mereka mem-flash gambar boot yang dimodifikasi, Boot Terverifikasi akan muncul dan memperingatkan pengguna bahwa modifikasi telah terdeteksi. Salah satu cara untuk mengatasi hal ini adalah dengan mem-flash image boot lama yang belum dimodifikasi - image yang berisi eksploitasi lama yang telah ditambal. Meski begitu, "peringatan" yang diberikan kepada Anda hanya berlangsung selama 5 detik, dan secara otomatis hilang dengan sendirinya dan boot ke status boot terverifikasi di mana kode penyerang akan tetap dijalankan.

Pak Hay menyebutkan bahwa ada banyak cara agar kelemahan ini dapat dieksploitasi dengan cara yang jahat. Misalnya, dia memodifikasi image boot untuk mengatur mode SELinux permisif serta secara otomatis menyertakan akses ADB saat boot. Kemudian, setelah mengeksploitasi kerentanan ini untuk mem-flash image bootnya yang telah dimodifikasi, dia dapat mengakses a root shell bahkan sebelum pengguna dapat memasukkan kredensial mereka.

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

Tak perlu dikatakan lagi, ini cukup serius. Perangkat yang dicuri atau di-brick yang menurut Anda aman karena tindakan keamanan yang biasa Anda lakukan dapat dikalahkan sepenuhnya menggunakan eksploitasi ini.


Kerentanan SELinux OnePlus 3/3T

Kerentanan kedua, diberi label CVE-2017-5624, mempengaruhi semua versi OxygenOS dan memungkinkan seseorang untuk melakukannya nonaktifkan dm-veritas. Tuan Hay mengungkapkan kerentanan ini kepada tim Keamanan OnePlus 16 Januari, tetapi perlu dicatat bahwa Anggota Senior XDA th3g1zsecara independen menemukan kerentanan ini pada 23 Januari. Kami telah berbicara dengan OnePlus yang memilikinya menegaskan bahwa mereka telah mengakui dan akan memperbaiki kerentanan kedua ini dalam pembaruan di masa mendatang.

Serangan ini juga cukup sederhana untuk dilakukan. Seseorang hanya perlu mengeluarkan satu perintah fastboot untuk menonaktifkan (atau mengaktifkan) dm-verity: fastboot oem disable dm-verity. Untuk mengaktifkannya, cukup keluarkan fastboot oem enable dm-verity. Penangan untuk perintah ini, diambil dari dump bootloader, ditunjukkan di bawah.


// '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);
}

Mengeluarkan perintah ini akan menyetel sebuah tanda, yang oleh Tuan Hay disebut dmVerity, yang digunakan oleh bootloader untuk mengirimkan argumen baris perintah kernel yang dapat mengaktifkan atau menonaktifkan dm-verity.

Ini dapat digunakan bersama dengan kerentanan pertama untuk mengeksekusi kode dengan hak istimewa tinggi di OnePlus 3/3T tanpa izin pengguna - dan dengan akses ke data pengguna. Misalnya, Pak Hay dapat menginstal aplikasi ke /system/priv-app yang menyebabkan aplikasi tersebut ditambahkan ke domain priv-app. Hal ini memungkinkan aplikasi jahat mengakses fungsi-fungsi istimewa di perangkat. Pak Hay menunjukkan kedua kerentanan ini dieksploitasi secara bersamaan dalam video di bawah ini. Seperti yang Anda lihat, saat dia mem-boot perangkat, aplikasi yang dia buat terbukti sudah diinstal sebelumnya.


Kesimpulan & Catatan dari OnePlus

Potensi penyalahgunaan kedua kerentanan keamanan ini sangat menakutkan. Kami memuji Tuan Hay karena mengungkapkan kerentanan ini secara pribadi dan begitu cepat kepada OnePlus. Namun, kami tetap khawatir karena perintah fastboot seperti itu dapat diakses di perangkat ini. Saat kami menulis panduan tentang caranya temukan perintah fastboot tersembunyi, niat kami adalah memberi tahu pengguna bahwa mungkin ada beberapa perintah menarik yang dapat mereka gunakan untuk meningkatkan pengalaman mereka. Kami tidak pernah berpikir bahwa perintah dengan hak istimewa seperti itu akan ada dalam kode bootloader. Adapun "Mengapa" perintah fastboot ini disertakan dalam firmware, kami diberi a "tidak ada komentar." 

Untuk saat ini, jika Anda belum memperbarui OnePlus 3/3T segera setelah setiap build Oxygen OS dirilis, kami sarankan Anda segera perbarui. Memperbarui ke Oxygen OS 4.0.2 akan melindungi Anda dari kerentanan pertama, tetapi kami harus menunggu hingga OnePlus meluncurkan pembaruan yang menambal kerentanan kedua sebelum kami dapat mengatakan bahwa Anda sepenuhnya aman dari kerentanan ini eksploitasi. Kita harus terus mewaspadai eksploitasi semacam ini di masa depan.


Sumber: Roee Hay