CVE 编号
2022 年 8 月 3 日
CVE-2022-32543
概括
ESTsoft Alyac 2.5.8.544 解析 OLE 文件的方式中存在整数溢出漏洞。特制的 OLE 文件可能导致堆缓冲区溢出,从而导致任意代码执行。攻击者可以提供恶意文件来触发此漏洞。
确认的易受攻击的版本
以下版本经 Talos 测试或验证为易受攻击,或由供应商确认易受攻击。
ESTsoft Alyac 2.5.8.544
产品网址
Alyac - https://www.estsecurity.com/public/product/alyac
CVSSV3 分数
7.3 - CVSS:3.0/AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:H
CWE
CWE-680 - 整数溢出到缓冲区溢出
细节
Alyac 是由 ESTsecurity 开发的 Microsoft Windows 防病毒程序,ESTsecurity 是 ESTsoft 的一部分。
当 Alyac 扫描带有签名的 OLE 格式文件时D0 CF 11 E0 A1 B1 1A E1,它会执行函数sub_18007F7B0来检查文件签名和后面的字节。
因此,要么 要么0x200存储0x1000在+0x60OLE 解析器对象 [1,2] 的偏移量处。稍后在计算堆分配的大小时使用此值。
; ... file checks ...
.text:000000018007F879 movzx ecx, word ptr [r8+1Ah] ; R8 points to the base of the file
.text:000000018007F87E lea eax, [rcx-3]
.text:000000018007F881 cmp ax, 1
.text:000000018007F885 ja short loc_18007F8E2
.text:000000018007F887 mov eax, 0FFFEh
.text:000000018007F88C cmp [r8+1Ch], ax
.text:000000018007F891 jnz short loc_18007F8E2
.text:000000018007F893 cmp cx, 3
.text:000000018007F897 jnz short loc_18007F8AA
.text:000000018007F899 cmp word ptr [r8+1Eh], 9
.text:000000018007F89F jnz short loc_18007F8AA
.text:000000018007F8A1 mov dword ptr [rdi+60h], 200h ; [1] ole parser object + 0x60
.text:000000018007F8A8 jmp short loc_18007F8BF
.text:000000018007F8AA ; ---------------------------------------------------------------------------
.text:000000018007F8AA
.text:000000018007F8AA loc_18007F8AA: ; CODE XREF: sub_18007F7B0+E7↑j
.text:000000018007F8AA ; sub_18007F7B0+EF↑j
.text:000000018007F8AA cmp cx, 4
.text:000000018007F8AE jnz short loc_18007F8E2
.text:000000018007F8B0 cmp word ptr [r8+1Eh], 0Ch
.text:000000018007F8B6 jnz short loc_18007F8E2
.text:000000018007F8B8 mov dword ptr [rdi+60h], 1000h ; [2] ole parser object + 0x60
如果文件按预期构建,它会调用sub_180080150which 然后快速调用sub_18007F9E0.
.text:000000018007F9E0 sub_18007F9E0 proc near ; CODE XREF: sub_180080150+9↓p
.text:000000018007F9E0 ; DATA XREF: .rdata:0000000180404750↓o ...
.text:000000018007F9E0
.text:000000018007F9E0 Src = byte ptr -1028h
.text:000000018007F9E0 var_28 = qword ptr -28h
.text:000000018007F9E0 arg_8 = qword ptr 10h
.text:000000018007F9E0 arg_10 = qword ptr 18h
.text:000000018007F9E0 arg_18 = qword ptr 20h
.text:000000018007F9E0
.text:000000018007F9E0 ; __unwind { // __GSHandlerCheck
.text:000000018007F9E0 push rbx
.text:000000018007F9E2 push rbp
.text:000000018007F9E3 push r15
.text:000000018007F9E5 mov eax, 1030h
.text:000000018007F9EA call _alloca_probe
.text:000000018007F9EF sub rsp, rax
.text:000000018007F9F2 mov rax, cs:__security_cookie
.text:000000018007F9F9 xor rax, rsp
.text:000000018007F9FC mov [rsp+1048h+var_28], rax
.text:000000018007FA04 mov rax, [rcx+20h]
.text:000000018007FA08 mov rbx, rcx
.text:000000018007FA0B xor ebp, ebp
.text:000000018007FA0D mov ecx, [rax+2Ch] ; [3] value at file offset +0x2C
.text:000000018007FA10 imul ecx, [rbx+60h] ; [4] Size which was set in sub_18007F7B0 e.g 0x200
.text:000000018007FA14 cmp rcx, [rbx+18h] ; [5] size of the file
.text:000000018007FA18 jbe short loc_18007FA22
.text:000000018007FA1A lea eax, [rbp+6]
.text:000000018007FA1D jmp loc_18007FB30
.text:000000018007FA22 ; ---------------------------------------------------------------------------
.text:000000018007FA22
.text:000000018007FA22 loc_18007FA22: ; CODE XREF: PARSE__18007F9E0+38↑j
.text:000000018007FA22 call [email protected][email protected] ; operator new(unsigned __int64) ; [6]
.text:000000018007FA27 mov [rbx+40h], rax
.text:000000018007FA2B test rax, rax
.text:000000018007FA2E jnz short loc_18007FA38
.text:000000018007FA30 lea ebp, [rax+3]
.text:000000018007FA33 jmp loc_18007FB2E
sub_18007F9E0检查值 [3] 乘以 [4] 是否小于文件 [5] 的大小。在这里,乘法结果被截断为 32 位值(存储到ECX),导致整数溢出。这个溢出的大小值小于实际需要的值,用于在 [6] 处分配堆内存。因此,在 [3] 处具有较大的值将导致整数溢出,并且文件大小的检查将通过。
然后它会从文件到分配的堆内存执行 0x200 字节的重复 memcpy(在崩溃测试用例的情况下),直到文件偏移+0x2C[8] 处的值指定的次数。由于分配的堆内存大小不足以存储0x200 * [file + 0x2C]字节,因此会发生堆溢出。
.text:000000018007FAD4 imul edi, esi
.text:000000018007FAD7 lea rdx, [rsp+1048h+Src] ; Src
.text:000000018007FADC mov r8d, r14d ; Size
.text:000000018007FADF add rdi, [rbx+40h]
.text:000000018007FAE3 mov rcx, rdi ; void *
.text:000000018007FAE6 call memcpy ; [7] CRASH!!!!
.text:000000018007FAEB test rdi, rdi
.text:000000018007FAEE jz short loc_18007FB04
.text:000000018007FAF0 mov rax, [rbx+20h]
.text:000000018007FAF4 inc esi
.text:000000018007FAF6 cmp esi, [rax+2Ch] ; [8]
以下是发生堆溢出时的堆栈跟踪。
0:000> k
# Child-SP RetAddr Call Site
00 000000a7`6c57e298 00007ffa`adc2faeb VCRUNTIME140!memcpy+0x1e3
01 000000a7`6c57e2a0 00007ffa`adc3015e coen!Coen_Clean+0x6bb5b
02 000000a7`6c57f2f0 00007ffa`adc2f8d6 coen!Coen_Clean+0x6c1ce
03 000000a7`6c57f320 00007ffa`adc257fa coen!Coen_Clean+0x6b946
04 000000a7`6c57f360 00007ffa`adbc91c2 coen!Coen_Clean+0x6186a
05 000000a7`6c57f6a0 00007ffa`adbb5795 coen!Coen_Clean+0x5232
06 000000a7`6c57f820 00007ffa`adbc3974 coen+0x5795
07 000000a7`6c57f960 00007ff7`ecb8116b coen!Coen_ScanPath+0xb4
...
2022-06-22 - 供应商披露
2022-08-03 - 公开发布
2022-08-03 - 供应商补丁发布
由 Cisco Talos 的 Jaewon Min 发现。