[更新: 2 番目の脆弱性がパッチされました] OnePlus 3/3T ブートローダーの 2 つの重大なセキュリティ欠陥が発見され、1 つはパッチが適用され、もう 1 つは対処中です

click fraud protection

OnePlus 3 と OnePlus 3T では、ブートローダーに関連する 2 つの欠陥が発見されました。 1 つはパッチが適用され、もう 1 つは対処中です。

この記事の公開以来、Oxygen OS バージョン 4.0.3 には、この記事で説明されている 2 番目のセキュリティ脆弱性 (dm-verity 脆弱性) にパッチが適用されています。

Android のルート化、カスタム ROM、カーネル、その他の変更の素晴らしい世界に入る前に、まずデバイス上のブートローダーのロックを解除する必要があります。

一部のデバイス (特にキャリア ブランドのデバイス) では、ユーザーがブートローダーのロックを解除する前に重大な技術的ハードルに対処する必要があるため、これが問題を引き起こします。 Huawei スマートフォンなどの他のデバイスでは、OEM に固有のブートローダーのロック解除コードを申請する必要があります。これは、参入障壁は若干ありますが、それほど難しいことではありません。 Google Nexus/Pixel シリーズや OnePlus スマートフォンはさらに優れており、開発者設定でオプションにチェックを入れてからいくつかのメッセージを送信するだけで済みます。 ファストブート コマンド。

ただし、ブートローダーのロックを解除するのがどれほど困難であっても、常に変わらないことが 1 つあります。それは、ロック解除時にデバイスをワイプする必要があるということです。 ブートローダーのロックが解除されると、データ パーティション全体が簡単に抽出できるため、これは明らかなセキュリティ上の理由から行われます。 (技術的なノウハウを持つ) 悪意のある組織がデータにアクセスすると、カスタム リカバリをフラッシュ ブートしてデバイスの完全なバックアップを抽出する可能性があります。 これが、ブートローダーのロックを解除することがセキュリティ上のリスクとみなされ、ロックを解除した後にデバイスがワイプされる理由です。 すべてが順調に進んでいると仮定すると、通常のユーザーは、攻撃者がブートローダーのロックを解除して標準の Android ロック方法をバイパスすることから安全になるはずです。 ただし、すべてが計画通りに進むわけではありません。


OnePlus 3/3T ブートローダーのロック解除の脆弱性

新しい一連の脆弱性が発生しました。 ちょうど開示された ローイー・ヘイ著 (@roeehay)、最初の方法では、OnePlus 3/3T のブートローダーのロックを解除できます。 ユーザーの確認も工場出荷時設定へのリセットもトリガーされません。 この脆弱性は、 CVE-2017-5625、重大度が重大な脆弱性とみなされ、OxygenOS 3.2-4.0.1 で実行されているすべての OnePlus 3/3T デバイスに影響します。 すでにアップグレード済みのユーザーは、 インクリメンタル OxygenOS 4.0.2 アップデート 影響を受けません ヘイ氏がこの欠陥を OnePlus に非公開で開示したため、この脆弱性によって 1月23日 そのため、すぐに問題にパッチを適用できるようになりました。

この欠陥は、独自の隠し fastboot コマンドを送信することで機能します。 fastboot oem 4F500301. このコマンドを送信すると、ユーザーのブートローダー ロック状態がバイパスされます (開発者設定で「OEM ロック解除を許可する」が有効になっていない場合でも)。 デバイスはユーザーにプロンプ​​トを表示せず、当然のようにデバイスをワイプしません。実際、デバイスは依然としてブートローダーがロックされていると報告します。 別の fastboot コマンド、 fastboot oem 4F500302、一部のブートローダー設定をリセットし、すでにロックが解除されているデバイスをロックするために使用できます。

ヘイ氏は、最初の fastboot コマンドが、彼が「」と名付けたものを設定することを発見しました。マジックフラグこれは、フラッシュまたは消去コマンドを実行するときにブートローダーのロック状態を決定するチェックをオーバーライドします。

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

ファストブートフラッシュハンドラー


// '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 は次の目的で使用できます。 カーネルコードを実行する. 攻撃者は、必要なブート イメージをフラッシュできます。 ただし、変更されたブート イメージをフラッシュすると、検証済みブートが起動し、変更が検出されたことをユーザーに警告します。 これを回避する 1 つの方法は、古い、未変更のブート イメージ、つまりパッチが適用された古いエクスプロイトを含むブート イメージをフラッシュすることです。 それでも、与えられる「警告」は 5 秒間しか続かず、自動的に無視され、攻撃者のコードが引き続き実行される検証ブート状態に移行します。

ヘイ氏は、この欠陥を悪意のある方法で悪用する方法が山ほどあると述べています。 たとえば、ブート イメージを変更して SELinux モードを次のように設定しました。 寛容な また、起動時に ADB アクセスが自動的に組み込まれます。 その後、この脆弱性を悪用して変更したブート イメージをフラッシュした後、彼は ユーザーが資格情報を入力する前に root シェルを実行します。

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 の脆弱性

2 番目の脆弱性は、 CVE-2017-5624、影響します OxygenOS のすべてのバージョン そして、それを許可します dm-verity を無効にします。 ヘイ氏は、この脆弱性を OnePlus セキュリティ チームに開示しました。 1月16日, ただし、XDA 上級会員であることに注意してください。 th3g1zこの脆弱性を独自に発見しました の上 1月23日. 私たちはOnePlusと話をしました。 この 2 番目の脆弱性を認識し、修正する予定であることを確認しました 将来のアップデートで。

この攻撃も非常に簡単に実行できます。 dm-verity を無効 (または有効) にするために必要なのは、fastboot コマンドを 1 回発行するだけです。 fastboot oem disable dm-verity. これを有効にするには、次のように発行します。 fastboot oem enable dm-verity. ブートローダーのダンプから取得したこのコマンドのハンドラーを以下に示します。


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

このコマンドを発行すると、ヘイ氏が dmVerity と呼ぶフラグが設定されます。このフラグは、ブートローダーが dm-verity を有効または無効にするカーネル コマンド ライン引数を送信するために使用されます。

これを最初の脆弱性と組み合わせて使用​​すると、ユーザーの同意なしに OnePlus 3/3T 上で高度な特権コードが実行され、ユーザーのデータにアクセスする可能性があります。 たとえば、ヘイ氏はアプリケーションを /system/priv-app にインストールすることができました。これにより、アプリケーションは priv-app ドメインに追加されます。 これにより、悪意のあるアプリケーションがデバイス上の高度な特権機能にアクセスできるようになります。 ヘイ氏は、以下のビデオでこれら両方の脆弱性が同時に悪用される様子を示しています。 ご覧のとおり、デバイスを起動すると、彼が作成したアプリケーションがすでにプリインストールされていることがわかります。


OnePlus からの結論とメモ

これら 2 つのセキュリティ脆弱性が悪用される可能性は恐ろしいものです。 私たちは、ヘイ氏がこれらの脆弱性を非公開かつ迅速に OnePlus に開示したことを称賛します。 それでも、これらのデバイスでそのような fastboot コマンドにアクセスできることに懸念を抱かずにはいられません。 私たちがその方法についてのガイドを書いたとき、 隠されたfastbootコマンドを発見する、私たちの目的は、エクスペリエンスを向上させるために使用できる興味深いコマンドがある可能性があることをユーザーに知らせることでした。 このような高度な権限を持つコマンドがブートローダー コードに存在するとは思いもしませんでした。. はどうかと言うと "なぜ" これらの fastboot コマンドはファームウェアに含まれており、 "ノーコメント。" 

現時点では、各 Oxygen OS ビルドがリリースされてすぐに OnePlus 3/3T を更新していない場合は、更新することをお勧めします。 すぐに更新してください。 Oxygen OS 4.0.2 に更新すると最初の脆弱性から保護されますが、OnePlus がリリースされるまで待つ必要があります。 これらの脆弱性から完全に安全であると言える前に、2 番目の脆弱性にパッチを適用するアップデートをロールアウトします。 悪用。 今後もこの種の悪用に注意を払う必要があります。


出典: ローイー・ヘイ