Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

04 - Modo de Recuperação (break=premount, rd.break)

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

A robustez de um sistema operacional de classe corporativa exige mecanismos resilientes para recuperação de desastres. No ecossistema Linux, falhas críticas durante a transição do bootloader para o sistema de arquivos raiz — como corrupção da tabela de partições, erros sintáticos no /etc/fstab, ou perda de chaves LVM/LUKS — resultam invariavelmente em um Kernel Panic (especificamente, a incapacidade de montar o rootfs ou executar o /init).

Para diagnosticar e remediar essas falhas, a arquitetura do initramfs implementa pontos de interrupção (breakpoints) programáveis. Através da injeção de parâmetros específicos na linha de comando do kernel (via GRUB), o administrador pode "sequestrar" o fluxo de execução normal do processo /init, forçando o sistema a suspender a inicialização e abrir um shell de emergência diretamente no ambiente efêmero da memória RAM, antes que o desastre ou o travamento ocorra.


1. A Filosofia da Interrupção no Espaço Precoce

É fundamental distinguir a recuperação via initramfs de outras formas de recuperação de sistema, como o modo single-user (systemd.unit=rescue.target ou 1) ou a substituição direta do processo init (init=/bin/bash).

  • Quando passamos init=/bin/bash, o kernel ainda é obrigado a montar o disco físico real com sucesso; se a falha for na controladora de disco ou no LVM, este comando é inútil, pois o kernel não consegue alcançar o binário do bash.
  • Os parâmetros do initramfs (break, rd.break) agem antes do toque no disco físico. Eles invocam um shell contido na própria imagem cpio (geralmente provido pelo BusyBox), garantindo acesso irrestrito de depuração, independentemente do estado catastrófico do armazenamento persistente.

Esses pontos de interrupção são implementados como instruções de verificação dentro dos scripts em shell (ou binários) que compõem o /init. Ao identificar a diretiva na linha do kernel (analisada a partir de /proc/cmdline), o script suspende a chamada das funções subsequentes e invoca uma sessão de terminal no /dev/console.


2. O Paradigma Debian / Ubuntu (break=)

Em sistemas cujos ambientes de inicialização são gerados pelo mkinitramfs (família Debian), o parâmetro manipulador é a diretiva break. O administrador pode especificar exatamente em qual microssistema lógico a interrupção deve ocorrer.

A sintaxe no GRUB adicionada ao final da linha que inicia com linux é: break=<estágio>

Os estágios cronológicos disponíveis são:

  • top: O ponto mais precoce possível. Ocorre imediatamente após o kernel lançar o /init. Nem mesmo o udev foi iniciado. Útil apenas para depurar a carga do próprio initramfs.
  • modules: Interrompe após o carregamento inicial dos módulos estritos necessários, mas antes da ativação do gerenciador de dispositivos.
  • premount: (O mais comum e útil). A interrupção ocorre após o carregamento dos drivers (controladoras AHCI, NVMe) e após o processamento do udev, mas estritamente antes de qualquer tentativa de montar o sistema de arquivos raiz real. Neste ponto, os dispositivos de bloco físicos (como /dev/sda1) já existem, permitindo que o administrador execute fsck, ative volumes lógicos manualmente ou corrija problemas de criptografia sem que os discos estejam "ocupados" (busy).
  • mount: Interrompe o processo imediatamente após a montagem da raiz real no diretório de transição (/root ou /sysroot), mas antes de processar hierarquias adicionais (como /usr).
  • mountroot: Disparado caso o script de montagem da raiz falhe. Se o initramfs não conseguir achar o disco por um erro de UUID, ele automaticamente cai neste ponto de break.
  • bottom: Interrompe no último milissegundo antes da invocação do utilitário run-init (que realiza o switch_root e apaga a memória RAM).

Ao sair do shell do initramfs (executando exit ou Ctrl+D), o script retoma seu fluxo normal de onde parou, tentando finalizar o processo de inicialização com as correções aplicadas pelo administrador.


3. O Paradigma RHEL / Fedora / SUSE (rd.break)

Sistemas que utilizam o gerador dracut possuem uma abordagem ainda mais granular, guiada por eventos (event-driven), através do parâmetro rd.break.

Se o parâmetro for passado isoladamente (rd.break), ele padroniza para o estágio pre-pivot (imediatamente antes de entregar o controle ao disco real). Contudo, pode-se especificar o ponto exato com a sintaxe rd.break=<estágio>.

Estágios de interrupção no dracut:

  • cmdline: Antes do dracut ler as opções do kernel ou iniciar processos, servindo para alterar a configuração da lógica do próprio script interno.
  • pre-udev: Antes do systemd-udevd (embutido no initramfs) iniciar a varredura do barramento PCIe/USB.
  • pre-trigger: O daemon udev está rodando, mas ainda não injetou os eventos de frio (coldplug events) que forçam o carregamento dos .ko.
  • initqueue: O ponto onde o dracut aguarda todos os dispositivos de bloco (SATA, UUIDs requisitados) aparecerem e estabilizarem.
  • pre-mount: Semelhante ao premount do Debian, o hardware está estabilizado, mas a montagem não começou.
  • mount: Após o sistema de arquivos alvo (/sysroot) ser montado.
  • pre-pivot: (Alvo primário de recuperação administrativa). A raiz já foi descoberta e montada em modo somente leitura (RO) no /sysroot. Este é o local exato para redefinir senhas, pois o sistema de arquivos já está exposto, bastando remontá-lo.
  • cleanup: Imediatamente antes de invocar o binário switch_root final.

4. O Ambiente de Shell Restrito e Volátil

Independentemente da distribuição, o administrador será saudado com um prompt primitivo (frequentemente (initramfs) ou sh-5.1#). Este ambiente exige perícia técnica aguçada, dadas as suas severas restrições arquiteturais:

  1. Ausência da Glibc Completa: Os binários dependem de bibliotecas mínimas. Ferramentas como o awk ou grep possuem funcionalidades reduzidas (são frequentemente applets do BusyBox).
  2. Sem Resolução de Nomes: A rede geralmente não está configurada e não há /etc/resolv.conf.
  3. Volatilidade Total: Qualquer arquivo criado na raiz / deste ambiente é armazenado na memória RAM (via tmpfs) e será completamente aniquilado no instante em que o sistema executar o switch_root. Correções permanentes devem ser aplicadas nos dispositivos físicos (ex: /dev/sda1 ou /sysroot/etc/).
  4. Variáveis de Ambiente Mínimas: Não há $PATH robusto, requerendo frequentemente invocações por caminhos absolutos (/usr/sbin/lvm, /sbin/cryptsetup).

5. Fluxos de Trabalho de Recuperação Avançada (Use Cases)

A manipulação dos estágios de break possibilita o reparo profundo da máquina. Abaixo são detalhados os dois fluxos primários de engenharia de recuperação.

Caso 1: Redefinição de Senha do Root (Bypassing SysAdmin Lockout)

Este é o fluxo clássico empregado em servidores RHEL/CentOS.

  1. No menu do GRUB, edita-se a linha do kernel anexando: rd.break.
  2. O sistema interrompe no estágio pre-pivot. A raiz física real está montada em /sysroot, porém como ro (somente leitura).
  3. O administrador remonta a raiz com permissão de escrita e leitura:
mount -o remount,rw /sysroot

  1. Aplica-se o comando de isolamento chroot para alterar a raiz lógica da sessão de terminal atual para dentro do disco físico:
chroot /sysroot

  1. Agora operando virtualmente dentro do sistema real, o administrador altera a senha com o comando passwd root.
  2. A Armadilha do SELinux: A modificação do /etc/shadow a partir de um ambiente que não carrega as políticas ativas do SELinux deixará o arquivo com contextos de segurança incorretos, o que impedirá o login futuro. É obrigatório agendar a reetiquetagem estática do sistema (autorelabeling) instruindo o processo PID 1 posterior:
touch /.autorelabel

  1. Executa-se exit duas vezes (uma para sair do chroot, outra para sair do shell do initramfs). O sistema retoma o boot.

Caso 2: Falha de Montagem por Corrupção no /etc/fstab

Se um disco secundário listado em /etc/fstab for fisicamente removido sem ser comentado no arquivo, o sistema se recusará a finalizar o boot, caindo em um estado de emergência cíclico.

  1. Utiliza-se break=premount ou rd.break=pre-mount.
  2. Como a raiz falhou ao montar, o administrador deve montá-la manualmente no ponto de transição:
mkdir -p /mnt/root
mount -t ext4 /dev/mapper/vg0-root /mnt/root

  1. Edita-se o arquivo defeituoso usando as ferramentas reduzidas (como o vi do BusyBox):
vi /mnt/root/etc/fstab

  1. Após deletar a linha problemática, o sistema é reiniciado ou a montagem é liberada para a retomada do fluxo.

6. Considerações Arquiteturais de Segurança (Threat Modeling)

A mera existência da funcionalidade de injeção de breakpoints demonstra um axioma inviolável da segurança de TI: acesso físico é igual a acesso de superusuário. A capacidade de anexar rd.break permite ignorar senhas locais, burlar restrições de PAM (Pluggable Authentication Modules) e ler dados do banco de dados em texto claro.

Para mitigar esta vulnerabilidade arquitetural em servidores e laptops de missão crítica, a infraestrutura exige uma sobreposição de tecnologias defensivas:

  1. Senhas no Bootloader (GRUB Password): Requer PBKDF2 (derivação de chave criptográfica) para bloquear qualquer tentativa de pressionar a tecla e (edit) no menu do GRUB. Se o invasor não pode editar a linha do kernel, não pode injetar a string rd.break.
  2. Secure Boot e UEFI Locked: Impede que o invasor inicialize um kernel malicioso externo (via pendrive) para acessar os discos. Contudo, o Secure Boot tradicional confia no GRUB assinado, não protegendo contra a edição arbitrária da cmdline. Para proteção verdadeira da linha de comando, utiliza-se UKIs (Unified Kernel Images), onde a imagem do kernel, o initramfs e os parâmetros de cmdline são empacotados em um único binário e assinados digitalmente em bloco; qualquer adulteração na linha de comando invalida a assinatura UEFI.
  3. FDE (Full Disk Encryption - LUKS): A linha de defesa absoluta. Mesmo que um invasor consiga aplicar o rd.break e caia no shell do initramfs, o disco físico /dev/nvme0n1p2 exibirá entropia caótica (criptografada). Sem a senha de Volume Mestre ou acesso ao chip TPM, a montagem para leitura e a injeção do chroot são criptograficamente impossíveis, neutralizando o vetor de ataque do initramfs.