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 nombre d'entre elles peuvent potentiellement avoir un impact sur la sécurité du noyau. Évaluer l’impact de chacun de ces changements sur la sécurité est une opération coûteuse et probablement irréalisable. Au lieu de cela, une approche plus durable et maintenable consiste à synchroniser régulièrement les modifications avec le noyau Linux en amont.

Il est recommandé de mettre régulièrement à jour les appareils avec des noyaux LTS (Long Term Supported) plus récents. Les mises à jour régulières de LTS peuvent aider à corriger des vulnérabilités de sécurité potentielles non reconnues, comme ce rapport Project Zero du début de 2019, avant leur divulgation publique ou leur découverte par des acteurs malveillants.

Conditions préalables

  • Branche du noyau commun Android (depuis AOSP)
  • Une branche intermédiaire de fusion LTS pour le noyau du périphérique cible
  • Branche de version du noyau du périphérique
  • Dépôt Git
  • Chaîne d'outils de construction du noyau

Fusion avec les modifications LTS

Fusionner les modifications LTS
Figure 1 : Fusion des modifications LTS

Les étapes suivantes décrivent les étapes typiques d’une fusion LTS.

  • Fusionnez à nouveau la branche de version du noyau cible dans la branche intermédiaire -LTS
  • Fusionner localement Linux-stable ou Android common dans la branche intermédiaire -LTS
  • Résoudre les conflits de fusion (consulter les propriétaires de zone/code si nécessaire)
  • Construisez localement et effectuez des tests d'intégrité/unitaires (voir la section tests ci-dessous)
  • Télécharger et fusionner les modifications courantes d'Android dans la branche intermédiaire LTS
  • Testez minutieusement à l'aide de la branche intermédiaire -LTS (voir la section tests ci-dessous)
  • Examiner les résultats des tests
  • Corrigez toutes les régressions, divisez en deux si nécessaire
  • Fusionner la branche intermédiaire -LTS dans la branche de version du noyau du périphérique principal
  • Créez une nouvelle version Android pour vos appareils qui inclut le noyau LTS intermédiaire
  • Compiler la version build/ROM avec le nouveau noyau

Exemple de fusion avec LTS.

Fusionnez Android-4.9 dans la branche principale (via le staging LTS), puis extrayez et synchronisez la branche de staging 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 pousser la fusion arrière vers votre télécommande source avant de continuer. Après cela, fusionnez Android Common dans le staging LTS.

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

Résoudre les conflits de fusion

Dans la plupart des cas, il y aura des conflits entre le noyau commun Android et la branche intermédiaire -LTS. La résolution des conflits de fusion lors des fusions LTS peut être difficile. Vous trouverez ci-dessous quelques conseils utiles pour les résoudre.

Fusion incrémentielle

Si un laps de temps important s'est écoulé depuis la mise à jour du noyau d'un périphérique avec LTS, il y a de fortes chances qu'il y ait eu de nombreuses (>50) versions stables depuis la publication de la dernière mise à jour fusionnée en amont. La meilleure façon de résoudre ce problème est de rattraper progressivement son retard en fusionnant un plus petit nombre de versions à la fois (<= 5 versions mineures), tout en testant à chaque étape du processus.

Par exemple, si le sous-niveau de version du noyau du périphérique est 4.14.100 et que le sous-niveau stable en amont est 4.14.155, il est préférable de fusionner par petits incréments pour garantir qu'un volume raisonnable de modifications puisse ê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 par fusion garantit un ensemble de correctifs plus gérable.

Essai

Test de démarrage rapide

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

Connectez l'appareil cible à votre ordinateur à l'aide d'un câble USB et envoyez .ko à l'appareil à l'aide d'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)

Vérifiez le journal /dev/kmsg pour détecter des erreurs.

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

Tests Android

Construisez d’abord l’image -userdebug localement avec le nouveau noyau et les nouveaux modules LTS.

Vérifiez le fichier /dev/kmsg pour toute erreur et confirmez qu'il n'y en a pas avant de continuer. Testez les éléments suivants pour vous assurer que tout fonctionne comme prévu.

  • Vitesse Wi-Fi
  • Navigateur Chrome
  • Capture d'images et de vidéos avec l'application appareil photo
  • Lecture vidéo YouTube avec haut-parleurs intégrés et casque Bluetooth
  • Appels sur le réseau de l'opérateur
  • Appel vidéo via Wi-Fi

Suites de tests automatisés

La vérification finale pour garantir 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 résistance de stabilité automatisés.