[Mise à jour: deuxième vulnérabilité corrigée] Deux failles de sécurité critiques du chargeur de démarrage OnePlus 3/3T découvertes, une corrigée et une autre en cours de résolution

Deux failles liées au chargeur de démarrage ont été découvertes pour les OnePlus 3 et OnePlus 3T. L’un a été corrigé, l’autre est en cours de résolution.

Depuis la publication de cet article, Oxygen OS version 4.0.3 a corrigé la deuxième vulnérabilité de sécurité évoquée dans cet article, à savoir celle dm-verity.

Avant d'entrer dans le monde merveilleux du rootage Android, des ROM personnalisées, des noyaux et d'autres modifications, vous devez d'abord déverrouiller le chargeur de démarrage de votre appareil.

Sur certains appareils (en particulier ceux de marque d'opérateur), cela pose un problème car les utilisateurs doivent faire face à d'importants obstacles techniques avant de pouvoir déverrouiller le chargeur de démarrage. D'autres appareils tels que les téléphones Huawei nécessitent que vous demandiez à l'OEM un code de déverrouillage unique du chargeur de démarrage - une barrière mineure à l'entrée, mais pas très difficile. Les téléphones de la série Google Nexus/Pixel ou OnePlus sont encore meilleurs, car il vous suffit de cocher une option dans les paramètres du développeur, puis d'en envoyer quelques-unes.

démarrage rapide commandes.

Mais peu importe à quel point il peut être difficile de déverrouiller votre chargeur de démarrage, une chose restera toujours constante: l'obligation d'effacer l'appareil lors du déverrouillage. Ceci est fait pour des raisons de sécurité évidentes, car l'intégralité de votre partition de données peut être facilement extraite une fois le chargeur de démarrage déverrouillé. Une entité malveillante (disposant du savoir-faire technique) pourrait démarrer une récupération personnalisée et extraire une sauvegarde complète de votre appareil si elle accède à vos données. C'est pourquoi le déverrouillage de votre chargeur de démarrage est considéré comme un risque de sécurité et c'est pourquoi votre appareil est effacé après l'avoir déverrouillé. En supposant que tout se passe comme il se doit, un utilisateur régulier devrait être à l'abri des attaquants qui déverrouillent le chargeur de démarrage pour contourner les méthodes de verrouillage Android standard. Cependant, tout ne se passe pas comme prévu.


Vulnérabilité de déverrouillage du chargeur de démarrage OnePlus 3/3T

Un nouvel ensemble de vulnérabilités a été vient de divulguer par Roee Hay (@roeehay), dont le premier permet de déverrouiller le bootloader du OnePlus 3/3T sans confirmation de l'utilisateur et sans déclencher une réinitialisation d'usine. Cette vulnérabilité, étiquetée CVE-2017-5625, est considérée comme une vulnérabilité de gravité critique et affecte tous les appareils OnePlus 3/3T fonctionnant sous OxygenOS 3.2-4.0.1. Les utilisateurs qui ont déjà effectué une mise à niveau vers le incrémentiel OxygenOS 4.0.2 mise à jour ne sont pas concernés par cette vulnérabilité, puisque M. Hay a révélé cette faille en privé à OnePlus le 23 janvier afin qu'ils puissent corriger le problème immédiatement.

La faille fonctionne en envoyant une commande fastboot propriétaire et cachée: fastboot oem 4F500301. En envoyant cette commande, l'état de verrouillage du chargeur de démarrage de l'utilisateur est contourné (même lorsque « Autoriser le déverrouillage OEM » n'a pas été activé dans les paramètres du développeur). L'appareil n'invite pas l'utilisateur et n'efface pas l'appareil comme il se doit - en fait, l'appareil signalera toujours que le chargeur de démarrage est verrouillé! Une autre commande fastboot, fastboot oem 4F500302, réinitialisera certains paramètres du chargeur de démarrage et pourra être utilisé pour verrouiller un appareil déjà déverrouillé.

M. Hay a découvert que la première commande fastboot définit ce qu'il a surnommé un "drapeau magique" qui remplace la vérification qui détermine l'état de verrouillage du chargeur de démarrage lors de l'exécution d'une commande de clignotement ou d'effacement.

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

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

En savoir plus

Gestionnaire d'effacement 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);
}

En savoir plus

CVE-2017-5626 peut être utilisé pour exécuter le code du noyau. Un attaquant peut flasher n’importe quelle image de démarrage de son choix. Cependant, s'ils flashent une image de démarrage modifiée, Verified Boot se déclenchera et avertira l'utilisateur qu'une modification a été détectée. Une façon de contourner ce problème consiste à flasher une image de démarrage plus ancienne et non modifiée, contenant des exploits plus anciens qui ont depuis été corrigés. Même ainsi, « l'avertissement » qui vous est donné ne dure que 5 secondes, et il se supprime automatiquement et démarre dans l'état de démarrage vérifié où le code de l'attaquant s'exécutera toujours.

M. Hay mentionne qu'il existe de nombreuses façons d'exploiter cette faille de manière malveillante. Par exemple, il a modifié une image de démarrage pour définir le mode SELinux sur permissif ainsi que d'inclure automatiquement l'accès ADB au démarrage. Puis, après avoir exploité cette vulnérabilité pour flasher son image de démarrage modifiée, il a pu accéder à un shell root avant même que l’utilisateur puisse saisir ses informations d’identification.

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

Inutile de dire que c'est assez grave. Un appareil volé ou briqué que vous pensez sûr en raison de vos mesures de sécurité habituelles peut être complètement vaincu grâce à cet exploit.


Vulnérabilité OnePlus 3/3T SELinux

La deuxième vulnérabilité, intitulée CVE-2017-5624, affecte toutes les versions d'OxygenOS et permet de désactivez dm-verity. M. Hay a divulgué cette vulnérabilité à l'équipe de sécurité OnePlus le 16 janvier, mais il convient de noter que XDA Senior Member th3g1zdécouvert cette vulnérabilité de manière indépendante sur 23 janvier. Nous avons parlé à OnePlus qui a a confirmé qu'ils ont reconnu et corrigeront cette deuxième vulnérabilité dans une prochaine mise à jour.

Cette attaque est également assez simple à réaliser. Il suffit d'émettre une seule commande fastboot pour désactiver (ou activer) dm-verity: fastboot oem disable dm-verity. Pour l'activer, lancez simplement fastboot oem enable dm-verity. Le gestionnaire de cette commande, extrait d'un dump du chargeur de démarrage, est présenté ci-dessous.


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

L'émission de cette commande définira un indicateur, que M. Hay appelle dmVerity, qui est utilisé par le chargeur de démarrage pour envoyer un argument de ligne de commande du noyau qui peut activer ou désactiver dm-verity.

Ceci peut être utilisé en combinaison avec la première vulnérabilité pour exécuter du code hautement privilégié sur le OnePlus 3/3T sans le consentement de l'utilisateur - et avec accès aux données de l'utilisateur. Par exemple, M. Hay a pu installer une application sur /system/priv-app, ce qui entraîne l'ajout de l'application au domaine priv-app. Cela permet à une application malveillante d'accéder à des fonctions hautement privilégiées sur l'appareil. M. Hay démontre que ces deux vulnérabilités sont exploitées simultanément dans la vidéo ci-dessous. Comme vous pouvez le voir, lorsqu'il démarre l'appareil, l'application qu'il a créée s'avère déjà préinstallée.


Conclusion et note de OnePlus

Les abus potentiels de ces deux failles de sécurité sont effrayants. Nous félicitons M. Hay d'avoir divulgué ces vulnérabilités en privé et si rapidement à OnePlus. Néanmoins, nous ne pouvons nous empêcher d'être alarmés par le fait que de telles commandes de démarrage rapide soient accessibles sur ces appareils. Lorsque nous avons écrit un guide sur la façon de découvrir les commandes fastboot cachées, notre intention était d'informer les utilisateurs qu'il peut y avoir des commandes intéressantes qu'ils peuvent utiliser pour améliorer leur expérience. Jamais nous n'aurions pensé que des commandes aussi hautement privilégiées se trouveraient dans le code du chargeur de démarrage.. Pour ce qui est de "pourquoi" ces commandes fastboot sont incluses dans le firmware, on nous a donné un "aucun commentaire." 

Pour l'instant, si vous n'avez pas mis à jour votre OnePlus 3/3T dès la sortie de chaque version d'Oxygen OS, nous vous recommandons mettre à jour immédiatement. La mise à jour vers Oxygen OS 4.0.2 vous protégera de la première vulnérabilité, mais nous devrons attendre OnePlus déploie une mise à jour qui corrige la deuxième vulnérabilité avant que nous puissions dire que vous êtes totalement à l'abri de celles-ci exploits. Nous devrons rester attentifs à ce genre d’exploits à l’avenir.


Source: Roee Hay