CVE-2026-20726
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_POLYBEZIERTO16.
The EMR_POLYBEZIERTO16 record specifies one or more Bezier curves. Its structure is defined as follows:
Offset Size Name
----- ---------- --------------------------------------
0x00 0x04 recordType (0x00000058)
0x04 0x04 recordSize
0x08 0x10 Bounds
0x18 0x04 Count (N)
0x1C 0x04*N aPoints
For the EMR_POLYBEZIERTO16 record, the recordType value must be 0x00000058. The Count field specifies the number of PointS objects in the aPoints field. The aPoints field is an array whose size is equal to Count.
This vulnerability occurs when the value of (0x1C + (4 * N)) exceeds recordSize. When this condition is met, an out‑of‑bounds read can occur during access to the aPoints array. This behavior can be observed while debugging with pageheap enabled.
0:032> g
Breakpoint 1 hit
libpersona!Emf::EmfLoader::LoadDocument+0x4878e:
00007ffa`4ef1690e 4c8bf9 mov r15,rcx
0:032> r
rax=00007ffa5d93ada0 rbx=000001d6d4830174 rcx=00000020aa9ff390
rdx=000001d6d4830174 rsi=000001d9b7ebad20 rdi=00000020aa9ff2d0
rip=00007ffa4ef1690e rsp=00000020aa9feff0 rbp=00000020aa9ff060
r8=000001d9b4402fe0 r9=0000000000000003 r10=00000000ffffffef
r11=00000020aa9fefc0 r12=00007ffa4ef1fe80 r13=000001d6d4830000
r14=000001d6d4830174 r15=0000000000000000
iopl=0 nv up ei pl nz na po nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000206
libpersona!Emf::EmfLoader::LoadDocument+0x4878e:
00007ffa`4ef1690e 4c8bf9 mov r15,rcx
0:032> dd 000001d6d4830174 ;<---------------------------------- (1)
000001d6`d4830174 00000058 00000028 00000000 00000000
000001d6`d4830184 a681e2ff ffffffff 03ffffff c8000000
000001d6`d4830194 9600fa00 6400c800 3d006400 81a0f300
000001d6`d48301a4 08000095 3c000000 08000000 3f000000
000001d6`d48301b4 18000000 61000000 61000000 c5000000
000001d6`d48301c4 61000001 3b000001 08000000 2a000000
000001d6`d48301d4 18000000 c2000000 64000001 89000000
000001d6`d48301e4 2b000002 3c000001 08000000 3e000000
0:032> p;r
rax=00007ffa5d93ada0 rbx=000001d6d4830174 rcx=00000020aa9ff390
rdx=000001d6d4830174 rsi=000001d9b7ebad20 rdi=00000020aa9ff2d0
rip=00007ffa4ef16911 rsp=00000020aa9feff0 rbp=00000020aa9ff060
r8=000001d9b4402fe0 r9=0000000000000003 r10=00000000ffffffef
r11=00000020aa9fefc0 r12=00007ffa4ef1fe80 r13=000001d6d4830000
r14=000001d6d4830174 r15=00000020aa9ff390
iopl=0 nv up ei pl nz na po nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000206
libpersona!Emf::EmfLoader::LoadDocument+0x48791:
00007ffa`4ef16911 e8baabffff call libpersona!Emf::EmfLoader::LoadDocument+0x43350 (00007ffa`4ef114d0)
0:032> p;r
rax=0000000000000000 rbx=000001d6d4830174 rcx=00000020aa9ff390
rdx=00007ffa4ef11506 rsi=000001d9b7ebad20 rdi=00000020aa9ff2d0
rip=00007ffa4ef16916 rsp=00000020aa9feff0 rbp=00000020aa9ff060
r8=00007ffa49180000 r9=0000000000000003 r10=00000000ffffffef
r11=00000020aa9fefc0 r12=00007ffa4ef1fe80 r13=000001d6d4830000
r14=000001d6d4830174 r15=00000020aa9ff390
iopl=0 nv up ei pl nz na po nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000206
libpersona!Emf::EmfLoader::LoadDocument+0x48796:
00007ffa`4ef16916 498b07 mov rax,qword ptr [r15] ds:00000020`aa9ff390=00007ffa5d93ada0
0:032> bp 00007FFA4EF169D1
0:032> g
Breakpoint 2 hit
libpersona!Emf::EmfLoader::LoadDocument+0x48851:
00007ffa`4ef169d1 4533ed xor r13d,r13d
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x48854:
00007ffa`4ef169d4 45396e18 cmp dword ptr [r14+18h],r13d ds:000001d6`d483018c=03ffffff ;<---------------------------------- (2)
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x48858:
00007ffa`4ef169d8 0f866b010000 jbe libpersona!Emf::EmfLoader::LoadDocument+0x489c9 (00007ffa`4ef16b49) [br=0]
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4885e:
00007ffa`4ef169de 4d8d661c lea r12,[r14+1Ch] ;<---------------------------------- (3)
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x48862:
00007ffa`4ef169e2 49b8ffffffffffffff0f mov r8,0FFFFFFFFFFFFFFFh
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4886c:
00007ffa`4ef169ec 0f1f4000 nop dword ptr [rax]
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x48870:
00007ffa`4ef169f0 410fbf442402 movsx eax,word ptr [r12+2] ds:000001d6`d4830192=c800 ;<---------------------------------- (4)
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x48876:
00007ffa`4ef169f6 660f6ef0 movd xmm6,eax
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4887a:
00007ffa`4ef169fa f30fe6f6 cvtdq2pd xmm6,xmm6
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x4887e:
00007ffa`4ef169fe 410fbf0424 movsx eax,word ptr [r12] ds:000001d6`d4830190=0000 ;<---------------------------------- (5)
0:032> p
libpersona!Emf::EmfLoader::LoadDocument+0x48883:
00007ffa`4ef16a03 660f6ef8 movd xmm7,eax
0:032> u
libpersona!Emf::EmfLoader::LoadDocument+0x48883:
00007ffa`4ef16a03 660f6ef8 movd xmm7,eax
00007ffa`4ef16a07 f30fe6ff cvtdq2pd xmm7,xmm7
00007ffa`4ef16a0b 4c8bf3 mov r14,rbx
00007ffa`4ef16a0e 483bda cmp rbx,rdx
00007ffa`4ef16a11 741e je libpersona!Emf::EmfLoader::LoadDocument+0x488b1 (00007ffa`4ef16a31)
00007ffa`4ef16a13 f20f113b movsd mmword ptr [rbx],xmm7
00007ffa`4ef16a17 f20f117308 movsd mmword ptr [rbx+8],xmm6
00007ffa`4ef16a1c 488b5dc8 mov rbx,qword ptr [rbp-38h]
The contents of the EMR_POLYBEZIERTO16 record are examined at (1). At (2), it is verified that Count is non‑zero. If so, the address of the memory containing aPoints is obtained at (3). A loop begins at (4) that runs Count times and reads PointS objects at (4) and (5). In this situation, the Count value is excessively large, and continuing the loop leads to an out‑of‑bounds read, which is visible 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.
libpersona!Emf::EmfLoader::LoadDocument+0x48870:
00007ffa`4ef169f0 410fbf442402 movsx eax,word ptr [r12+2] ds:000001d6`d4831002=????
0:032> dd 000001d6`d4831002
000001d6`d4831002 ???????? ???????? ???????? ????????
000001d6`d4831012 ???????? ???????? ???????? ????????
000001d6`d4831022 ???????? ???????? ???????? ????????
000001d6`d4831032 ???????? ???????? ???????? ????????
000001d6`d4831042 ???????? ???????? ???????? ????????
000001d6`d4831052 ???????? ???????? ???????? ????????
000001d6`d4831062 ???????? ???????? ???????? ????????
000001d6`d4831072 ???????? ???????? ???????? ????????
0:032> u
libpersona!Emf::EmfLoader::LoadDocument+0x48870:
00007ffa`4ef169f0 410fbf442402 movsx eax,word ptr [r12+2]
00007ffa`4ef169f6 660f6ef0 movd xmm6,eax
00007ffa`4ef169fa f30fe6f6 cvtdq2pd xmm6,xmm6
00007ffa`4ef169fe 410fbf0424 movsx eax,word ptr [r12]
00007ffa`4ef16a03 660f6ef8 movd xmm7,eax
00007ffa`4ef16a07 f30fe6ff cvtdq2pd xmm7,xmm7
00007ffa`4ef16a0b 4c8bf3 mov r14,rbx
00007ffa`4ef16a0e 483bda cmp rbx,rdx
0:032> kb
# RetAddr : Args to Child : Call Site
00 00007ffa`4ef20eaf : 00000020`aa9ff390 000001d6`d4830174 000001d6`d4830174 00000020`aa9ff1f1 : libpersona!Emf::EmfLoader::LoadDocument+0x48870
01 00007ffa`4ef1fe9c : 00000020`aa9ff390 00000000`00000174 00000000`0000000f 000021d8`00000004 : libpersona!Emf::EmfLoader::LoadDocument+0x52d2f
02 00007ffa`faf0e73f : 00000000`00000174 000001d9`b7ebad20 000001d6`af810000 000001d6`af810000 : libpersona!Emf::EmfLoader::LoadDocument+0x51d1c
03 00007ffa`fc56d432 : 000001d9`7cef8fd0 00000020`00000000 000001d9`7cef8fd0 00000000`00000000 : gdi32full!bInternalPlayEMF+0x250bf
04 00007ffa`4ef215ce : 00000000`00000000 00000020`aa9ff3f0 00000020`aa9ff670 000001d9`ab762f90 : GDI32!EnumEnhMetaFileStub+0x52
05 00007ffa`4eecdb56 : 00000020`aa9ff390 00000020`aa9ff320 00000000`00000000 00007ffa`fd881910 : libpersona!Emf::EmfLoader::LoadDocument+0x5344e
06 00007ffa`4eece041 : 000001d9`ab762f90 000001d9`b7ebad20 000001d9`ab762f90 00000020`aa9ff670 : libpersona!Emf::EmfLoader::LoadDocument+0x86
07 00007ffa`4eece2ab : 00000020`aa9ff708 000001d9`ab762f90 00000020`aa9ff670 00000020`aa9ff720 : libpersona!Emf::EmfLoader::LoadDocument+0x101
08 00007ffa`4eece124 : 000001d9`9c30a740 00000020`aa9ff708 00000020`aa9ff6d8 00000020`aa9ff751 : libpersona!Emf::EmfLoader::LoadDocument+0x12b
09 00007ffa`4ec83a94 : 000001d9`b6028fb0 000001d9`9c30a740 00000020`aa9ff7b0 00000020`aa9ffa78 : libpersona!Emf::EmfLoader::LoadDocument+0x94
0a 00007ffa`4ec5088f : 000001d9`9c30a740 00000000`00000000 00000000`00000000 00000000`ffffff00 : libpersona!DocumentController::TryLoadEMF+0xc4
0b 00007ffa`4ec4eacc : 00000000`00000000 000001d9`00000001 00000000`00000000 00000000`00000000 : libpersona!DocumentController::LoadDocumentI+0xfaf
0c 00007ffa`51283602 : 000001d9`9612f690 00000000`00000000 000001d9`b5720f70 00000000`00000000 : libpersona!DocumentController::LoadDocument+0x8c
0d 00007ffa`52a96cea : 000001d9`9612f6c8 000001d9`acdbef00 00007ffa`af8c2800 00000000`00000000 : libpersona!LoadDocumentCommand::Do+0x252
0e 00007ffa`af2464cf : 00000000`00000000 000001d9`b5720f70 00000000`00000000 000001d9`82e68fe0 : libpersona!PersonaController::StaticDoCommand+0x3a
0f 00007ffa`af49f47f : 000001d9`70b4efd0 00000000`00000481 00000000`00000000 000001d9`a8c3ef90 : libkernel!Kernel::InSerialiserPropertyDataStream::LoadValues+0xb787f
10 00007ffa`fcc17374 : 00007ffa`af8c2800 00000000`00000000 00000000`00000000 00000000`00000000 : libkernel!Kernel::InSerialiserPropertyDataStream::LoadValues+0x31082f
11 00007ffa`fd87cc91 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : KERNEL32!BaseThreadInitThunk+0x14
12 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.