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 da aplicação 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.
As operações de aplicação de patches dinâmicos são executadas usando a ferramenta ulp, que faz parte do libpulp. 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 os patches dinâmicos.
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:
>sudozypper in libpulp0 libpulp-toolsOs aplicativos com suporte ao patch dinâmico desejado devem ser iniciados pré-carregando a biblioteca
libpulp.so.0. Consulte a Seção 12.1.3, “Usandolibpulp” para obter mais detalhes.
12.1.2 Bibliotecas suportadas #
Atualmente, apenas glibc e openssl (openssl1_1) são suportadas. 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, instale os dois pacotes glibc-livepatches e openssl-livepatches:
> zypper install glibc-livepatches openssl-livepatches12.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_CMD12.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_LIBRARY12.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 as duas seções .ulp e .ulp.rev estão no objeto compartilhado, ele será um container de patches dinâmicos.
12.1.3.3 Aplicando patches dinâmicos #
Os patches dinâmicos 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 a 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 a 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 container de patches dinâmicos:
> ulp trigger -p PID --revert LIVEPATCH.soSe 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 quando 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.so12.1.3.5 Ver os patches aplicados #
É possível verificar quais aplicativos têm patches dinâmicos executando:
> ulp patchesA saída mostra quais bibliotecas são atualizáveis por patch dinâmico e os patches carregados nos programas, bem como os bugs que são corrigidos pelo patch:
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.so12.1.3.6 Ver fila de mensagens internas #
As mensagens de registro do 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 PID12.2 Mais informações #
Há mais informações sobre o libpulp disponíveis no Git
repository do projeto.