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