Mesclagens com Linux estável

Todos os dias, um número significativo de alterações é confirmado no kernel do Linux upstream. Essas mudanças geralmente não são avaliadas quanto ao impacto na segurança, mas muitas delas podem afetar a segurança do kernel. Avaliar cada uma dessas mudanças em relação ao impacto na segurança é uma operação cara e provavelmente inviável. Em vez disso, uma abordagem mais sustentável e de manutenção é sincronizar regularmente as mudanças com o kernel do Linux upstream.

É recomendável atualizar regularmente os dispositivos com kernels mais recentes com suporte de longo prazo (LTS). As atualizações regulares do LTS podem ajudar a lidar com possíveis vulnerabilidades de segurança não reconhecidas, como este relatório do Project Zero do início de 2019, antes da divulgação pública ou da descoberta por agentes maliciosos.

Pré-requisitos

  • Branch do kernel comum do Android (do AOSP)
  • Uma ramificação de fase de mesclagem do LTS para o kernel do dispositivo de destino
  • Ramificação de versão do kernel do dispositivo
  • Repositório Git
  • Conjunto de ferramentas de build do kernel

Mesclar com as mudanças do LTS

Como mesclar mudanças do LTS
Figura 1: combinação de mudanças do LTS

As etapas a seguir descrevem as etapas típicas de uma mesclagem de LTS.

  • Mesclar novamente a ramificação de lançamento do kernel de destino na ramificação de preparação -LTS
  • Mesclar localmente o linux-stable ou o Android common no ramo de preparo -LTS
  • Resolver conflitos de mesclagem (consulte os proprietários da área/código conforme necessário)
  • Crie localmente e realize testes de sanidade/unidade (consulte a seção de testes abaixo)
  • Fazer upload e mesclar as mudanças comuns do Android para a ramificação de preparação do LTS
  • Faça testes completos usando a ramificação de preparo -LTS (consulte a seção de testes abaixo)
  • Analisar os resultados do teste
  • Corrija todas as regressões e faça a bissecção da mesclagem conforme necessário.
  • Mesclar a ramificação de preparo -LTS na ramificação de lançamento do kernel do dispositivo principal
  • Criar um novo build do Android para seus dispositivos que inclua o kernel LTS de preparação
  • Compilar o build/ROM de lançamento com um novo kernel

Exemplo de mesclagem com LTS.

Mesclar android-4.9 na ramificação principal (por meio do ambiente de testes do LTS) e fazer check-out e sincronizar a ramificação de ambiente de testes do 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

Neste ponto, é melhor enviar a mesclagem de volta para a origem remota antes de continuar. Depois disso, mescle o Android common no ambiente de pré-lançamento do LTS.

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

Resolver conflitos de mesclagem

Na maioria dos casos, há conflitos entre o kernel comum do Android e a ramificação de preparo do -LTS. A resolução de conflitos de mesclagem durante as mesclagens de LTS pode ser difícil. Confira abaixo algumas dicas úteis para resolvê-los.

Fusão incremental

Se um período significativo passou desde que o kernel de um dispositivo foi atualizado com o LTS, há uma boa chance de que muitas versões estáveis (mais de 50) tenham sido lançadas desde a última atualização mesclada. A melhor maneira de resolver isso é fazer a atualização aos poucos, mesclando um número menor de versões por vez (<=5 versões secundárias), enquanto testa em cada etapa do processo.

Por exemplo, se o subnível da versão do kernel do dispositivo for 4.14.100 e o subnível estável upstream for 4.14.155, é melhor mesclar em pequenos incrementos para garantir que um volume razoável de mudanças possa ser analisado e testado adequadamente.

Em geral, descobrimos que trabalhar de forma incremental em lotes de <=5 versões secundárias por mesclagem garante um conjunto de patches mais gerenciável.

Teste

Teste de inicialização rápida

Para realizar um teste rápido de inicialização, primeiro mescle as mudanças do LTS localmente e crie o kernel. As etapas a seguir explicam o processo do teste de inicialização rápida.

Conecte o dispositivo de destino ao computador usando um cabo USB e envie .ko ao dispositivo usando o 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

Inicialize o dtbo e faça o sideload da imagem do kernel.

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

Verifique se há erros no registro /dev/kmsg.

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

Testes para Android

Primeiro, crie a imagem -userdebug localmente com o novo kernel e os módulos LTS.

Verifique se há erros no /dev/kmsg e confirme se não há nenhum antes de continuar. Teste as seguintes ações para garantir que tudo esteja funcionando como esperado.

  • Velocidade do Wi-Fi
  • Navegador Chrome
  • Captura de imagens e vídeos com o app de câmera
  • Reprodução de vídeos do YouTube com alto-falantes integrados e fones de ouvido Bluetooth
  • Chamadas pela rede da operadora
  • Videochamada por Wi-Fi

Conjuntos de testes automatizados

A verificação final para garantir que a imagem do produto não regredisse é realizada usando os conjuntos de testes disponíveis no conjunto de testes do fornecedor (VTS, na sigla em inglês) e no teste de estresse de estabilidade automatizado.