❌

Visualização normal

Antes de ontemZero Day Initiative - Blog
  • ✇Zero Day Initiative - Blog
  • CVE-2024-0244 – A heap buffer overflow in the Canon MF753Cdw printer Connor Ford
    With Pwn2Own Ireland 2026 coming up, I wanted to share an unreleased blog post from my time as a Pwn2Own contestant. This post covers the discovery and exploitation of CVE-2024-0244, which is an unauthenticated heap-based buffer overflow leading to an arbitrary free() in the Canon MF753Cdw printer featured in Pwn2Own Toronto 2023. This blog post gives an overview of the vulnerability and the exploitation techniques used.
     

CVE-2024-0244 – A heap buffer overflow in the Canon MF753Cdw printer

23 de Setembro de 2026, 16:03

With Pwn2Own Ireland 2026 coming up, I wanted to share an unreleased blog post from my time as a Pwn2Own contestant. This post covers the discovery and exploitation of CVE-2024-0244, which is an unauthenticated heap-based buffer overflow leading to an arbitrary free() in the Canon MF753Cdw printer featured in Pwn2Own Toronto 2023. This blog post gives an overview of the vulnerability and the exploitation techniques used.

Figure 1 - MF753Cdw printer

Previously, I had exploited the very similarly named MF743Cdw at Pwn2Own Toronto 2022 using a classic stack buffer overflow, so I had a solid baseline understanding of this family of printers and their quirks.

Starting Point

Over the years at Pwn2Own, the Canon family of printers has been exploited many times, which means that many researchers have combed through the firmware. Lots of the more obvious vulnerabilities have been exploited (especially against the proprietary cadm service), so I decided to start vulnerability research against something a bit more obscure that hadn’t been exploited before.

This led to me exploring Canon’s drivers that interact with lesser-used services. The MF753Cdw support page offered a handful of Windows drivers with one of these being for sending faxes. This seemed obscure enough and I therefore chose it as a research target.

Faxing

After installing the fax driver in a Windows virtual machine, the usual Windows print dialog box contained a new entry for sending faxes. Before sending a fax job to the printer, the fax destination information needs to be filled out.

Figure 2 - Required fax information

I then used Wireshark to capture the traffic once the fax job was submitted. Interestingly, the printer accepted the fax request even though no phone line was connected. Behind the scenes, the driver sends many SOAP messages to the printer to initiate the fax job before sending the actual fax payload. These SOAP messages are all sent to the /wsd/print HTTP endpoint.

Figure 3 - SOAP request to /wsd/print

After the fax job has been initiated, a SOAP message with a binary payload is sent to /wsd/print. This message stands out as it's the only SOAP message in the fax flow to contain binary data. Upon closer inspection, the binary payload contains:

• the information entered into the fax destination dialog
• the file and filename to fax
• the Windows username
• the Windows machine name
• a few hundred bytes of unknown data (not shown in the screenshot below)

Figure 4 - Fax job binary payload snippet

Taking a closer look at the binary payload showed that the byte before most of the strings held the length of the string. Perfect!

Figure 5 - String length and values highlighted

Vulnerability Tinkering around with the length fields didn’t initially highlight any issues until I tried a large length value (0xff) for the length of the destination fax number (shown as primarynumberhere in the above screenshot). This caused the fax task to crash and subsequently reboot the printer. Analysing the printer logs showed a few free() related log messages just before the crash as well as register values.

Whilst looking through the firmware, I found a free() function that includes logging. It prints out the address of the object to be freed via UART and then calls the actual free() function.

Figure 6 - free() with logging

By (ab)using the UART shell, I patched all of the relevant calls to free() with the address of dtdo_free_with_log() so they would all log the address of what was going to be freed. After manually sending a variety of malformed payloads, one log message stood out:

Figure 7 - Controlled free() pointer

The pointer passed to free() was fully controlled via a malformed binary fax payload that contained a large string length and lots of A’s as the destination fax number.

The actual root cause of the overflow was never identified, but it can be assumed there is a fax-related object allocated on the heap similar to this:

When the malformed fax job is parsed, the destination fax number is copied into the phone_number array using the provided length. As there are no length checks, the phone_number array overflows into other members of the object on the heap including a pointer (void *unknown). This unknown pointer is subsequently passed to free(), triggering an arbitrary free.

Exploitation

I explored quite a few exploitation avenues but eventually abandoned each one. One potential method involved freeing system-related objects that were allocated at boot at fairly consistent addresses. Subsequently, the attack would cause specific heap allocations to write controlled data in place of the freed system object. The printer would eventually use the system related object (and therefore the attacker controlled data), leading to code execution through a function pointer hijack or the like. Whilst this method did work, it was too unreliable, especially for the competition.

Other methods such as overwriting adjacent chunk metadata weren’t viable either, as the maximum overflow size was only large enough to overflow fields in the vulnerable object itself and not adjacent chunks.

As the competition deadline loomed, I needed to devise an alternative technique. As is no surprise to those familiar with Canon printer exploitation, the BJNP protocol came to the rescue. BJNP is a Canon proprietary protocol that handles device discovery and print jobs. The protocol has a few desirable properties that can aid exploitation:

  1. Any unauthenticated client can send BJNP requests
  2. Multiple requests can be sent, each of which is stored at a known fixed address
  3. Any bytes in the BJNP payload body are accepted (including null bytes)

The combination of the 3 makes for a great way to store shellcode on the printer at a known address, which can then be jumped to after the program flow is hijacked. This works since all dynamic memory on the Canon is RWX. Any address you jump to will execute as code. This presents an interesting opportunity to exploit the arbitrary free. The exploitation strategy was as follows:

  1. Send an initial BJNP request that contains a fake allocated heap chunk with valid metadata and a known size. This is stored at a known BJNP fixed address
  2. Send a second BJNP request that contains the shellcode to execute. This is stored at a different known BJNP fixed address At this point the printer memory looks like this:
  1. Trigger the fax arbitrary free and use the known address of the fake chunk in BJNP buffer 1 (from step 1) to free. This forces the heap manager to add the fake BJNP buffer 1 chunk to the free list.

BJNP buffer 1 is now part of the heap free list:

  1. Trigger a heap allocation that is of a similar size to the previously freed fake chunk so the heap manager will allocate BJNP buffer 1.

BJNP buffer 1 is used to service a heap memory allocation request:

  1. Close the BJNP session from step 1 and start a new session. Data sent by the client will be copied as usual to the fixed BJNP buffer 1 offset, but since BJNP buffer 1 has been allocated as a legitimate heap object, the BJNP client will directly overwrite that heap object.

BJNP buffer 1 contains a legitimate heap chunk, which can be overwritten by starting a new BJNP session:

  1. The BJNP data we supply in the previous step is chosen to overwrite a function pointer in the legitimate heap object so that it points to the shellcode in BJNP buffer 2 (from step 2).

Fortunately, as part of the fax handling process and after the fake BJNP buffer 1 chunk has been added to the free list, a memory allocation request is consistently made that will automatically be placed at the fake BJNP buffer 1 chunk address. This simplifies step 4 as no forced allocation is required. The automatically allocated chunk contains a function pointer that can be overwritten with the address of BJNP buffer 2 shellcode for code execution!

I prepared a few different shellcode payloads. The most interesting one connects back to the attacking machine, retrieves an image, and writes it directly to the printer's display framebuffer. I couldn’t resist showing DOOM on the display:

Figure 8 - Shellcode execution - Doomguy Approved

Conclusion

A lot of work went into finding and exploiting this vulnerability, which couldn’t be reasonably covered in a single blog post. Hopefully, this post gives enough of an overview to understand the vulnerability and the techniques used to exploit it. I hope it will inspire some research for Pwn2Own Ireland 2026, which includes the Canon imageFORCE 1643F Multifunction Copier as a target.

The state of Canon printer security has changed over the years, with the introduction a few security mitigations. Techniques covered in this post may not be directly applicable to newer devices.

You can find me on Twitter at @ByteInsight, and follow the team on Twitter, Mastodon, LinkedIn, or Bluesky for the latest in exploit techniques and security patches.

  • ✇Zero Day Initiative - Blog
  • Breaking Down the Attack Surface of the Kenwood DNR1007XR – Part Two Connor Ford
    In our previous Kenwood DNR1007XR blog, we detailed the internals of the Kenwood in-vehicle infotainment (IVI) head unit and provided annotated pictures of the main PCB. In this post, we aim to outline the attack surface of the DNR1007XR in the hopes of providing inspiration for vulnerability research.We will cover the main supported technologies that present potential attack surfaces, such as USB, Bluetooth, Android Auto, Apple CarPlay, Kenwood apps, and more.All information has been obtained t
     

Breaking Down the Attack Surface of the Kenwood DNR1007XR – Part Two

9 de Janeiro de 2026, 12:00

In our previous Kenwood DNR1007XR blog, we detailed the internals of the Kenwood in-vehicle infotainment (IVI) head unit and provided annotated pictures of the main PCB. In this post, we aim to outline the attack surface of the DNR1007XR in the hopes of providing inspiration for vulnerability research.

We will cover the main supported technologies that present potential attack surfaces, such as USB, Bluetooth, Android Auto, Apple CarPlay, Kenwood apps, and more.

All information has been obtained through reverse engineering, experimenting, and combing through the following resources:

·      DNR1007XR product page
·      DNR1007XR instruction manual
·      DNR1007XR quick start guide
·      Kenwood Portal app
·      Kenwood Remote S app

USB

The DNR1007XR is equipped with a single USB-A port that operates at USB 2.0 speeds, providing the necessary interface for wired Android Auto and Apple CarPlay.

The USB port also supports playback of audio files from a USB flash drive. The supported audio filetypes and their associated extensions are:

·      MP3 (.mp3)
·      WMA (.wma)
·      AAC-LC (.m4a)
·      WAV (.wav)
·      FLAC (.flac, .fla)
·      Vorbis (.ogg)
·      DSD (.dsf, .dff)

As well as audio, a USB flash drive can also be used to play back video files. The supported video filetypes and their associated extensions are:

·      MPEG-1 (.mpg, .mpeg)
·      MPEG-2 (.mpg, .mpeg)
·      H.264 / MPEG-4 (.mp4, .m4v, .avi, .flv, .f4v)
·      WMV (.wmv)
·      MKV (.mkv)

Robustly parsing and decoding these file formats is notoriously complicated and error-prone, which makes for a potentially rewarding attack surface.

USB flash drives must be formatted as either FAT16, FAT32, exFAT, or NTFS for the head unit to be able to read them.

SD Card

A full-sized SD card slot is tucked away behind the screen and is used for audio/video playback as well as updating map data. As previously mentioned, a large attack surface is exposed when parsing audio and video files. Map updates are likely a good research target, too.

SD cards must be formatted as either FAT16, FAT32, exFAT, or NTFS for the head unit to be able to read them.

Bluetooth

Bluetooth version 5 is supported by the head unit and is used for making and receiving phone calls, as well as playing audio from a paired mobile phone. The following Bluetooth profiles are officially documented in the user manual:

·      Hands Free Profile v1.7
·      Serial Port Profile
·      Phonebook Access Profile
·      Audio/Video Remote Control Profile (AVRCP) v1.6
·      Advanced Audio Distribution Profile (A2DP)
o   Supporting codecs: SBC, AAC, or LDAC

Android Auto, Apple CarPlay, and the Kenwood apps also utilise Bluetooth in varying capacities.

Interrogating the unit shows a few more Bluetooth services that are not documented; these could be a great area to research. Judging by the service names, they may all be related to Kenwood apps.

Service Name: App0
Service RecHandle: 0x10003
Service Class ID List:
  UUID 128: 00001101-0000-1000-8000-00805f9b34fb
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 2

Service Name: App1
Service RecHandle: 0x10004
Service Class ID List:
  UUID 128: 00000000-deca-fade-deca-deafdecacaff
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 3

Service Name: App2
Service RecHandle: 0x10005
Service Class ID List:
  UUID 128: 4de17a00-52cb-11e6-bdf4-0800200c9a66
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 4

Service Name: App3
Service RecHandle: 0x10006
Service Class ID List:
  UUID 128: 4de17a00-52cb-11e6-bdf4-0800200c9a66
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 5

Service Name: App4
Service RecHandle: 0x10007
Service Class ID List:
  UUID 128: 4de17a00-52cb-11e6-bdf4-0800200c9a66
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 6

Service Name: App5
Service RecHandle: 0x10008
Service Class ID List:
  UUID 128: 4de17a00-52cb-11e6-bdf4-0800200c9a66
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 7

Wi-Fi

The head unit provides a WiFi access point that is primarily used for wireless Android Auto and Apple CarPlay. There is no intention for the end user to directly connect to this network and there is no officially documented way of acquiring the password. However, internal research has discovered multiple methods to obtain the password.

Once connected to the access point, the following ports are open:

·      TCP: 7000, 8086, 8888, 5355, 22
·      UDP: 67, 5353, 5355, 34613, 50842

TCP 22 is an SSH server and can be logged into. As per the competition rules, "If the entry leverages hardcoded credentials and/or exposed encryption keys, the entry must leverage an additional vulnerability to gain code execution to be in scope."

TCP 7000, 8086, and 8888 are all running non-standard services and are likely great places to research further.

Android Auto and Apple CarPlay

Both wired and wireless Android Auto and Apple CarPlay are supported without the need for a 3rd party app to be installed on the paired mobile phone. When using the wireless versions, the paired phone connects to the aforementioned secured WiFi network to establish a high-bandwidth channel for data to be sent and received.

When connecting using a USB cable, the WiFi network isn't used by Android Auto or Apple CarPlay, but it is still active.

Kenwood

Kenwood offers 2 Android/iOS apps to interface with the DNR1007XR. The first app is the Kenwood Portal App, which allows users to transfer photos from a mobile phone to the head unit over Bluetooth. The transferred photos can then be viewed as a slideshow on the head unit or be used as the wallpaper.

This presents an interesting attack surface, especially if the DNR1007XR itself performs any complex image handling tasks on the received images, such as resizing or converting between different image formats. The user-supplied images also need to be persisted to the head unit's filesystem, further expanding the attack surface.

The second app is the Kenwood Remote S app, which connects to the head unit over Bluetooth and allows for multimedia control such as selecting a radio station, skipping a track, and more. The Bluetooth Audio/Video Remote Control Profile (AVRCP) is designed for this exact task; however, no research was performed to confirm if the Remote S app takes advantage of AVRCP.

There are a few other Kenwood apps available, but they are not listed as supported on the DNR1007XR product page and therefore have not been explored.

Open Source Software

A list of open source licences can be viewed from the head unit by navigating to Settings -> System -> Open Source Licenses. There's no guarantee these open source projects are actually used by the unit.

Summary

We hope that this blog post has provided enough information about the DNR1007XR threat landscape to guide vulnerability research. Not every attack surface has been mentioned, and we encourage researchers to investigate further.

We are looking forward to Automotive Pwn2Own again in Tokyo in January 2026 at Automotive World, and we will see if IVI vendors have improved their product security. Don’t wait until the last minute to ask questions and register! We hope to see you there.

You can find me on Twitter @ByteInsight, and follow the team on Twitter, Mastodon, LinkedIn, or Bluesky for the latest in exploit techniques and security patches.

  • ✇Zero Day Initiative - Blog
  • Breaking Down the Attack Surface of the Kenwood DNR1007XR – Part One Connor Ford
    For the upcoming Pwn2Own Automotive contest, a total of 3 head units have been selected. One of these is the double DIN Kenwood DNR1007XR that offers a variety of functionality such as Android Auto, Apple CarPlay, USB media playback, wireless mirroring and more. This blog post presents photos of the DNR1007XR including highlighting interesting internal components. A hidden debugging interface is also detailed which can be leveraged to obtain a shell.
     

Breaking Down the Attack Surface of the Kenwood DNR1007XR – Part One

7 de Janeiro de 2026, 16:09

For the upcoming Pwn2Own Automotive contest, a total of 3 head units have been selected. One of these is the double DIN Kenwood DNR1007XR that offers a variety of functionality such as Android Auto, Apple CarPlay, USB media playback, wireless mirroring and more.

This blog post presents photos of the DNR1007XR including highlighting interesting internal components. A hidden debugging interface is also detailed which can be leveraged to obtain a shell.

Figure 1: Kenwood DNR1007XR

External

Tucked away behind the screen is a full-sized SD card slot that can be accessed by tilting the screen downwards. The SD card is used to play audio/video files as well as updating map data. This seems like an attack surface worth researching.

Figure 2: SD card slot

There's also a single USB port routed from the back of the unit that is used for:

·      Wired Android Auto
·      Wired Apple CarPlay
·      Audio playback
·      Video playback

Internal

Moving on to the internals, the DNR1007XR comprises multiple interconnected boards, with the most interesting board being located at the top of the unit. Removing a few screws and metal plates gives access to this board, which contains the main processor, eMMC, flash, and a Bluetooth / WiFi radio module.

Figure 3: Main board

Towards the center is the main Dolphin+ TCC8034 System on a Chip (SoC), which is marketed as an “IVI and Cluster solution” that supports running Android, Linux, and QNX. The SoC contains two 32-bit ARM cores and is running Linux. Last year's Kenwood target utilized a similar TCC8974 SoC; more information can be found here.

Figure 4: Dolphin+ TCC8034 SoC

Further to the right is a Kioxia THGBMJG7C2LBAU8 16GB eMMC chip which contains the main device firmware.

Figure 5: Kioxia eMMC

Below the eMMC chip and to the left is a Winbond 25Q256JVFM 256Mb serial flash chip that contains unknown data.

Figure 6: Winbond flash

Finally, to the left of the SoC is a Murata radio that handles Wi-Fi and Bluetooth operations. Searching around for the exact model number that's etched onto the radio's shielding doesn't return much information but the FCC documents for the DNR1007XR state that this is the Murata LBEE6ZZ1WD-334. This module has no public datasheet available and isn't listed on Murata's site.

Figure 7: Murata radio

Debug Connector

On the right edge of the main board is a suspicious-looking connector that lines up with a thin gap in the outer housing. This connector exposes a Linux login prompt over UART at 115200bps. Logging in with the correct credentials will spawn a shell.

Figure 8: Debug connector

Summary

Hopefully, this blog post provides enough information to kickstart vulnerability research against the DNR1007XR. Keep an eye out for another blog coming this Friday that covers the threat landscape of the DNR1007XR.

We are looking forward to Automotive Pwn2Own again in January 2026, and we will see if IVI vendors have improved their product security. We hope to see you there.

Until then, you can find me on Twitter @ByteInsight, and follow the team on Twitter, Mastodon, LinkedIn, or Bluesky for the latest in exploit techniques and security patches.

❌
❌