Skip to content
View Lucid-Duck's full-sized avatar

Block or report Lucid-Duck

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
Lucid-Duck/README.md

Lucid Duck

Linux internals · reverse engineering · vulnerability research

CVE-2026-20161 14 patches in Linux mainline morrownr/mt76 collaborator Available for contracts CompTIA Security+

Full-time on Linux internals, reverse engineering, and vulnerability research since January 2026. Between April and July I landed twelve patches in the mainline Linux kernel and co-developed two more, six of them backported to the stable trees, across the Realtek rtw89 and MediaTek mt76 Wi-Fi drivers. Also since January: a published CVE (CVE-2026-20161), a paid embedded-firmware reverse-engineering contract, and a clean-room Wi-Fi driver I am building from the firmware disassembly.

Available for remote contracts. Linux driver development, reverse engineering, vulnerability research. 📍 Vancouver Island, BC, Canada  ·  ✉️ devinwittmayer@gmail.com  ·  🌐 justthetip.ca  ·  ☕ Ko-fi


🐧 Linux kernel and driver work

Upstream contributions

Merged to mainline. Patches I authored or co-developed; six carry Cc: stable, so they flow back into the long-term kernels.

Most of these share a root cause. USB and SDIO adapters, and monitor mode, run through code written and tested against PCIe cards doing ordinary client traffic, so assumptions that only ever held there sat unexercised for years. The oldest bug in the table was introduced in 2017.

Patch Commit Role Description
rtw89: fix USB TX flow control by tracking in-flight URBs 80119a77e5b0 Author Driver answered a hardcoded 42 when asked how much transmit capacity was left, so nothing ever throttled
mt76 / mt7925: ensure tx headroom in usb_sdio_tx_prepare_skb ef3e34874d23 Author Bridging wired traffic into a Wi-Fi access point panicked the kernel
mt76 / mt7921, mt7925, mt7615: drop TXRX_NOTIFY on non-MMIO buses da4082e91aca, feeff151c83e, 39afc46c0243 Author A PCIe-only event crashed USB and SDIO adapters through a NULL pointer
mt76: restrict NPU/PPE active checks to MMIO devices 7981aca2bd28 Author USB adapters misread a PCIe field, skipped frame reordering, and shed throughput as access points
mt76 / mt7925: cancel mlo_pm_work on stop 81faf578320d Author A power-save timer kept firing after the device it belonged to was gone
mt76 / mt76x02: report rx FCS errors to mac80211 ddae0bcb01e7 Author Captures could not tell a corrupted frame from a clean one
mt76 / mt76x02: do not WARN on invalid rx descriptor length 81497634d9f8 Author Any garbage frame off the air tainted the kernel, and killed it outright on some configs
mt76 / mt792x: do not advertise active monitor 6f6c9800e54c Author Driver offered a capture mode the firmware ignores, and turning it on stopped reception
mt76 / mt7921: assert sniffer on chanctx change a7d35545c2ce Author Packet capture went dead after a channel change, with no error to explain why
mt76 / connac: cache txpower_cur via a helper 8286bbf62dcc Co-developed Groundwork for a fix I reported: adapters reported transmit power for the wrong channel
mt76 / connac: factor out rate power limit calculation 317bc1a0590e Co-developed Same series: one shared helper for regulatory, SAR and per-rate power limits
mt76 / mt7925: add Netgear A8500 USB device ID 291b067a02b9 Author An adapter its own driver already supported but did not recognize

Ten more in review on linux-wireless, two of them in mac80211 core rather than a driver: refusing to make a monitor interface active when it has no queue, and dropping the monitor filter counts on stop rather than only sometimes. The other eight are mt76: a USB/SDIO TX-completion RCU fix, drv_pmctrl return checks on the mt7921 and mt7925 PCIe reset paths, dev->mutex / iflist_mtx lock-inversion fixes for the same two, ACPI SAR table length validation and a NULL dereference in ACPI SAR init on mt792x, and an mt7615 fix to stop tearing down BSS/STA state for monitor vifs. Also co-developed on a MediaTek fix for an mt792x SDIO TX use-after-free.

Write and triage collaborator on morrownr/mt76: review, tester coordination, and liaison between the repo, linux-wireless, and MediaTek. The end-user install and uninstall scripts let anyone run the patched drivers without opening a kernel tree.

AIC8800 open-firmware Wi-Fi driver (clean-room, in progress)

The AICSemi AIC8800 USB Wi-Fi family has no mainline Linux support: the vendor ships a closed firmware blob and an out-of-tree module that breaks on current kernels. I'm building an open mac80211 SoftMAC for it the way carl9170 and b43-openfwwf were built, my own firmware on the chip and mac80211 on the host, with no vendor blob and no hybrid. Those two are the only fully open Wi-Fi firmwares in mainline, both took years, and both had vendor documentation. This one does not.

Where it stands: I've reverse-engineered the chip's boot and init, the USB datapath, the TX and RX DMA rings, the firmware load mechanism, and the RF calibration (LOFT/IQ) path, all from the disassembly with no source and no datasheet. The calibration code is written and executes cleanly on the chip, but this is pre-first-light: no RF emitted yet, not a frame and not a carrier. Fourteen on-silicon fires, each byte-identical to the vendor's own emitting register state, all came back dark, which is what proved emission here is a live process and not a register state. The remaining work is a persistently running TX pipeline and the calibration that depends on it.

Bench: a self-built Wi-Fi 7 access point on a BPi-R4 Pro, with x86 and aarch64 clients.

rtw89 USB 2 to USB 3 mode gap

Proved that mainline silently caps several Realtek Wi-Fi 6/6E/7 USB adapters at USB 2 speeds (258 vs 802 Mbps on identical hardware), across four adapters, three chipsets, and two host architectures. Evidence and crash reports: rtw89-usb3-gap.


🔬 Embedded firmware reverse engineering (contract, 2026)

Automotive keyless-entry firmware RE for a hardware-security vendor: a dozen firmware images delivered and in flight, each a byte-exact C reimplementation of the firmware's cryptography and key-derivation, validated against captured radio traffic or instruction-accurate emulation.

  • Seven MCU families: STM8, ARM Cortex-M0, PIC, HCS12 / HCS12X, V850, R32C, 8051.
  • The hard part was getting from a stripped flash dump to a function map. Where stock tooling fell down on paged flash and uncommon cores, I wrote a function walker, disassembler, and instruction-accurate emulator from scratch.
  • Ciphers: KeeLoq variants, XTEA, AES-128, custom block and S-box ciphers, a DST80-family stream cipher, several PRNG designs.

🛡️ Vulnerability research

All findings disclosed through coordinated disclosure; most have shipped fixes. Vendor names are withheld where embargoes or NDAs apply.

  • Local root on a Linux network-monitoring agent: CVE-2026-20161 (Cisco ThousandEyes), my first CVE. Symlink-following plus a Linux loader feature lets any local user gain persistent system-wide root.
  • Three privilege escalations in an enterprise VPN client: a Windows race to SYSTEM, a Linux command injection running as root from an unauthenticated local socket, and a Linux file-write primitive that becomes system-wide RCE. The same product also leaked credentials via a world-readable shared-memory region.
  • Remote code execution in a Windows endpoint-protection product: one crafted UDP packet corrupts memory in the network-filter service. Vendor-confirmed, fix shipped.
  • Cross-customer impersonation on a virtual-gateway product: a certificate-authority private key hardcoded into firmware and identical across every deployment worldwide, plus an RSA-512 license-signing key forgery (512-bit modulus factored, private key recovered), validated on a live appliance.
  • Network-appliance SSRF to cloud IAM credential theft via a DNS-rebinding filter bypass that reaches the instance metadata service.
  • Audit-log poisoning on an enterprise Linux EDR: a binary IPC protocol reverse-engineered into a quarantine bypass and a primitive that injects fabricated entries into the cloud admin console's audit log.

Reported through authorized programs on Bugcrowd and HackerOne, with further findings across identity, telecom, fintech, and IoT.


More at github.com/Lucid-Duck and justthetip.ca, built and documented as I go.

Pinned Loading

  1. Lucid-Duck Lucid-Duck Public

    Profile README

  2. mt7921-txpower-fix mt7921-txpower-fix Public

    Linux kernel patch -- MT7921U TX power reporting fix for mt76 driver.

    5

  3. rtw89-usb3-gap rtw89-usb3-gap Public

    Mainline rtw89 USB 2 to USB 3 switch-mode gap: empirical proof across multiple adapters, hosts, and kernels

    1

  4. morrownr/mt76 morrownr/mt76 Public

    Provides modern, mac80211, out-of-tree (out-of-kernel) Linux driver support for the following Mediatek wireless chips: MT7610, MT7630, MT7650, MT7612, MT7662, MT7615, MT7663, MT7902, MT7920, MT7921…

    C 45 9

  5. tx-resources-flow-control tx-resources-flow-control Public

    Linux kernel patch -- USB TX resources flow control for wireless drivers. Merged mainline as 80119a77e5b0 (2026-04-02).

    Shell 3