Aplica-se a SUSE Linux Enterprise Desktop 12 SP2

21 Correção ativa do kernel do Linux usando o kGraft

Resumo

Este documento descreve os princípios básicos da tecnologia de correção ativa do kGraft e apresenta diretrizes de uso do serviço SLE Live Patching.

O kGraft é uma tecnologia de correção ativa para correção em tempo de execução do kernel do Linux, sem interromper o kernel. Esse procedimento maximiza o tempo ativo do sistema e, consequentemente, sua disponibilidade, o que é essencial para sistemas de extrema importância. Ao permitir a correção dinâmica do kernel, a tecnologia também incentiva os usuários a instalarem atualizações de segurança sem aumentar o tempo de espera programado deles.

O patch do kGraft é um módulo do kernel criado para substituir funções inteiras no kernel. O kGraft basicamente oferece uma infraestrutura no kernel para integração do código corrigido com o código base do kernel em tempo de execução.

O SLE Live Patching é outro serviço oferecido além da manutenção regular do SUSE Linux Enterprise Server. Os patches do kGraft distribuídos pelo SLE Live Patching complementam as atualizações de manutenção regular do SLES. É possível usar a pilha e os procedimentos de atualização comuns para implantação do SLE Live Patching.

21.1 Vantagens do kGraft

A correção ativa do kernel com o kGraft é útil principalmente para respostas rápidas em casos de emergência (quando há vulnerabilidades graves conhecidas que devem ser corrigidas quando possível ou quando há problemas sérios de estabilidade do sistema com uma correção conhecida). Ela não é usada para atualizações programadas quando não há urgência.

Os casos mais frequentes de uso do kGraft incluem sistemas, como bancos de dados de memória, com enormes quantidades de RAM (quando tempos de inicialização de 15 minutos ou mais são muito comuns), grandes simulações que levam semanas ou meses sem serem reiniciadas ou blocos estruturais de infraestrutura que fornecem serviço contínuo a vários consumidores.

A principal vantagem do kGraft é que ele nunca exige interrupção do kernel, nem mesmo por um curto período de tempo.

O patch do kGraft é um módulo do kernel .ko em um pacote RPM do KMP. Ele é inserido no kernel por meio do comando insmod quando o pacote RPM é instalado ou atualizado. O kGraft substitui funções inteiras no kernel, mesmo se estiverem em execução. Um módulo atualizado do kGraft poderá substituir um patch existente, se necessário.

O kGraft também é compacto, ele inclui apenas uma pequena quantidade de código, pois aproveita outras tecnologias padrão do Linux.

21.2 Função de nível inferior do kGraft

O kGraft usa a infraestrutura do ftrace para realizar a correção. Veja a seguir a descrição da implementação na arquitetura AMD64/Intel 64.

Para corrigir uma função do kernel, o kGraft precisa de algum espaço no começo da função para inserir um salto para a nova função. Esse espaço é alocado pelo GCC durante a compilação do kernel, com a criação de perfil da função ativada. Em particular, uma instrução de chamada de 5 bytes é inserida no começo das funções do kernel. Durante a inicialização desse kernel de originação de dados de registro, as chamadas de criação de perfil são substituídas pelas instruções NOP (nenhuma operação) de 5 bytes.

Após o início da correção, o primeiro byte será substituído pela instrução INT3 (ponto de interrupção). Isso garante a atomicidade da substituição da instrução de 5 bytes. Os outros quatro bytes são substituídos pelo endereço da nova função. Por fim, o primeiro byte é substituído pelo código da operação JMP (salto longo).

As interrupções não mascaráveis do interprocessador (IPI NMI) são usadas durante todo o processo para descarregar filas de decodificações especulativas de outras CPUs no sistema. Dessa forma, é possível alternar para a nova função sem ter que interromper o kernel, nem mesmo por um período bem curto. As interrupções por IPI NMIs podem ser medidas em microssegundos e não são consideradas interrupções de serviço, já que ocorrem enquanto o kernel é executado em qualquer caso.

Os chamadores nunca são corrigidos. Em vez disso, as NOPs do receptor são substituídas por um JMP para a nova função. As instruções JMP sempre permanecem. Esse procedimento se encarrega dos ponteiros de função, inclusive em estruturas, e não requer gravação de dados antigos para a possibilidade de reversão da correção.

Porém, essas etapas sozinhas não são suficientes: como as funções são substituídas de maneira não atômica, uma nova função corrigida em uma parte do kernel ainda pode chamar uma função antiga em algum outro lugar, ou vice-versa. Se a semântica da função encontrar alguma mudança no patch, será um caos.

Portanto, até todas as funções serem substituídas, o kGraft usará uma abordagem baseada em trampolins e semelhante a RCU (ler-copiar-atualizar) para garantir uma visão consistente do mundo a cada thread no espaço do usuário, thread no kernel e interrupção de kernel. Um flag por thread é definido em cada entrada e saída do kernel. Dessa forma, uma função antiga sempre chama outra função antiga, e uma nova função sempre chama outra nova. Depois que todos os processos tiverem o flag de "novo universo" definido, a correção será concluída, os trampolins poderão ser removidos e o código poderá operar em velocidade máxima sem afetar o desempenho, exceto pelo salto extra longo para cada função corrigida.

21.3 Instalando patches do kGraft

Esta seção descreve a ativação da extensão SUSE Linux Enterprise Live Patching e a instalação de patches do kGraft.

21.3.1 Ativação do SLE Live Patching

Para ativar o SLE Live Patching no sistema, siga estas etapas:

  1. Se o seu sistema SLES ainda não foi registrado, registre-o. É possível fazer o registro durante a instalação do sistema ou posteriormente, usando o módulo Registro de Produto do YaST (yast2 registration). Após o registro, clique em Sim para ver a lista de atualizações online disponíveis.

    Se o seu sistema SLES já foi registrado, mas o SLE Live Patching ainda não foi ativado, abra o módulo Registro de Produto do YaST (yast2 registration) e clique em Selecionar Extensões.

  2. Selecione SUSE Linux Enterprise Live Patching 12 na lista de extensões disponíveis e clique em Avançar.

  3. Confirme os termos da licença e clique em Avançar.

  4. Digite o código de registro do SLE Live Patching e clique em Avançar.

  5. Confira o Resumo da Instalação e os Padrões selecionados. O Live Patching padrão deve ser selecionado para instalação.

  6. Clique em Aceitar para concluir a instalação. Esse procedimento instala os componentes base do kGraft no sistema juntamente com o patch ativo inicial.

21.3.2 Atualizando o sistema

  1. As atualizações do SLE Live Patching são distribuídas em um formato que permite o uso da pilha de atualização padrão do SLE para aplicação de patch. E possível atualizar o patch ativo inicial usando o zypper patch, o YaST Online Update ou um método equivalente.

  2. O kernel é automaticamente corrigido durante a instalação do pacote. Porém, as invocações das funções antigas do kernel não são completamente eliminadas antes do acionamento e da eliminação de todos os processos adormecidos. Isso pode levar um tempo bastante considerável. Apesar disso, os processos adormecidos que usam funções antigas do kernel não são considerados um problema de segurança. Entretanto, na versão atual do kGraft, apenas será possível aplicar outro patch do kGraft depois que todos os processos ultrapassarem o limite do espaço do usuário do kernel para usar as funções corrigidas do patch anterior.

    Para ver o status global da correção, observe o flag em /sys/kernel/kgraft/in_progress. O valor 1 significa que há processos adormecidos que ainda precisam ser acionados (a correção ainda está em andamento). O valor 0 significa que todos os processos estão usando exclusivamente as funções corrigidas, e que a correção já foi concluída. Se preferir, use o comando kgr status para obter as mesmas informações.

    É possível observar o flag também para cada processo. Confira o número em /proc/número_do_processo/kgr_in_progress separadamente para cada processo. Novamente, o valor 1 significa processos adormecidos que ainda precisam ser acionados. Se preferir, use o comando kgr blocking para gerar a lista de processos adormecidos.

21.4 Removendo um patch do kGraft

Para remover um patch do kGraft, siga este procedimento:

  1. Primeiramente, remova o próprio patch usando o Zypper:

    zypper rm kgraft-patch-3_12_32-25-default
  2. Em seguida, reinicialize a máquina.

21.5 Threads de execução do kernel travados

É necessário preparar os threads do kernel para uso com o kGraft. Os softwares de terceiros talvez não estejam totalmente preparados para adoção do kGraft, e seus módulos do kernel podem gerar threads de execução do kernel. Esses threads bloqueiam o processo de correção indefinidamente. Como medida de emergência, o kGraft oferece a possibilidade de forçar o encerramento do processo de correção sem ter que esperar todos os threads de execução cruzarem o ponto de verificação de segurança. Para isso, grave 0 em /sys/kernel/kgraft/in_progress. Contate o Suporte da SUSE antes de executar esse procedimento.

21.6 Ferramenta kgr

É possível simplificar várias tarefas de gerenciamento do kGraft com a ferramenta kgr. Os comandos disponíveis são:

kgr status

Exibe o status geral da correção do kGraft (ready ou in_progress).

kgr patches

Exibe a lista de patches carregados do kGraft.

kgr blocking

Lista os processos que impedem o término da correção do kGraft. Por padrão, apenas os PIDs são listados. A especificação de -v imprimirá as linhas de comando, se disponíveis. Uma outra opção -v também exibe rastreamentos de pilha.

Para obter informações detalhadas, consulte man kgr.

21.7 Escopo da tecnologia do kGraft

O kGraft baseia-se em substituir funções. É possível realizar a alteração da estrutura de dados apenas indiretamente com o kGraft. Como resultado, as mudanças na estrutura de dados do kernel exigem cuidado especial e, se a mudança for muito extensa, talvez seja necessária a reinicialização. O kGraft talvez não possa também lidar com situações em que um compilador é usado para compilar o kernel antigo, e outro compilador é usado para compilar o patch.

Por causa da maneira como o kGraft funciona, o suporte a módulos de terceiros que geram threads no kernel é limitado.

21.8 Escopo do SLE Live Patching

As correções de vulnerabilidades de nível 6+ para o CVSS (Common Vulnerability Scoring System) e as correções de bug relacionadas à estabilidade do sistema ou corrupção de dados fazem parte do escopo do SLE Live Patching. Talvez não seja possível produzir um patch ativo para todos os tipos de correções que englobem os critérios acima. A SUSE reserva-se o direito de ignorar as correções nas quais a produção de um patch ativo do kernel seja inviável por questões técnicas. Para obter mais informações sobre o CVSS, consulte http://nvd.nist.gov/cvss.cfm/.

21.9 Interação com os processos de suporte

Durante a resolução de uma dificuldade técnica com o Suporte da SUSE, você pode receber o que é denominado PTF (Program Temporary Fix – Correção Temporária do Programa). As PTFs podem ser emitidas para vários pacotes, incluindo os que constituem a base do SLE Live Patching.

As PTFs do kGraft que cumprirem as condições descritas na seção anterior poderão ser instaladas como de costume, e o SUSE garantirá que o sistema em questão não tenha que ser reinicializado e que as live updates futuras sejam corretamente aplicadas.

As PTFs emitidas para o kernel base interrompem o processo de correção ativa. Em primeiro lugar, a instalação do kernel da PTF requer reinicialização, já que o kernel não pode ser substituído integralmente em tempo de execução. Em segundo lugar, uma outra reinicialização é necessária para substituir a PTF por qualquer atualização de manutenção regular para a qual os patches ativos são emitidos.

As PTFs para outros pacotes no SLE Live Patching podem ser tratadas como PTFs regulares com as garantias comuns.

Imprimir esta página