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.
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 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:
>
sudo
zypper 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 ambos os pacotes glibc-livepatches e openssl-livepatches:
>
zypper install glibc-livepatches openssl-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 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 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 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 Git
repository do projeto.