CVE-2025-64735
An out-of-bounds read vulnerability exists in the EMF functionality of Canva Affinity. By using a specially crafted EMF file, an attacker could exploit this vulnerability to perform an out-of-bounds read, potentially leading to the disclosure of sensitive information.
The versions below were either tested or verified to be vulnerable by Talos or confirmed to be vulnerable by the vendor.
Canva Affinity 3.0.1.3808
Affinity - https://www.affinity.studio/
6.1 - CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:L
CWE-125 - Out-of-bounds Read
Affinity is a professional and versatile suite of creative applications designed for graphic design, photo editing, and desktop publishing. It provides a fast, streamlined experience with powerful tools to create illustrations, edit images, and design print or digital layouts. The suite is widely regarded as a capable and affordable alternative the software like Adobe Creative Cloud.
Affinity applications support the EMF file format, and this vulnerability is associated with how EMF files are processed.
An EMF (Enhanced Metafile Format) file stores images in a device-independent form. It begins with a header (EMR_HEADER) that contains information about the structure and contents of the metafile. The structure of the EMR_HEADER is as follows:
Offset Size Name
------ ---- --------------------------------------
0x00 0x04 recordType (0x00000001 )
0x04 0x04 recordSize
0x08 0x10 bounds
0x18 0x10 frame
0x28 0x04 recordSignature (0x464D4520)
0x2C 0x04 version
0x30 0x04 sizeInBytes
0x34 0x04 numOfRecords
0x38 0x02 Handles
0x3A 0x02 Reserved
Please note that the structure of EMR_HEADER shown is not complete; it only includes the relevant fields.
For the EMR_HEADER record, the recordType must be 0x00000001. The recordSize indicates the total size of the header record in bytes. The recordSignature field defines the record signature, which must have the value 0x464D4520 (FME ). The sizeInBytes field specifies the size of the metafile in bytes. The numOfRecords indicates the total number of records present in the metafile, including the EMR_HEADER.
This vulnerability is associated with the record type EMR_STRETCHBLT.
The EMR_STRETCHBLT record defines a block transfer of pixels from a source bitmap to a destination rectangle. Its structure is defined as follows:
Offset Size Name
----- ---------- --------------------------------------
0x00 0x04 recordType (0x0000004D )
0x04 0x04 recordSize
0x08 0x10 Bounds
0x18 0x04 xDest
0x1C 0x04 yDest
0x20 0x04 cxDest
0x24 0x04 cyDest
0x28 0x04 BitBltRasterOperation
0x2C 0x04 xSrc
0x30 0x04 ySrc
0x34 0x18 XformSrc
0x4c 0x04 BkColorSrc
0x50 0x04 UsageSrc
0x54 0x04 offBmiSrc (n)
0x58 0x04 cbBmiSrc (p)
0x5C 0x04 offBitsSrc
0x60 0x04 cbBitsSrc (q)
0x64 0x04 cxSrc
0x68 0x04 cySrc
n p+q BitmapBuffer
For the EMR_STRETCHBLT record, the recordType value must be 0x0000004D. The offBmiSrc field specifies the offset from the beginning of the record to the source bitmap header located in the BitmapBuffer field.
This vulnerability arises because the offBmiSrc value is greater than the recordSize field, which can result in an out‑of‑bounds read when the source bitmap header is accessed. This behavior can be observed while debugging with pageheap enabled.
0:034> g
Breakpoint 0 hit
libpersona!Emf::EmfLoader::LoadDocument+0x4d3b6:
00007ffa`4ef1b536 488bf2 mov rsi,rdx
0:032> r
rax=00000020aa9ff098 rbx=000001d6d48300a4 rcx=00000020aa9ff390
rdx=000001d6d48300a4 rsi=000001d9af842d20 rdi=00000020aa9ff2d0
rip=00007ffa4ef1b536 rsp=00000020aa9fef10 rbp=00000020aa9ff010
r8=000001d91a2dcff0 r9=0000000000000001 r10=00000000ffffffef
r11=00000020aa9fefa0 r12=00007ffa4ef1fe80 r13=000001d6d4830000
r14=0000000000000001 r15=0000000000000000
iopl=0 nv up ei pl nz na pe nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
libpersona!Emf::EmfLoader::LoadDocument+0x4d3b6:
00007ffa`4ef1b536 488bf2 mov rsi,rdx
0:032> dd 000001d6d48300a4 ;<---------------------------------------------- (1)
000001d6`d48300a4 0000004d 000000e0 00000064 00000064
000001d6`d48300b4 0000044b 00000351 00000064 00000064
000001d6`d48300c4 000003e8 000002ee 00cc0020 00000000
000001d6`d48300d4 00000000 3f800000 00000000 00000000
000001d6`d48300e4 3f800000 00000000 00000000 00ffffff
000001d6`d48300f4 00000000 00010000 00000034 000000a0
000001d6`d4830104 00000040 00000008 00000002 00000028
000001d6`d4830114 00000008 00000002 00200001 00000003
0:032> r;p
rax=00000020aa9ff098 rbx=000001d6d48300a4 rcx=00000020aa9ff390
rdx=000001d6d48300a4 rsi=000001d9af842d20 rdi=00000020aa9ff2d0
rip=00007ffa4ef1b536 rsp=00000020aa9fef10 rbp=00000020aa9ff010
r8=000001d91a2dcff0 r9=0000000000000001 r10=00000000ffffffef
r11=00000020aa9fefa0 r12=00007ffa4ef1fe80 r13=000001d6d4830000
r14=0000000000000001 r15=0000000000000000
iopl=0 nv up ei pl nz na pe nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
libpersona!Emf::EmfLoader::LoadDocument+0x4d3b6:
00007ffa`4ef1b536 488bf2 mov rsi,rdx
libpersona!Emf::EmfLoader::LoadDocument+0x4d3b9:
00007ffa`4ef1b539 4c8bf1 mov r14,rcx
0:032> g
Breakpoint 1 hit
libpersona!Emf::EmfLoader::LoadDocument+0x4d58d:
00007ffa`4ef1b70d 8b4654 mov eax,dword ptr [rsi+54h] ds:000001d6`d48300f8=00010000 ; <----------------------------------- (2)
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4d590:
00007ffa`4ef1b710 85c0 test eax,eax
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4d592:
00007ffa`4ef1b712 0f84e6030000 je libpersona!Emf::EmfLoader::LoadDocument+0x4d97e (00007ffa`4ef1bafe) [br=0]
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4d598:
00007ffa`4ef1b718 837e5800 cmp dword ptr [rsi+58h],0 ds:000001d6`d48300fc=00000034
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4d59c:
00007ffa`4ef1b71c 0f84dc030000 je libpersona!Emf::EmfLoader::LoadDocument+0x4d97e (00007ffa`4ef1bafe) [br=0]
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4d5a2:
00007ffa`4ef1b722 8b4e5c mov ecx,dword ptr [rsi+5Ch] ds:000001d6`d4830100=000000a0
[..]
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4d5b1:
00007ffa`4ef1b731 4585c9 test r9d,r9d
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4d5b4:
00007ffa`4ef1b734 0f84c4030000 je libpersona!Emf::EmfLoader::LoadDocument+0x4d97e (00007ffa`4ef1bafe) [br=0]
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4d5ba:
00007ffa`4ef1b73a 488d1406 lea rdx,[rsi+rax] ;<------------------------------------ (3)
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4d5be:
00007ffa`4ef1b73e 4c8d040e lea r8,[rsi+rcx]
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4d5c2:
00007ffa`4ef1b742 4533ff xor r15d,r15d
0:032> r
rax=0000000000010000 rbx=0000000000000000 rcx=00000000000000a0
rdx=000001d6d48400a4 rsi=000001d6d48300a4 rdi=000001d75c990fc0
rip=00007ffa4ef1b742 rsp=00000020aa9fef10 rbp=00000020aa9ff010
r8=000001d6d4830144 r9=0000000000000040 r10=0000000000000004
r11=00000020aa9fee90 r12=0000000000cc0020 r13=000001d6d4830000
r14=00000020aa9ff390 r15=0000000000000000
iopl=0 nv up ei pl nz na pe nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
libpersona!Emf::EmfLoader::LoadDocument+0x4d5c2:
00007ffa`4ef1b742 4533ff xor r15d,r15d
0:032> dd 000001d6d48400a4 ;<------------------------------------ (4)
000001d6`d48400a4 ???????? ???????? ???????? ????????
000001d6`d48400b4 ???????? ???????? ???????? ????????
000001d6`d48400c4 ???????? ???????? ???????? ????????
000001d6`d48400d4 ???????? ???????? ???????? ????????
000001d6`d48400e4 ???????? ???????? ???????? ????????
000001d6`d48400f4 ???????? ???????? ???????? ????????
000001d6`d4840104 ???????? ???????? ???????? ????????
000001d6`d4840114 ???????? ???????? ???????? ????????
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4d5c5:
00007ffa`4ef1b745 4c897d90 mov qword ptr [rbp-70h],r15 ss:00000020`aa9fefa0=000001d9b61c8fb0
The contents of the EMR_STRETCHBLT record are examined at (1). At (2), the offBmiSrc value is read and added to the pointer at (3) to obtain the address pointing to the source bitmap header. However, the value of offBmiSrc is not validated before accessing the source bitmap header, and in this case, offBmiSrc is arbitrarily large. As a result, the computed address points to an unallocated memory region, as shown at (4). Accessing this memory region later in the program leads to an out‑of‑bounds read condition, which can be observed at the time of the crash.
0:032> g
(1318.1270): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
libbmp!Bmp::FileInputStream::IsValid+0x20a0:
00007ffa`edf6355f 8b02 mov eax,dword ptr [rdx] ds:000001d6`d48400a4=????????
0:032> dd 000001d6`d48400a4
000001d6`d48400a4 ???????? ???????? ???????? ????????
000001d6`d48400b4 ???????? ???????? ???????? ????????
000001d6`d48400c4 ???????? ???????? ???????? ????????
000001d6`d48400d4 ???????? ???????? ???????? ????????
000001d6`d48400e4 ???????? ???????? ???????? ????????
000001d6`d48400f4 ???????? ???????? ???????? ????????
000001d6`d4840104 ???????? ???????? ???????? ????????
000001d6`d4840114 ???????? ???????? ???????? ????????
0:032> u
libbmp!Bmp::FileInputStream::IsValid+0x20a0:
00007ffa`edf6355f 8b02 mov eax,dword ptr [rdx]
00007ffa`edf63561 4c8bda mov r11,rdx
00007ffa`edf63564 4c8bc9 mov r9,rcx
00007ffa`edf63567 83f828 cmp eax,28h
00007ffa`edf6356a 7215 jb libbmp!Bmp::FileInputStream::IsValid+0x20c2 (00007ffa`edf63581)
00007ffa`edf6356c 448b5210 mov r10d,dword ptr [rdx+10h]
00007ffa`edf63570 8b5220 mov edx,dword ptr [rdx+20h]
00007ffa`edf63573 450fb7430e movzx r8d,word ptr [r11+0Eh]
0:032> kb
# RetAddr : Args to Child : Call Site
00 00007ffa`4e91490f : 000001d9`88ad6fd0 00000000`00000000 00000000`00000000 00007ffa`fd855ba1 : libbmp!Bmp::FileInputStream::IsValid+0x20a0
01 00007ffa`4ef1b784 : 00000000`00000000 000001d6`d48300a4 00000000`00000000 000001d9`90090fd0 : libpersona!Dib::RasterHelper::CreateBitmapFromDib+0x6f
02 00007ffa`4ef20cab : 000001d9`b61c8fb0 000001d9`bc774fd0 000001d6`d48300a4 00000000`00000010 : libpersona!Emf::EmfLoader::LoadDocument+0x4d604
03 00007ffa`4ef1fe9c : 00000020`aa9ff390 00000000`000000a4 00000000`0000000f 000021d8`00000004 : libpersona!Emf::EmfLoader::LoadDocument+0x52b2b
04 00007ffa`faf0e73f : 00000000`000000a4 000001d9`af842d20 000001d6`af810000 000001d6`af810000 : libpersona!Emf::EmfLoader::LoadDocument+0x51d1c
05 00007ffa`fc56d432 : 000001d9`b89bcfd0 00000020`00000000 000001d9`b89bcfd0 00000000`00000000 : gdi32full!bInternalPlayEMF+0x250bf
06 00007ffa`4ef215ce : 00000000`00000000 00000020`aa9ff3f0 00000020`aa9ff670 000001d9`8d470f90 : GDI32!EnumEnhMetaFileStub+0x52
07 00007ffa`4eecdb56 : 00000020`aa9ff390 00000020`aa9ff320 00000000`00000000 00007ffa`fd881910 : libpersona!Emf::EmfLoader::LoadDocument+0x5344e
08 00007ffa`4eece041 : 000001d9`8d470f90 000001d9`af842d20 000001d9`8d470f90 00000020`aa9ff670 : libpersona!Emf::EmfLoader::LoadDocument+0x86
09 00007ffa`4eece2ab : 00000020`aa9ff708 000001d9`8d470f90 00000020`aa9ff670 00000020`aa9ff720 : libpersona!Emf::EmfLoader::LoadDocument+0x101
0a 00007ffa`4eece124 : 000001d9`afc21740 00000020`aa9ff708 00000020`aa9ff6d8 00000020`aa9ff751 : libpersona!Emf::EmfLoader::LoadDocument+0x12b
0b 00007ffa`4ec83a94 : 000001d9`b3518fa0 000001d9`afc21740 00000020`aa9ff7b0 00000020`aa9ffa78 : libpersona!Emf::EmfLoader::LoadDocument+0x94
0c 00007ffa`4ec5088f : 000001d9`afc21740 00000000`00000000 00000000`00000000 00000000`ffffff00 : libpersona!DocumentController::TryLoadEMF+0xc4
0d 00007ffa`4ec4eacc : 00000000`00000000 000001d9`00000001 00000000`00000000 00000000`00000000 : libpersona!DocumentController::LoadDocumentI+0xfaf
0e 00007ffa`51283602 : 000001d9`ae21a690 00000000`00000000 000001d9`aad58f70 00000000`00000000 : libpersona!DocumentController::LoadDocument+0x8c
0f 00007ffa`52a96cea : 000001d9`ae21a6c8 000001d9`897daf00 00007ffa`af8c2800 00000000`00000000 : libpersona!LoadDocumentCommand::Do+0x252
10 00007ffa`af2464cf : 00000000`00000000 000001d9`aad58f70 00000000`00000000 000001d9`9b9ccfe0 : libpersona!PersonaController::StaticDoCommand+0x3a
11 00007ffa`af49f47f : 000001d9`c3b68fd0 00000000`00000481 00000000`00000000 000001d9`a8c3ef90 : libkernel!Kernel::InSerialiserPropertyDataStream::LoadValues+0xb787f
12 00007ffa`fcc17374 : 00007ffa`af8c2800 00000000`00000000 00000000`00000000 00000000`00000000 : libkernel!Kernel::InSerialiserPropertyDataStream::LoadValues+0x31082f
13 00007ffa`fd87cc91 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : KERNEL32!BaseThreadInitThunk+0x14
14 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x21
0:032> lmDvm libpersona
Browse full module list
start end module name
00007ffa`49180000 00007ffa`60abb000 libpersona (export symbols) C:\Program Files\WindowsApps\Canva.Affinity_3.0.1.3808_x64__8a0j1tnjnt4a4\App\libpersona.dll
Loaded symbol image file: C:\Program Files\WindowsApps\Canva.Affinity_3.0.1.3808_x64__8a0j1tnjnt4a4\App\libpersona.dll
Image path: C:\Program Files\WindowsApps\Canva.Affinity_3.0.1.3808_x64__8a0j1tnjnt4a4\App\libpersona.dll
Image name: libpersona.dll
Browse all global symbols functions data Symbol Reload
Timestamp: Mon Nov 3 07:34:40 2025 (6908CB90)
CheckSum: 17822078
ImageSize: 1793B000
Mapping Form: Loaded
Translations: 0000.04b0 0000.04e4 0409.04b0 0409.04e4
Information from resource tables:
Exploiting this vulnerability allows for the reading of arbitrary memory within the process, potentially disclosing sensitive information.
See security bulletin on trust.canva.com with the vulnerability details and vulnerable versions. (URL to advisory: https://trust.canva.com/?tcuUid=1f728b0d-17f3-4c9c-97e9-6662b769eb62)
2026-01-27 - Vendor Disclosure
2026-03-17 - Vendor Patch Release
2026-03-17 - Public Release
Discovered by KPC of Cisco Talos.