documentation.suse.com / Documentação do SUSE Linux Enterprise Desktop / Guia de Administração / Tarefas comuns / Aplicação de patches dinâmicos no espaço do usuário
Aplica-se a SUSE Linux Enterprise Desktop 15 SP7

12 Aplicação de patches dinâmicos no espaço do usuário

Este capítulo descreve os princípios básicos e o uso de patches dinâmicos no espaço do usuário.

12.1 Sobre a aplicação de patches dinâmicos no espaço do usuário

A aplicação de patches dinâmicos no espaço do usuário (ULP, User Space Live Patching) refere-se ao processo de aplicar patches às bibliotecas usadas por um processo em execução sem o interromper. Sempre que uma correção de segurança estiver disponível como um patch dinâmico, os serviços do cliente serão protegidos após a aplicação do patch dinâmico sem reiniciar os processos.

O ULP é suportado nas seguintes arquiteturas:

  • AMD64/Intel 64

  • ppc64le (a partir do SUSE Linux Enterprise Desktop 15 SP7)

As operações de aplicação de patch dinâmico são realizadas pela ferramenta ulp, que faz parte do libpulp. O libpulp é uma estrutura que consiste na biblioteca libpulp.so e no binário ulp, que torna as bibliotecas atualizáveis por patch dinâmico e aplica patches dinâmicos.

Dica
Dica

Você pode executar o comando ulp como um usuário normal ou como um usuário privilegiado por meio do mecanismo sudo. A diferença é que a execução do ulp pelo sudo permite ver informações dos processos ou os processos de patch executados pelo root.

12.1.1 Pré-requisitos

Para que a ULP funcione, é necessário cumprir dois requisitos.

  • Instale a ULP no sistema executando:

    > sudo zypper in libpulp0 libpulp-tools
  • Os aplicativos com suporte ao patch dinâmico desejado devem ser iniciados pré-carregando a biblioteca libpulp.so.0. Consulte o Seção 12.1.3, “Usando libpulp para obter mais detalhes.

12.1.2 Bibliotecas suportadas

Atualmente, apenas glibc e openssl (openssl1_1 e openssl-3) são suportados. Pacotes adicionais estarão disponíveis após serem preparados para aplicação de patches dinâmicos. Para receber os patches dinâmicos glibc e openssl-1_1-, instale os seguintes pacotes:

> zypper install glibc-livepatches openssl-1_1-livepatches openssl-3-livepatches

12.1.3 Usando libpulp

Para habilitar o patch dinâmico em um aplicativo, você precisa pré-carregar a biblioteca libpulp.so.0 ao iniciar o aplicativo:

> LD_PRELOAD=/usr/lib64/libpulp.so.0 APPLICATION_CMD

12.1.3.1 Verificando se uma biblioteca é atualizável por patch dinâmico

Para verificar se uma biblioteca é atualizável por patch dinâmico, use o seguinte comando:

> ulp livepatchable PATH_TO_LIBRARY

12.1.3.2 Verificando se um arquivo .so é um container de patches dinâmicos

Um objeto compartilhado (.so) é um container de patches dinâmicos se incorporar a descrição do patch ULP. Você pode verificá-lo com o seguinte comando:

> readelf -S SHARED_OBJECT | grep .ulp

Se a saída mostrar que há seções .ulp e .ulp.rev no objeto compartilhado, ele será um contêiner de patches dinâmicos.

12.1.3.3 Aplicando patches dinâmicos

Os patches dinâmicos fornecidos pela SUSE serão enviados pelas atualizações habituais se os seguintes pacotes forem instalados: glibc-livepatches openssl-livepatches openssl-3-livepatches.

Os patches dinâmicos personalizados são aplicados usando o comando ulp trigger, por exemplo:

> ulp trigger -p PID LIVEPATCH.so

Substitua PID pelo ID do processo em execução que usa a biblioteca que será corrigida, e LIVEPATCH.so pelo arquivo de patch dinâmico real. O comando retorna uma das seguintes mensagens de status:

Êxito

A operação de patch dinâmico foi bem-sucedida.

IGNORADO

O patch foi ignorado porque não foi projetado para nenhuma biblioteca carregada no processo.

ERRO

Ocorreu um erro, e você pode recuperar mais informações inspecionando o buffer interno de mensagens libpulp. Consulte o Seção 12.1.3.6, “Ver fila de mensagens internas” para obter mais informações.

Também é possível aplicar vários patches dinâmicos usando curingas, por exemplo:

> ulp trigger '*.so'

O comando tenta aplicar todos os patches da pasta atual a todos os processos que têm a biblioteca libpulp carregada. Se o patch não for adequado ao processo, ele será automaticamente ignorado. No final, a ferramenta mostra quantos patches ela aplicou com êxito a quantos processos.

12.1.3.4 Revertendo patches dinâmicos

Você pode usar o comando ulp trigger para reverter patches dinâmicos. Há duas maneiras de reverter patches dinâmicos. Você pode reverter um patch dinâmico usando o switch --revert e especificando o contêiner de patches dinâmicos:

> ulp trigger -p PID --revert LIVEPATCH.so

Se preferir, remova todos os patches associados a uma biblioteca específica, por exemplo:

> ulp trigger -p PID --revert-all=LIBRARY

No exemplo, LIBRARY refere-se à biblioteca real, como libcrypto.so.1.1.

A última abordagem pode ser útil quando o código-fonte do patch dinâmico original não está disponível. Ou você deseja remover um patch antigo específico e aplicar um novo enquanto o aplicativo de destino ainda está executando um código seguro, por exemplo:

> ulp trigger -p PID  --revert-all=libcrypto.so.1.1 new_livepatch2.so

12.1.3.5 Ver os patches aplicados

É possível verificar quais aplicativos têm patches dinâmicos executando:

> ulp patches

A saída mostra quais bibliotecas são atualizáveis por patch dinâmico e os patches carregados nos programas, além dos bugs que o patch soluciona:

PID: 10636, name: test
  Livepatchable libraries:
    in /lib64/libc.so.6:
      livepatch: libc_livepatch1.so
        bug labels: jsc#SLE-0000
    in /usr/lib64/libpulp.so.0:

Também é possível ver quais funções são corrigidas pelo patch dinâmico:

> ulp dump LIVEPATCH.so

12.1.3.6 Ver fila de mensagens internas

As mensagens de registro de libpulp.so são armazenadas em um buffer dentro da biblioteca e não são exibidas, a menos que solicitadas pelo usuário. Para mostrar essas mensagens, execute:

> ulp messages -p PID

12.2 Mais informações

Há mais informações sobre o libpulp disponíveis no repositório Git do projeto.

Documentation survey