Tutorial para desenvolvedores: Aplicação de patches em tempo real no Oracle Enterprise Linux 7 com o Kpatch - TuxCare

Os patches do php2shell (CVE-2026-109618 e CVE-2026-109619) para o PHP em fim de vida (EOL) já estão disponíveis. Como as respostas do atendimento de vendas estão mais demoradas do que o normal devido à alta demanda, a maneira mais rápida de obter os pacotes corrigidos é adquirir o ELS para Runtimes on-line (abre em uma nova aba). Leia as perguntas frequentes sobre os patches

Vá direto para um resumo gerado por IA desta postagem do blog

  • Resuma esta postagem com o Perplexity
  • Resuma esta postagem com o Gemini

Tutorial para desenvolvedores - min

A aplicação de patches em tempo real permite atualizar o kernel do Linux sem reiniciar o sistema. Essa abordagem é, sem dúvida, a solução perfeita para grandes empresas com serviços sensíveis a interrupções, nas quais pausas podem causar efeitos prejudiciais para todo o negócio. No entanto, a atualização do kernel é imprescindível no mundo atual, repleto de vulnerabilidades, problemas de segurança e falhas. Somente uma atualização proativa do kernel pode garantir o funcionamento tranquilo e sem problemas do seu negócio.

Talvez você já tenha lido nossos tutoriais sobre aplicação de patches no kernel em tempo real: “Aplicação de patches em tempo real no kernel do Debian 10 com o Kpatch ” e “Aplicação de patches em tempo real no kernel do Ubuntu 20.04 LTS Focal Fossa com o Kpatch”. E, caso ainda não tenha lido, considere-os materiais úteis para compartilhar com seus colegas e amigos.

Neste tutorial, vou mostrar como aplicar patches no kernel do Oracle Enterprise Linux 7 – UEK4 usando o Kpatch sem precisar reiniciar o sistema.

O Kpatch é um projeto da Red Hat e funciona no RHEL e em suas distribuições derivadas. A Red Hat oferece um serviço comercial de correções em tempo real para clientes do RHEL, assim como as seguintes empresas, cada uma delas voltada para distribuições diferentes:

Escolhemos o Kpatch para este tutorial porque seu código-fonte está disponível gratuitamente e é atualizado regularmente

Pré-requisitos

Aqui estão os pré-requisitos de sistema para acompanhar este tutorial.

  • Um sistema de teste (fora de produção) que executa o Oracle7 UEK4 em uma arquitetura x86_64/amd64.
  • 20 Gb de espaço livre em disco. (O código-fonte do kernel do Linux ocupa cerca de 909 Mb no disco, chegando a 17 Gb quando compilado.)
  • Seu kernel não foi personalizado; você está usando o kernel padrão fornecido pelo Debian
  • Seu kernel possui o recurso de correção dinâmica integrado. Use este comando e você verá dois valores definidos como y para CONFIG_HAVE_LIVEPATCH e CONFIG_LIVEPATCH:
grep LIVEPATCH /boot/config-$(uname -r)
  • A versão do gcc instalada corresponde à utilizada para compilar o kernel original. (O kpatch-build O comando falhará se as versões não corresponderem. Isso pode ser contornado com a opção --skip-gcc-check, embora seu uso não seja recomendado.)
    • Para verificar a versão do gcc instalada: gcc --version (if gcc not installed run ”sudo apt install gcc”)
    • Para verificar a versão do gcc usada para compilar o kernel atual: cat /proc/version

1. Instalar os pacotes de dependências

  1. Instalar e configurar sudo.Como root:
    apt-get install sudo
    adduser <user> sudo

    onde <user> é o nome de usuário de um usuário comum. (Todos os comandos a seguir devem ser executados como esse usuário.)

  2. Instalar pacotes.
    sudo yum install elfutils elfutils-devel
    sudo yum install pesign yum-utils zlib-devel binutils-devel newt-devel python-devel 
    perl-ExtUtils-Embed audit-libs numactl-devel pciutils-devel bison patchutils bc rpm-build glib2-devel
  3. Baixe e instale o libdtrace:
    wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackage/libdtrace-ctf-0.8.0-1.el7.x86_64.rpm
    wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackage/libdtrace-ctf-devel-0.8.0-1.el7.x86_64.rpm
    rpm -ivh libdtrace-ctf-0.8.0-1.el7.x86_64.rpm libdtrace-ctf-devel-0.8.0-1.el7.x86_64.rpm
  4. Baixe e instale os códigos-fonte do kernel e os pacotes kernel-devel:
    wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackageSource/kernel-uek-4.1.12-124.40.6.3.el7uek.src.rpm
    wget https://yum.oracle.com/repo/OracleLinux/OL7/UEKR4/x86_64/getPackage/kernel-uek-devel-4.1.12-124.40.6.3.el7uek.x86_64.rpm
    rpm -ivh kernel-uek-4.1.12-124.40.6.3.el7uek.x86_64.rpm --nodeps
    rpm -ivh --nodeps kernel-uek-devel-4.1.12-124.40.6.3.el7uek.x86_64.rpm
  5. Baixe e instale os pacotes de informações de depuração:
wget https://oss.oracle.com/ol7/debuginfo/kernel-uek-debuginfo-4.1.12-124.40.6.3.el7uek.x86_64.rpm
wget https://oss.oracle.com/ol7/debuginfo/kernel-uek-debuginfo-common-4.1.12-124.40.6.3.el7uek.x86_64.rpm
rpm -ivh kernel-uek-debuginfo-4.1.12-124.40.6.3.el7uek.x86_64.rpm kernel-uek-debuginfo-common-4.1.12-124.40.6.3.el7uek.x86_64.rpm

2. Instalar o Kpatch

git clone https://github.com/dynup/kpatch.git
cd kpatch && make && sudo make install
cd kmod && make
mkdir /lib/modules/`uname -r`/extra/kpatch
cp core/kpatch.ko /lib/modules/`uname -r`/extra/kpatch
cp core/Module.symvers /lib/modules/`uname -r`/extra/kpatch

3. Obtenha uma cópia do código-fonte do kernel do Linux

Descompactar os códigos-fonte do kernel:

cd /root/rpmbuild/SOURCES
tar xfj linux-4.1.12.tar.bz2

4. Criar o arquivo de configuração do kernel do Linux

O kernel do Linux é compilado usando as configurações de um arquivo de configuração fornecido com a sua distribuição. Faça uma cópia e altere algumas configurações para que o kpatch-build possa compilar um kernel do Linux com as mesmas configurações do kernel que está em execução.

cd linux-source-5.4.0/
cp /boot/config-$(uname -r) .config

Verifique se as configurações necessárias do kernel estão ativadas para o uso do Kpatch. Todas devem retornar “y”.

scripts/config -s DYNAMIC_FTRACE_WITH_REGS
scripts/config -s FUNCTION_TRACER
scripts/config -s HAVE_DYNAMIC_FTRACE_WITH_REGS
scripts/config -s HAVE_FENTRY
scripts/config -s HAVE_LIVEPATCH
scripts/config -s KALLSYMS_ALL
scripts/config -s KALLSYMS
scripts/config -s LIVEPATCH
scripts/config -s MODULES
scripts/config -s MODULE_SIG
scripts/config -s SYSFS
scripts/config -s SYSTEM_TRUSTED_KEYRING

Altere o valor de um item de configuração do kernel.

scripts/config --set-str SYSTEM_TRUSTED_KEYS ""

Saia do diretório de origem.

cd ..

5. Criar um patch

Um arquivo-fonte de patch é o resultado da execução do diff comando executado nos arquivos de código-fonte originais e nos modificados.

O exemplo de aplicação de patch mostrado na seção “Introdução rápida” do Página do kpatch no GitHub altera a saída de /proc/meminfo. Muitos outros artigos do Kpatch reproduzem esse exemplo, então eu queria algo diferente e um pouco mais interessante, mas que continuasse sendo seguro.

Este exemplo altera a saída do uptime comando para dar a eles a impressão de que o tempo de atividade do seu servidor aumentou em uma década.

1. Ainda no diretório de trabalho, copie um arquivo.

cd /root/rpmbuild/SOURCES
cp linux-4.1.12/fs/proc/uptime.c .

2. Edite-o. Na linha 26, altere:

(unsigned long) uptime.tv_sec,

para

(unsigned long) uptime.tv_sec + 315576000,

Salve o arquivo.

3. Crie o arquivo de patch.

diff -u linux-source-5.4.0/fs/proc/uptime.c ./uptime.c > uptime.patch

4. Crie o módulo de patch. (Na primeira vez que você fizer isso, o processo levará algumas horas, pois o código-fonte do kernel precisa ser compilado. As compilações subsequentes são significativamente mais rápidas, da ordem de minutos.)

kpatch-build -t vmlinux -v /usr/lib/debug/boot/vmlinux-5.4.0-37-generic uptime.patch

 

5. Ao concluir, você terá um arquivo de módulo carregável do kernel do Linux, chamado kpatch-uptime.ko, correspondente ao patch.

 

6. Teste o patch

  1. Antes de carregar o módulo de patch, verifique o tempo de atividade atual.
    cat /proc/uptime && uptime -p
  2. Carregue o módulo de patch.
    # kpatch load kpatch-uptime.ko
    carregando o módulo de patch: kpatch-uptime.ko
  3. Verifique o tempo de atividade novamente.
    cat /proc/uptime && uptime -p
  4. Descarregue o módulo de patch.
    # kpatch unload kpatch-uptime.ko
    desativando o módulo de patch: kpatch_uptime
    descarregando o módulo de patch: kpatch_uptime
  5. Verifique se o tempo de atividade voltou ao valor anterior.
    # cat /proc/uptime && uptime -p
    7215,13 27930,41
    em funcionamento há 2 horas

Conclusão

Analisamos o processo de aplicação de patches em tempo real no kernel do Oracle Enterprise Linux 7 – UEK4 usando o Kpatch. É possível perceber que o processo em si é bastante simples, mas não é fácil. E o desenvolvimento do patch representa a principal dificuldade. O patch não deve causar falhas no sistema e deve ser compatível com os pacotes anteriores e posteriores. Acrescente a isso as diferentes distribuições e versões do kernel, além dos testes e do suporte, e você pode acabar arcando com um custo considerável por uma ferramenta de aplicação de patches em tempo real.

Obtenha uma versão de avaliação GRATUITA de 7 dias do KernelCare com suporte técnico 

 

Você pode conhecer três maneiras diferentes de aplicar patches de segurança no kernel do Linux em nosso guia detalhado. O artigo explica como atualizar kernels do Linux sem reiniciar o sistema, abordando três métodos diferentes para alguns dos kernels mais populares do Linux.

Junte-se a mais de 4.500 profissionais de Linux e código aberto!

2 vezes por mês. Sem spam.

Índice
Obtenha as respostas sobre segurança de código aberto de que você precisa

Junte-se a mais de 4.500 profissionais de Linux e código aberto!

2 vezes por mês. Sem spam.