Talos Vulnerability Report


Leadtools Image Parser Animated Icon Code Execution Vulnerability

July 1, 2020
CVE Number



An exploitable code execution vulnerability exists in the ANI file format parser of Leadtools 20. A specially crafted ANI file can cause a buffer overflow resulting in remote code execution. An attacker can provide a malicious file to trigger this vulnerability.

Tested Versions

Leadtools 20

Product URLs


CVSSv3 Score

8.8 - CVSS:3.0/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H


CWE-787 - Out-of-bounds Write


LEADTOOLS is a collection of comprehensive toolkits to integrate document, medical, multimedia, and imaging technologies into desktop, server, tablet, and mobile applications.

The modules analyzed in this vulnerability are below:

Loaded symbol image file: C:\LEADTOOLS 20\Bin\CDLL\x64\lfAniX.DLL
Image path: C:\LEADTOOLS 20\Bin\CDLL\x64\lfAniX.DLL    
Image name: lfAniX.DLL
Browse all global symbols  functions  data
Timestamp:        Thu Nov  7 17:04:48 2019 (5DC4BF30)
CheckSum:         00021FCB
ImageSize:        0001C000
File version:
Product version:
File flags:       0 (Mask 3F)
File OS:          40004 NT Win32

One toolkit provided by LEADTOOLS is an ANI image parser. This image parser can be hit from a variety of example applications included the Barcode reader and ImageViewer.

When parsing an ANI image, various structures are parsed. The first header is the ANIH header which contains the following information:

struct ANIH {
    header: ['a', 'n', 'i', 'h'],
    header_size: u32,
    num_frames: u32,
    num_steps: u32,
    width: u32,
    height: u32,
    bit_count: u32,
    num_planes: u32,
    display_rate: u32,
    flags: u32,

In particular, the ANIH header contains the width in pixels of the image itself. Another header that is parsed by Leadtools is the RATE header. This header contains only one value. This value is the display rate for frame 0.

struct RATE {
    header: ['r', 'a', 't', 'e'],
    size: u32

When encountering the RATE header, a buffer is allocated based on the provided rate from the image. This buffer is then filled with the number of bytes provided by the width field in the ANIH header.

if ( rate_header.signature == 'etar' )
    v10 = L_LocalAllocInit(
            (unsigned int)rate_header.display_rate,
    v57 = v10;
    if ( v10 )
        L_RedirectedRead(v6, v10, (unsigned int)(4 * anih_header.width));

It is possible to provide a display rate such that a small enough buffer is allocated that when it is populated using the provided width value, the allocated buffer is overwritten. This corruption of the heap could potentially result in code execution.


2020-02-11 - Vendor Disclosure
2020-06-08 - Talos extended disclosure deadline to 2020-06-30
2020-06-29 - Vendor Patched
2020-07-01 - Public Release


Discovered by Cory Duplantis of Cisco Talos.