Fusions Linux stables

Chaque jour, un nombre important de modifications sont apportées au noyau Linux en amont. L'impact de ces modifications sur la sécurité n'est généralement pas évalué, mais beaucoup d'entre elles peuvent avoir un impact sur la sécurité du noyau. Évaluer l'impact de chacune de ces modifications sur la sécurité est une opération coûteuse et probablement irréalisable. Une approche plus durable et plus facile à gérer consiste à synchroniser régulièrement les modifications avec le noyau Linux en amont.

Nous vous recommandons de mettre régulièrement à jour les appareils avec des noyaux LTS (Long Term Support) plus récents. Les mises à jour régulières des versions LTS peuvent aider à résoudre les failles de sécurité potentielles non reconnues, comme ce rapport Project Zero publié plus tôt en 2019, avant leur divulgation publique ou leur découverte par des acteurs malveillants.

Prérequis

  • Branche du noyau commun Android (à partir d'AOSP)
  • Une branche de préproduction de fusion LTS pour le noyau de l'appareil cible
  • Branche de version du noyau de l'appareil
  • Dépôt Git
  • Chaîne d'outils de compilation du noyau

Fusionner avec les modifications LTS

Fusionner les modifications LTS
Figure 1 : Fusion des modifications LTS

Les étapes suivantes décrivent les étapes habituelles d'une fusion de LTS.

  • Fusionner à nouveau la branche de version du kernel cible dans la branche de préproduction -LTS
  • Fusionner localement linux-stable ou Android common dans la branche de préproduction -LTS
  • Résoudre les conflits de fusion (consultez les propriétaires de l'espace/du code si nécessaire)
  • Créez le build en local et effectuez des tests de validation/unitaires (voir la section "Tests" ci-dessous).
  • Importer et fusionner les modifications courantes d'Android dans la branche de préproduction LTS
  • Effectuez des tests approfondis à l'aide de la branche de préproduction -LTS (voir la section "Tests" ci-dessous).
  • Examiner les résultats des tests
  • Résolvez les régressions et effectuez une bissection de la fusion si nécessaire.
  • Fusionner la branche de préproduction -LTS dans la branche de version du kernel de l'appareil principale
  • Créer une version Android pour vos appareils incluant le noyau LTS de préproduction
  • Compiler la version de compilation/ROM avec le nouveau kernel

Exemple de fusion avec LTS.

Fusionnez android-4.9 dans le principal (via le pré-déploiement LTS), puis effectuez un extrait et synchronisez la branche de pré-déploiement LTS:

repo init -b <Device kernel LTS staging branch>  # init
repo sync
git checkout -b lts <Device kernel LTS staging branch>
git merge <Device kernel release branch>         # back-merge
git commit

À ce stade, il est préférable de transférer la fusion inverse vers votre dépôt distant source avant de continuer. Ensuite, fusionnez Android Common dans le pré-déploiement LTS.

git merge -X patience android-4.9-q            # LTS merge

Résoudre les conflits de fusion

Dans la plupart des cas, il existe des conflits entre le noyau commun Android et la branche de préproduction -LTS. La résolution des conflits de fusion lors des fusions de LTS peut s'avérer difficile. Vous trouverez ci-dessous quelques conseils pour les résoudre.

Fusion incrémentielle

Si un temps considérable s'est écoulé depuis la mise à jour du noyau d'un appareil avec LTS, il est probable qu'il y ait eu de nombreuses versions stables (> 50) depuis la dernière mise à jour fusionnée publiée en amont. La meilleure façon de résoudre ce problème est de rattraper progressivement ce retard en fusionnant un plus petit nombre de versions à la fois (moins de cinq versions mineures), tout en effectuant des tests à chaque étape du processus.

Par exemple, si le sous-niveau de la version du kernel de l'appareil est 4.14.100 et que le sous-niveau stable en amont est 4.14.155, il est préférable de fusionner par petites étapes pour s'assurer qu'un volume raisonnable de modifications peut être examiné et testé de manière adéquate.

En général, nous avons constaté que travailler de manière incrémentielle par lots de 5 versions mineures maximum par fusion permet d&#39;obtenir un ensemble de correctifs plus gérable.

Tests

Test de démarrage rapide

Pour effectuer un test de démarrage rapide, vous devez d'abord fusionner les modifications LTS localement et compiler le noyau. Les étapes suivantes expliquent le processus de test de démarrage rapide.

Connectez l&#39;appareil cible à votre ordinateur à l&#39;aide d&#39;un câble USB, puis transférez le fichier .ko sur l&#39;appareil à l&#39;aide d&#39;Android Debug Bridge (adb).

adb root
adb disable-verity
adb reboot
(wait for device boot-to-home)
adb root
adb remount
adb push *.ko vendor/lib/modules/
adb reboot bootloader

Démarrez dtbo et chargez l'image du noyau.

fastboot boot --header-version=2 Image.lz4 (redo again if device rebooted)

Recherchez des erreurs dans le journal /dev/kmsg.

adb shell
su
cat /dev/kmsg (inspect kernel log for obvious new errors)

Tests Android

Commencez par créer l'image -userdebug localement avec le nouveau noyau et les nouveaux modules LTS.

Recherchez d'éventuelles erreurs dans /dev/kmsg et vérifiez qu'il n'y en a pas avant de continuer. Testez les éléments suivants pour vous assurer que tout fonctionne comme prévu.

  • Débit Wi-Fi
  • Navigateur Google Chrome
  • Capture d&#39;images et de vidéos avec l&#39;application Appareil photo
  • Lecture de vidéos YouTube avec des haut-parleurs intégrés et un casque Bluetooth
  • Appels via le réseau de l'opérateur
  • Appel vidéo via le Wi-Fi

Suites de tests automatisés

La vérification finale pour s'assurer que l'image du produit ne régresse pas est effectuée à l'aide des suites de tests disponibles via la suite de tests du fournisseur (VTS) et des tests de stress de stabilité automatisés.