12 Aplicação de patches ativos no espaço do usuário #
Este documento descreve os princípios básicos e o uso da aplicação de patches ativos no espaço do usuário.
12.1 Sobre a aplicação de patches ativos no espaço do usuário #
A aplicação de patches ativos no espaço do usuário (ULP, Userspace Live Patching) refere-se ao processo de aplicar patches às bibliotecas usadas por um processo em execução sem o interromper. As operações de aplicação de patches ativos são executadas usando a ferramenta ulp
, que faz parte do libpulp
.
O libpulp
é uma estrutura que permite a aplicação de patches ativos no espaço do usuário. Ele consiste na biblioteca libpulp.so
e em ferramentas que tornam possível aplicar patches ativos às bibliotecas (o binário ulp
).
12.1.1 Pré-requisitos #
Para que a ULP funcione, é necessário cumprir dois requisitos.
Para que possa receber patches ativos , uma biblioteca deve ser compilada com o flag
-fpatchable-function-entry
do GCC. Não é necessária nenhuma mudança no código-fonte da biblioteca.Os processos devem pré-carregar a biblioteca
libpulp.so
.
12.1.2 Usando o libpulp #
Para usar o libpulp
com um aplicativo, você deve executar as seguintes etapas:
Permita que uma biblioteca receba patches ativos.
Ao iniciar o aplicativo, pré-carregue o
libpulp
usando o comandoLD_PRELOAD=/usr/lib64/libpulp.so ./APLICATIVO
.
12.1.2.1 Preparando uma biblioteca para receber patch ativos #
Para que seja possível aplicar patches ativos a uma biblioteca, ela deve conter um prólogo NOP
em todas as chamadas de função. O GCC versão 8 e posterior, bem como a versão do GCC que acompanha o SUSE Linux Enterprise Server, oferece a função -fpatchable-function-entry
especificamente para essa finalidade. Portanto, na arquitetura AMD64/Intel 64, compilar uma biblioteca escrita em C com o flag -fpatchable-function-entry=16,14
é suficiente para permitir que ela receba patches ativos.
As bibliotecas glibc, libssl.so.1.1 e libcrypto.so.1.1 já podem receber patches ativos no SUSE Linux Enterprise 15 SP4.
12.1.2.2 Verificando se uma biblioteca pode receber patches ativos #
Para verificar se uma biblioteca pode receber patches ativos, use o seguinte comando:
ulp livepatchable LIBRARY
12.1.2.3 Aplicando patches ativos #
Os patches ativos são aplicados usando o comando ulp trigger
, por exemplo:
ulp trigger -p PID LIVEPATCH.ulp
Neste exemplo, o PID
é do processo em execução que usa a biblioteca que recebrá o patch, e LIVEPATCH.ulp
é o arquivo de patch ativo específico.
A mensagem live patching succeeded
indica que a operação de aplicação de patches ativos foi bem-sucedida.
12.1.2.4 Revertendo patches ativos #
É possível usar o ulp trigger
para reverter patches ativos. Há duas maneiras de reverter patches ativos. Você pode aplicar o patch .rev
apropriado:
ulp trigger -p PID LIVEPATCH.rev
Se preferir, remova todos os patches associados a uma biblioteca específica. Por exemplo:
ulp trigger -p PID --revert-all=LIBRARY
No exemplo acima, LIBRARY refere-se à biblioteca específica, por exemplo: libcrypto.so.1.1
.
A última abordagem pode ser útil quando o código-fonte do patch ativo original não está disponível ou para remover um determinado patch antigo e aplicar um novo, sem que o aplicativo de destino execute um código que talvez não seja seguro. Por exemplo:
ulp trigger -p PID --revert-all=libcrypto.so.1.1 new_livepatch2.ulp
12.2 Mais informações #
Há mais informações sobre o libpulp
disponíveis no repositório Git do projeto.