SlideShare uma empresa Scribd logo
Kernel Livepatching na
prática
Marcos Paulo de Souza
Agenda ● Porque livepatch?
● Vulnerabilidades
● História
● O que é um livepatch?
● Formas de criar livepatches
● Aplicando livepatches
● Referências
$ whoami
● Marcos Paulo de Souza
● Trabalha atualmente na SUSE como Kernel Livepatch Developer
● mpdesouza.com
● marcos@mpdesouza.com
● https://floss.social/@mpdesouza
● Contribuidor de múltiplos projetos de software livre
○ Kernel Linux
○ virtme-ng
○ LTP
○ LibreOffice
○ …
Porque livepatches?
Porque livepatches?
● Existe uma nova atualização que corrige uma falha crítica. Como
aplicar uma atualização em um servidor?
Porque livepatches?
● Existe uma nova atualização que corrige uma falha crítica. Como
aplicar uma atualização em um servidor?
○ reboot
Porque livepatches?
● Existe uma nova atualização que corrige uma falha crítica. Como
aplicar uma atualização em um servidor?
○ reboot?!!???!?!?!?!?
Vulnerabilidades
Vulnerabilidades
Vulnerabilidades
CVE-2021-22600
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 46943a18a10d..76c2dca7f0a5 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -4492,9 +4492,10 @@ static int packet_set_ring(struct
sock *sk, union tpacket_req_u *req_u,
}
out_free_pg_vec:
- bitmap_free(rx_owner_map);
- if (pg_vec)
+ if (pg_vec) {
+ bitmap_free(rx_owner_map);
free_pg_vec(pg_vec, order, req->tp_block_nr);
+ }
out:
return err;
}
A double free bug in packet_set_ring() in
net/packet/af_packet.c can be exploited by a
local user through crafted syscalls to escalate
privileges or deny service. We recommend
upgrading kernel past the affected versions or
rebuilding past
ec6af094ea28f0f2dda1a6a33b14cd57e36a975
5.
Demo CVE-2021-22600
● Ferramentas utilizadas
○ virtme-ng
○ Kernel compilado com KASAN
○ Teste setsockopt09 do LTP compilado e pronto para usar
Como sobreviver a uma ameaça
dessas sem interromper meus
serviços?
Como sobreviver a uma ameaça
dessas sem interromper meus
serviços?
Livepatch!
História
História
• Ksplice: An Automatic System for Rebootless Kernel Security Updates,
Jeff Arnold (2008)
– “Since rebooting can cause disruption, system administrators
often delay performing security updates, despite the risk of
compromises.”
• Anunciado na LKML in 2008
• Estudantes do MIT criaram a Kpatch Inc em 2009
– Comprada pela Oracle em 2011, que fechou seu código :(
História
kpatch & kGraft - initial LMKL RFCs
• 30 Apr 2014 - [RFC 00/16] kGraft
– Linux kernel online patching developed at SUSE
– Per-task consistency: each thread either sees the old version or
the new version of functions
– Transition only when the task exits kernel mode
• 1 May 2014 - [RFC PATCH 0/2] kpatch: dynamic kernel patching
– Developed by Red Hat, modeled after initial ksplice project
– stop_machine() - all tasks see old or new version of functions
– Requires reliable stack unwinding (see Reliable Stacktrace
kernel doc)
História
2014 Dec 16
b700e7f03df5 (“livepatch: kernel: add support for live
patching”)
• Introduces code for the live patching core
• Represents the greatest common functionality set between kpatch and
kgraft and can accept patches built using either method
• Does not implement any consistency mechanism to ensure old and
new code do not run together
História
2017 Feb 13
d83a7cb375ee (“livepatch: change to a per-task
consistency model”)
• Change livepatch to use a basic per-task consistency model
• Hybrid of kGraft and kpatch: it uses kGraft's per-task consistency and
syscall barrier switching combined with kpatch's stack trace switching
O que é um Livepatch?
O que é um livepatch?
● Um módulo/driver de Linux, como qualquer outro, que faz uso de uma API
específica.
● Contém hooks para registrar uma função a ser executada no lugar da atual
função que contém a falha que pode ser explorada. A nova função deve ser
uma cópia da função antiga com a correção aplicada.
O que é um livepatch?
● Utiliza ftrace para fazer o patching
○ Framework para diversas funcionalidades no kernel (incluindo tracing)
Example - livepatch /proc/cmdline interface
// Original function from fs/proc/cmdline.c
static int cmdline_proc_show(struct seq_file *m, void *v)
{
seq_puts(m, saved_command_line);
seq_putc(m, 'n');
return 0;
}
Example - livepatch /proc/cmdline interface
// samples/livepatch/livepatch-sample.c
#include <linux/seq_file.h>
// Replacement function, note the same argument and return interface
static int livepatch_cmdline_proc_show(struct seq_file *m, void *v)
{
seq_printf(m, "%sn", "this has been live patched");
return 0;
}
// ... continued ...
Example - livepatch /proc/cmdline interface
// klp_func[] array describes all livepatch original and replacement functions
static struct klp_func funcs[] = {
{
.old_name = "cmdline_proc_show",
.new_func = livepatch_cmdline_proc_show,
}, { }
};
// ... continued ...
Example - livepatch /proc/cmdline interface
// klp_object[] array describes all kernel objects (NULL for vmlinux) and functions to patch
static struct klp_object objs[] = {
{
.funcs = funcs,
}, { }
};
// klp_patch contains all objects to patch
static struct klp_patch patch = {
.mod = THIS_MODULE,
.objs = objs,
};
// ... continued ...
Example - livepatch /proc/cmdline interface
static int livepatch_init(void)
{
return klp_enable_patch(&patch);
}
static void livepatch_exit(void)
{
}
module_init(livepatch_init); // wire up module init/exit functions to enable the livepatch
module_exit(livepatch_exit);
MODULE_LICENSE("GPL");
MODULE_INFO(livepatch, "Y"); // don’t forget to identify the module as a livepatch
Demo (samples/livepatch/livepatch-sample.c)
Formas de criar um livepatch
“A man is a man, but a man with a tool makes two.”
Ahti, the janitor
Formas de criar um livepatch
● Geração de livepatch comparando código objeto defeituoso com de código
objeto com a correção aplicada
○ kpatch
● Extração de código defeituoso, corrigir código e gerar o livepatch
○ klp-build + clang-extract
klp-build + clang-extract
● Verifica configurações do kernel a ser usado
para criado o livepatch
○ Símbolos existentes
○ Arquivos presentes
○ Configuração habilitada
○ Módulos presentes
○ Aplica patches antes de chamar
clang-extract
○ Aplica um template no resultado do
clang-extract (registra o livepatch)
● Extrai código da função a ser corrigida
○ Verifica funções inline e as traz junto do
código extraído
○ Renomeia símbolos caso necessário
○ Verifica quais símbolos são privados
○ Cria um closure das funções, declarações,
tipos e tudo mais o que for necessário para
criar um código standalone.
clang-extract
● Extrair código e adaptar usos
○ Símbolos privados e inline
● Gerar código independente em relação a outros módulos
● Referenciar usos vs Copiar tudo o for utilizado
○ Livepatches cumulativos
● Código extraido compilado em multiplas plataformas?
○ Código específico de arquitetura?
klp-build + clang-extract
$ klp-build setup --name lp-cve-2021-22600 
--kdir 
--data-dir ~/git/linux 
--conf CONFIG_UNIX 
--file-funcs net/packet/af_packet.c packet_set_ring 
--module af_packet
klp-build + clang-extract
$ ls ~/git/linux/fixes
0001-net-packet-rx_owner_map-depends-on-pg_vec.patch
$ klp-build extract --apply-patches --name lp-cve-2021-22600
klp-build + clang-extract
$ cd $KLP_WORK_DIR/lp-cve-2021-22600/ce/linux/lp
$ make
$ ls
livepatch_lp-cve-2021-22600.c livepatch_lp-cve-2021-22600.mod
livepatch_lp-cve-2021-22600.o modules.livepatch livepatch_lp-cve-2021-22600.h
livepatch_lp-cve-2021-22600.mod.c livepatch_lp-cve-2021-22600.tmp.ko modules.order
livepatch_lp-cve-2021-22600.ko livepatch_lp-cve-2021-22600.mod.o Makefile Module.symvers
Aplicando
livepatches
Manipulando livepatches
$ insmod $KLP_WORK_DIR/lp-cve-2021-22600/ce/linux/lp/livepatch_lp-cve-2021-22600.ko
$ dmesg
[ 132.393529] livepatch_lp_cve_2021_22600: loading out-of-tree module taints kernel.
[ 132.396514] livepatch_lp_cve_2021_22600: tainting kernel with TAINT_LIVEPATCH
[ 132.416329] livepatch: enabling patch 'livepatch_lp_cve_2021_22600'
[ 132.424739] livepatch: 'livepatch_lp_cve_2021_22600': starting patching transition
[ 139.629624] livepatch: 'livepatch_lp_cve_2021_22600': patching complet
Manipulando livepatches
$ ls /sys/kernel/livepatch/
livepatch_lp_cve_2021_22600
$ ls /sys/kernel/livepatch/livepatch_lp_cve_2021_22600/
af_packet enabled force transition
$ cat /sys/kernel/livepatch/livepatch_lp_cve_2021_22600/enabled
1
Manipulando livepatches
$ sudo echo 0 > /sys/kernel/livepatch/livepatch_lp_cve_2021_22600/enabled
$ dmesg
[ 495.010847] livepatch: 'livepatch_lp_cve_2021_22600': starting unpatching transition
[ 495.919239] livepatch: 'livepatch_lp_cve_2021_22600': unpatching complete
$ ls /sys/kernel/livepatch/
$ # sem livepatches aplicados
Demo CVE-2021-22600 com livepatch aplicado
Demo CVE-2021-22600 com livepatch aplicado e
desativado
Referências
● mpdesouza.com - multiplos posts sobre vulnerabilidades
● Linux Foundation Mentoring Session: Linux Livepatching - An Introduction
● Test do LTP para explorar o CVE-2021-22600
● https://docs.kernel.org/livepatch/livepatch.html
● https://docs.kernel.org/trace/ftrace-uses.html
● https://github.com/SUSE/klp-build
● https://github.com/SUSE/clang-extract
● https://github.com/dynup/kpatch
Obrigado!
Marcos Paulo de Souza
mpdesouza.com
marcos@mpdesouza.com
mpdesouza@suse.com
https://github.com/marcosps/
https://floss.social/@mpdesouza
https://www.linkedin.com/in/marcospsouza/
Bonus!
ftrace
● __fentry__ para NOP
● gcc / clang
○ -pg -mrecord-mcount -mfentry
● Exemplo: https://godbolt.org/z/6787dxfvM
Livepatches - Mais do que ftrace
● Consistencia
● Controla transição entre versões da mesma função:
● Processos utilizando versão antiga vs processos utilizando a versão nova
https://github.com/marcosps/kernel-api-examples/blob/main/ftrace-hijack.c
https://elixir.bootlin.com/linux/v6.9.1/source/kernel/livepatch/patch.c#L121
Livepatches - Implementação
● Patches aplicados em código, não dados!
● Formas de aplicar livepatches:
○ “Empilhados” (stacked)
○ Cumulativos (atomic replace)
● Shadow variables
Livepatch consistency model: Starting Transition
Start
transition
For all threads:
Set thread flag as
TIF_PATCH_PENDING
Try to
complete
transition
System remains executing threads during all livepatch transition phases
Livepatch consistency model: Completing Transition
System remains executing threads during all livepatch transition phases
Try to
complete
transition
For all threads
If thread callstack is safe to patch,
clear TIF_PATCH_PENDING
Any remaining
TIF_PATCH_PENDING threads?
Transition
complete
Wake up idle
and pending
threads
Sleep 1s
No
Yes
Livepatches - mudanças na memória
Sem o livepatch
(gdb) disassemble packet_set_ring
Dump of assembler code for function packet_set_ring:
0xffffffffc0214250 <+0>: nopl 0x0(%rax,%rax,1)
0xffffffffc0214255 <+5>: push %r15
0xffffffffc0214257 <+7>: push %r14
Com livepatch
(gdb) disassemble packet_set_ring
Dump of assembler code for function packet_set_ring:
0xffffffffc0214250 <+0>: call 0xffffffffc0260000
0xffffffffc0214255 <+5>: push %r15
0xffffffffc0214257 <+7>: push %r14
Livepatches - Problemas
● Funções inline
● Funções privadas (klp-convert)
● Ftrace desabilitado
● Código presente em uma só arquitetura
● Solução upstream que não se aplicam em um livepatch diretamente
○ Solução altera structs
○ Código baixo nível
● Prioridade
○ Requer privilégios para explorar a falha?

Mais conteúdo relacionado

PDF
Mini-curso Programação Paralela e Distribuída
PDF
Lab python django - parte 2 - python + virtualenv
PDF
Aplicações com Tecnologias Web
PDF
PaaS - OpenShift como plataforma pública
PDF
Construção e provisionamento de ambientes de desenvolvimento virtualizados
PDF
PHPSC Conference 2010 - Desenvolvimento de Extensões PECL
PPTX
Coroutine e concorrência python
PPTX
ASP.NET Core: visão geral, exemplos práticos e novidades - .NET SP - Agosto-2017
Mini-curso Programação Paralela e Distribuída
Lab python django - parte 2 - python + virtualenv
Aplicações com Tecnologias Web
PaaS - OpenShift como plataforma pública
Construção e provisionamento de ambientes de desenvolvimento virtualizados
PHPSC Conference 2010 - Desenvolvimento de Extensões PECL
Coroutine e concorrência python
ASP.NET Core: visão geral, exemplos práticos e novidades - .NET SP - Agosto-2017

Semelhante a Kernel Livepatching na prática: Hands On (20)

PDF
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
PDF
Integração Contínua com Cruise Control e phpUnderControl
PDF
Source-to-container no mundo real
PDF
Vagrant + Puppet
ODP
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
PDF
I educar-manual-de-instalaao
PPT
Controlando Projetos com Netbeans e Subversion
PPTX
ASP.NET vNext no .NET Architects Days 2014
PDF
Linux e zephyr conversando no mesmo SoC
PPTX
ASP.NET Core: visão geral, exemplos práticos e novidades esperadas - .NET SP ...
DOCX
Multithreaded tecnologia
PDF
Igor Oliveira - Puppet
PDF
Virtualização de Banco de Dados por Bruno Domingues
PDF
Vagrant vs docker? Melhor vagrant + docker
PPTX
Amazon EC2 boas praticas e otimizações de desempenho
PDF
Consegi 2011: Puppet
PDF
Programação Multiplataforma em Ambiente Web
PDF
Instalação do asterisk
ODP
Project HA
Curso de Verão - Aula 03 - Introdução ao CI-CD e Infraestrutura como Código
Integração Contínua com Cruise Control e phpUnderControl
Source-to-container no mundo real
Vagrant + Puppet
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
I educar-manual-de-instalaao
Controlando Projetos com Netbeans e Subversion
ASP.NET vNext no .NET Architects Days 2014
Linux e zephyr conversando no mesmo SoC
ASP.NET Core: visão geral, exemplos práticos e novidades esperadas - .NET SP ...
Multithreaded tecnologia
Igor Oliveira - Puppet
Virtualização de Banco de Dados por Bruno Domingues
Vagrant vs docker? Melhor vagrant + docker
Amazon EC2 boas praticas e otimizações de desempenho
Consegi 2011: Puppet
Programação Multiplataforma em Ambiente Web
Instalação do asterisk
Project HA
Anúncio

Último (7)

PPTX
Curso de Windows 11 resumido na prática.pptx
PDF
Evolução em código: algoritmos genéticos com PHP
DOC
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
PDF
Dos requisitos ao código: como criar código rastreável em PHP
DOC
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
PDF
apresentacao introducao computacao ead.pdf
PPTX
Mapeamento de Objeto para Tabela Relacional
Curso de Windows 11 resumido na prática.pptx
Evolução em código: algoritmos genéticos com PHP
COMO AUTOMATIZR JOGOS SUPER NINTENDO ATRAVES DA PROGRAMAÇÃO
Dos requisitos ao código: como criar código rastreável em PHP
CODIGO PARA AUTOMATIZAR A JOGABILIDADE SUPER MARIO
apresentacao introducao computacao ead.pdf
Mapeamento de Objeto para Tabela Relacional
Anúncio

Kernel Livepatching na prática: Hands On

  • 2. Agenda ● Porque livepatch? ● Vulnerabilidades ● História ● O que é um livepatch? ● Formas de criar livepatches ● Aplicando livepatches ● Referências
  • 3. $ whoami ● Marcos Paulo de Souza ● Trabalha atualmente na SUSE como Kernel Livepatch Developer ● mpdesouza.com ● marcos@mpdesouza.com ● https://floss.social/@mpdesouza ● Contribuidor de múltiplos projetos de software livre ○ Kernel Linux ○ virtme-ng ○ LTP ○ LibreOffice ○ …
  • 5. Porque livepatches? ● Existe uma nova atualização que corrige uma falha crítica. Como aplicar uma atualização em um servidor?
  • 6. Porque livepatches? ● Existe uma nova atualização que corrige uma falha crítica. Como aplicar uma atualização em um servidor? ○ reboot
  • 7. Porque livepatches? ● Existe uma nova atualização que corrige uma falha crítica. Como aplicar uma atualização em um servidor? ○ reboot?!!???!?!?!?!?
  • 11. CVE-2021-22600 diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 46943a18a10d..76c2dca7f0a5 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -4492,9 +4492,10 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, } out_free_pg_vec: - bitmap_free(rx_owner_map); - if (pg_vec) + if (pg_vec) { + bitmap_free(rx_owner_map); free_pg_vec(pg_vec, order, req->tp_block_nr); + } out: return err; } A double free bug in packet_set_ring() in net/packet/af_packet.c can be exploited by a local user through crafted syscalls to escalate privileges or deny service. We recommend upgrading kernel past the affected versions or rebuilding past ec6af094ea28f0f2dda1a6a33b14cd57e36a975 5.
  • 12. Demo CVE-2021-22600 ● Ferramentas utilizadas ○ virtme-ng ○ Kernel compilado com KASAN ○ Teste setsockopt09 do LTP compilado e pronto para usar
  • 13. Como sobreviver a uma ameaça dessas sem interromper meus serviços?
  • 14. Como sobreviver a uma ameaça dessas sem interromper meus serviços? Livepatch!
  • 16. História • Ksplice: An Automatic System for Rebootless Kernel Security Updates, Jeff Arnold (2008) – “Since rebooting can cause disruption, system administrators often delay performing security updates, despite the risk of compromises.” • Anunciado na LKML in 2008 • Estudantes do MIT criaram a Kpatch Inc em 2009 – Comprada pela Oracle em 2011, que fechou seu código :(
  • 17. História kpatch & kGraft - initial LMKL RFCs • 30 Apr 2014 - [RFC 00/16] kGraft – Linux kernel online patching developed at SUSE – Per-task consistency: each thread either sees the old version or the new version of functions – Transition only when the task exits kernel mode • 1 May 2014 - [RFC PATCH 0/2] kpatch: dynamic kernel patching – Developed by Red Hat, modeled after initial ksplice project – stop_machine() - all tasks see old or new version of functions – Requires reliable stack unwinding (see Reliable Stacktrace kernel doc)
  • 18. História 2014 Dec 16 b700e7f03df5 (“livepatch: kernel: add support for live patching”) • Introduces code for the live patching core • Represents the greatest common functionality set between kpatch and kgraft and can accept patches built using either method • Does not implement any consistency mechanism to ensure old and new code do not run together
  • 19. História 2017 Feb 13 d83a7cb375ee (“livepatch: change to a per-task consistency model”) • Change livepatch to use a basic per-task consistency model • Hybrid of kGraft and kpatch: it uses kGraft's per-task consistency and syscall barrier switching combined with kpatch's stack trace switching
  • 20. O que é um Livepatch?
  • 21. O que é um livepatch? ● Um módulo/driver de Linux, como qualquer outro, que faz uso de uma API específica. ● Contém hooks para registrar uma função a ser executada no lugar da atual função que contém a falha que pode ser explorada. A nova função deve ser uma cópia da função antiga com a correção aplicada.
  • 22. O que é um livepatch? ● Utiliza ftrace para fazer o patching ○ Framework para diversas funcionalidades no kernel (incluindo tracing)
  • 23. Example - livepatch /proc/cmdline interface // Original function from fs/proc/cmdline.c static int cmdline_proc_show(struct seq_file *m, void *v) { seq_puts(m, saved_command_line); seq_putc(m, 'n'); return 0; }
  • 24. Example - livepatch /proc/cmdline interface // samples/livepatch/livepatch-sample.c #include <linux/seq_file.h> // Replacement function, note the same argument and return interface static int livepatch_cmdline_proc_show(struct seq_file *m, void *v) { seq_printf(m, "%sn", "this has been live patched"); return 0; } // ... continued ...
  • 25. Example - livepatch /proc/cmdline interface // klp_func[] array describes all livepatch original and replacement functions static struct klp_func funcs[] = { { .old_name = "cmdline_proc_show", .new_func = livepatch_cmdline_proc_show, }, { } }; // ... continued ...
  • 26. Example - livepatch /proc/cmdline interface // klp_object[] array describes all kernel objects (NULL for vmlinux) and functions to patch static struct klp_object objs[] = { { .funcs = funcs, }, { } }; // klp_patch contains all objects to patch static struct klp_patch patch = { .mod = THIS_MODULE, .objs = objs, }; // ... continued ...
  • 27. Example - livepatch /proc/cmdline interface static int livepatch_init(void) { return klp_enable_patch(&patch); } static void livepatch_exit(void) { } module_init(livepatch_init); // wire up module init/exit functions to enable the livepatch module_exit(livepatch_exit); MODULE_LICENSE("GPL"); MODULE_INFO(livepatch, "Y"); // don’t forget to identify the module as a livepatch
  • 29. Formas de criar um livepatch “A man is a man, but a man with a tool makes two.” Ahti, the janitor
  • 30. Formas de criar um livepatch ● Geração de livepatch comparando código objeto defeituoso com de código objeto com a correção aplicada ○ kpatch ● Extração de código defeituoso, corrigir código e gerar o livepatch ○ klp-build + clang-extract
  • 31. klp-build + clang-extract ● Verifica configurações do kernel a ser usado para criado o livepatch ○ Símbolos existentes ○ Arquivos presentes ○ Configuração habilitada ○ Módulos presentes ○ Aplica patches antes de chamar clang-extract ○ Aplica um template no resultado do clang-extract (registra o livepatch) ● Extrai código da função a ser corrigida ○ Verifica funções inline e as traz junto do código extraído ○ Renomeia símbolos caso necessário ○ Verifica quais símbolos são privados ○ Cria um closure das funções, declarações, tipos e tudo mais o que for necessário para criar um código standalone.
  • 32. clang-extract ● Extrair código e adaptar usos ○ Símbolos privados e inline ● Gerar código independente em relação a outros módulos ● Referenciar usos vs Copiar tudo o for utilizado ○ Livepatches cumulativos ● Código extraido compilado em multiplas plataformas? ○ Código específico de arquitetura?
  • 33. klp-build + clang-extract $ klp-build setup --name lp-cve-2021-22600 --kdir --data-dir ~/git/linux --conf CONFIG_UNIX --file-funcs net/packet/af_packet.c packet_set_ring --module af_packet
  • 34. klp-build + clang-extract $ ls ~/git/linux/fixes 0001-net-packet-rx_owner_map-depends-on-pg_vec.patch $ klp-build extract --apply-patches --name lp-cve-2021-22600
  • 35. klp-build + clang-extract $ cd $KLP_WORK_DIR/lp-cve-2021-22600/ce/linux/lp $ make $ ls livepatch_lp-cve-2021-22600.c livepatch_lp-cve-2021-22600.mod livepatch_lp-cve-2021-22600.o modules.livepatch livepatch_lp-cve-2021-22600.h livepatch_lp-cve-2021-22600.mod.c livepatch_lp-cve-2021-22600.tmp.ko modules.order livepatch_lp-cve-2021-22600.ko livepatch_lp-cve-2021-22600.mod.o Makefile Module.symvers
  • 37. Manipulando livepatches $ insmod $KLP_WORK_DIR/lp-cve-2021-22600/ce/linux/lp/livepatch_lp-cve-2021-22600.ko $ dmesg [ 132.393529] livepatch_lp_cve_2021_22600: loading out-of-tree module taints kernel. [ 132.396514] livepatch_lp_cve_2021_22600: tainting kernel with TAINT_LIVEPATCH [ 132.416329] livepatch: enabling patch 'livepatch_lp_cve_2021_22600' [ 132.424739] livepatch: 'livepatch_lp_cve_2021_22600': starting patching transition [ 139.629624] livepatch: 'livepatch_lp_cve_2021_22600': patching complet
  • 38. Manipulando livepatches $ ls /sys/kernel/livepatch/ livepatch_lp_cve_2021_22600 $ ls /sys/kernel/livepatch/livepatch_lp_cve_2021_22600/ af_packet enabled force transition $ cat /sys/kernel/livepatch/livepatch_lp_cve_2021_22600/enabled 1
  • 39. Manipulando livepatches $ sudo echo 0 > /sys/kernel/livepatch/livepatch_lp_cve_2021_22600/enabled $ dmesg [ 495.010847] livepatch: 'livepatch_lp_cve_2021_22600': starting unpatching transition [ 495.919239] livepatch: 'livepatch_lp_cve_2021_22600': unpatching complete $ ls /sys/kernel/livepatch/ $ # sem livepatches aplicados
  • 40. Demo CVE-2021-22600 com livepatch aplicado
  • 41. Demo CVE-2021-22600 com livepatch aplicado e desativado
  • 42. Referências ● mpdesouza.com - multiplos posts sobre vulnerabilidades ● Linux Foundation Mentoring Session: Linux Livepatching - An Introduction ● Test do LTP para explorar o CVE-2021-22600 ● https://docs.kernel.org/livepatch/livepatch.html ● https://docs.kernel.org/trace/ftrace-uses.html ● https://github.com/SUSE/klp-build ● https://github.com/SUSE/clang-extract ● https://github.com/dynup/kpatch
  • 43. Obrigado! Marcos Paulo de Souza mpdesouza.com marcos@mpdesouza.com mpdesouza@suse.com https://github.com/marcosps/ https://floss.social/@mpdesouza https://www.linkedin.com/in/marcospsouza/
  • 45. ftrace ● __fentry__ para NOP ● gcc / clang ○ -pg -mrecord-mcount -mfentry ● Exemplo: https://godbolt.org/z/6787dxfvM
  • 46. Livepatches - Mais do que ftrace ● Consistencia ● Controla transição entre versões da mesma função: ● Processos utilizando versão antiga vs processos utilizando a versão nova https://github.com/marcosps/kernel-api-examples/blob/main/ftrace-hijack.c https://elixir.bootlin.com/linux/v6.9.1/source/kernel/livepatch/patch.c#L121
  • 47. Livepatches - Implementação ● Patches aplicados em código, não dados! ● Formas de aplicar livepatches: ○ “Empilhados” (stacked) ○ Cumulativos (atomic replace) ● Shadow variables
  • 48. Livepatch consistency model: Starting Transition Start transition For all threads: Set thread flag as TIF_PATCH_PENDING Try to complete transition System remains executing threads during all livepatch transition phases
  • 49. Livepatch consistency model: Completing Transition System remains executing threads during all livepatch transition phases Try to complete transition For all threads If thread callstack is safe to patch, clear TIF_PATCH_PENDING Any remaining TIF_PATCH_PENDING threads? Transition complete Wake up idle and pending threads Sleep 1s No Yes
  • 50. Livepatches - mudanças na memória Sem o livepatch (gdb) disassemble packet_set_ring Dump of assembler code for function packet_set_ring: 0xffffffffc0214250 <+0>: nopl 0x0(%rax,%rax,1) 0xffffffffc0214255 <+5>: push %r15 0xffffffffc0214257 <+7>: push %r14 Com livepatch (gdb) disassemble packet_set_ring Dump of assembler code for function packet_set_ring: 0xffffffffc0214250 <+0>: call 0xffffffffc0260000 0xffffffffc0214255 <+5>: push %r15 0xffffffffc0214257 <+7>: push %r14
  • 51. Livepatches - Problemas ● Funções inline ● Funções privadas (klp-convert) ● Ftrace desabilitado ● Código presente em uma só arquitetura ● Solução upstream que não se aplicam em um livepatch diretamente ○ Solução altera structs ○ Código baixo nível ● Prioridade ○ Requer privilégios para explorar a falha?