Reptar
(lock.cmpxchg8b.com)Descoberta de um mistério na CPU
- Se você tem interesse em erros que podem ocorrer dentro de CPUs modernas, vale a pena continuar lendo.
- Se você já escreveu assembly x86, provavelmente conhece a instrução
rep movsb, usada para mover memória. - Depois de definir a origem, o destino, a direção e a contagem, o processador cuida de todos os detalhes.
Interpretação de prefixos de instrução
- Uma das características do x86 é que a decodificação de instruções costuma ser muito flexível.
- Mesmo ao usar prefixos sem significado ou que entram em conflito com outros prefixos, na maioria dos casos eles são ignorados.
- Compiladores podem usar prefixos desnecessários para ajustar ao alinhamento desejado.
Prefixo REX
- O i386 tinha 8 registradores de uso geral, então era possível especificar um registrador com 3 bits.
- O x86-64 introduziu 8 registradores de uso geral adicionais, passando a exigir mais bits.
- O prefixo rex permite que a instrução seguinte “empreste” bits extras, tornando possível codificar 16 registradores de uso geral.
Regras de codificação
- O prefixo rex aumenta o espaço disponível para codificar operandos.
- Prefixos desnecessários ou redundantes são, em sua maioria, ignorados no x86.
- A instrução
rex.rxb rep movsbnão tem operandos, então os bits rex não têm significado, e o processador ignora o prefixo rex.
Fast Short Repeat Move (FSRM)
- FSRM é um novo recurso introduzido no Ice Lake para resolver desvantagens do ERMS.
- No ERMS, a parte difícil de mover strings com eficiência é alinhar o buffer para usar o armazenamento mais largo possível.
- O FSRM tem como objetivo mover mais rapidamente strings curtas de até 128 bytes.
Descoberta
- Usando uma técnica de verificação de processadores chamada Oracle Serialization, foi verificado se duas formas de um programa gerado aleatoriamente chegavam ao mesmo estado final.
- Em agosto, o pipeline de verificação encontrou um caso em que adicionar um prefixo rex.r redundante a uma operação
rep movsotimizada por FSRM levava a resultados imprevisíveis. - Foi confirmado que, quando múltiplos núcleos disparam o mesmo bug, o processador relata uma exceção de machine check e para de funcionar.
Reprodução
- Os resultados da pesquisa foram divulgados em um repositório de pesquisa em segurança.
- Para reproduzir a vulnerabilidade, é possível usar a ferramenta
icebreak. - Em sistemas não afetados, não deve haver nenhuma saída; já em sistemas afetados, um
.é exibido a cada reprodução bem-sucedida.
Análise
- Como o funcionamento interno do microcódigo em sistemas modernos é mantido em segredo, só é possível formular teorias com base em observações.
- A suspeita é que o bug faça o frontend calcular incorretamente o tamanho da instrução
movsb, fazendo com que entradas subsequentes no ROB (reorder buffer) sejam associadas ao endereço errado.
Perguntas
- Pode haver dúvidas sobre o que é possível fazer nesse estado inesperado de “glitch”.
- Sabe-se que é possível corromper o estado do sistema o suficiente para provocar um erro de machine check, e que uma thread pode afetar a execução do processo irmão em SMT.
- Como não há meio de depurar a execução de μops, não se sabe se é possível alcançar elevação de privilégios.
Solução
- A Intel publicou microcódigo atualizado para todos os processadores afetados.
- O fornecedor do sistema operacional ou da BIOS pode já ter disponibilizado a atualização.
Alternativa
- Se a atualização não for possível, é possível desativar fast strings por meio do registrador específico de modelo IA32_MISC_ENABLE.
- Isso causa uma queda significativa de desempenho, então só deve ser usado quando for realmente necessário.
Opinião do GN⁺
O ponto mais importante deste artigo é mostrar que estados inesperados de “glitch” podem ser descobertos em CPUs modernas e que isso pode levar a vulnerabilidades de segurança. O texto pode ser interessante para engenheiros de software e ajuda a aumentar a consciência sobre a complexidade das CPUs e a fragilidade dos sistemas. Além disso, contribui para entender como esse tipo de descoberta pode evoluir para ameaças reais de segurança e reforça a importância do microcódigo atualizado.
1 comentários
Comentários do Hacker News
A equipe de Konrad Magnusson encontrou um problema relacionado ao mimalloc.
Várias equipes de pesquisa do Google descobriram o bug de forma independente.
O processador relata uma exceção de verificação de máquina e para de funcionar.
Isso levou à percepção de uma falta de entendimento sobre hardware.
Lembra o diagnóstico do qemu quando enfrentou o problema de
repz ret.repz ret.Funcionários da própria Intel e do Google relataram o problema.
Muito mais interessante do que o artigo do Google.
Questiona-se se é possível projetar uma CPU que execute de forma especulativa sem executar em ordem, e se isso seria possível sem problemas de segurança.
Explicação sobre o aviso de segurança da Intel.