ASA-2019-00051 – rdesktop: Integer overflow que leva a um heap-based buffer overflow na função process_bitmap_updates()


For the English version of this alert, click here.

Allele Security Alert

ASA-2019-00051

Identificador(es)

ASA-2019-00051, CVE-2018-8795

Título

Integer overflow que leva a um heap-based buffer overflow na função process_bitmap_updates()

Fabricante(s)

rdesktop team

Produto(s)

rdesktop

Versão(ões) afetada(s)

rdesktop versões até e incluindo v1.8.3

Versão(ões) corrigida(s)

rdesktop v1.8.4

Prova de conceito

Desconhecida

Descrição

As versões rdesktop até e inclusive v1.8.3 contêm um integer overflow que leva a um heap-based buffer overflow na função process_bitmap_updates() e resulta em uma corrupção de memória e, provavelmente, até mesmo uma execução remota de código.

Detalhes técnicos

Outra vulnerabilidade clássica é um integer overflow ao processar as atualizações de bitmap (conteúdo de tela) recebidas, como pode ser visto abaixo:

/* Process bitmap updates*/
void 
process_bitmap_updates(STREAM s){
    uint16 num_updates;
    uint16 left, top, right, bottom, width, height;
    uint16 cx, cy, bpp, Bpp, compress, bufsize, size;
    uint8 *data, *bmpdata;
    int i;

    in_uint16_le(s,num_updates)

    for(i=0 i<num_updates; i++){
         in_uint16_le(s,left);
         in_uint16_le(s,top);
         in_uint16_le(s,right);
         in_uint16_le(s,bottom);
         // EI-DBG: Here we control width (16bit), height (16bit), and bpp (13bit)
         in_uint16_le(s,width);
         in_uint16_le(s,height);
         in_uint16_le(s,bpp);
         Bpp = (bpp + 7) / 8;
         ...
         in_uint8p(s,data,size);
         // EI-DBG: A nice Integer-Overflow: width * height * Bpp > 4Gb
         // EI-DBG: Since the compression methods stop on illegal opcode, 
         // EI-DBG: this is a controllable heap-based Buffer-Overflow
         bmpdata = (uint8 *)xmalloc(width * height * Bpp);
         if(bitmap_decompress(bmpdata, width, height, data, size, Bpp))
         {
             ui_paint_bitmap(left, top, cx, cy, width, height, bmpdata)
         }
         else
         {
             DEBUG_RDPS(("Failed to decompress data\n"));
         }
    }
}

Embora “width” e “height” tenham apenas 16 bits cada, multiplicando-os por “Bpp” (bits por pixel), podemos disparar integer overflow. Mais tarde, a descompactação de bitmaps processará nossa entrada e quebrará qualquer erro de descompactação, dando-nos um heap-based buffer overflow.

Créditos

Eyal Itkin (Checkpoint Research)

Referência(s)

Reverse RDP Attack: Code Execution on RDP Clients
https://research.checkpoint.com/reverse-rdp-attack-code-execution-on-rdp-clients/

Updated ChangeLog and bumped version to 1.8.4
https://github.com/rdesktop/rdesktop/commit/34b8a18fe5d4de795851defe34b3ad3e1f43532b

CVE-2018-8795
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-8795

CVE-2018-8795
https://nvd.nist.gov/vuln/detail/CVE-2018-8795

Se encontrou algum erro neste alerta ou deseja uma análise compreensiva, entre em contato.

Última modificação: 11 fevereiro 2019

Não somos responsáveis por qualquer perda de dados, corrupção de dispositivos ou qualquer outro tipo de problema devido ao uso de qualquer informação mencionada em nossos alertas de segurança.