Teardown: The BMW / Harman IDC23H Infotainment Unit (B423)

Teardown: The BMW / Harman IDC23H Infotainment Unit (B423)

Another day, another teardown - and the first blog post of 2026! Today we’ll be looking at the BMW IDC23H infotainment unit, manufactured by Harman Becker.

The IDC23H is one of the newest infotainment units from BMW, as of January 2026. The design is based on the previous-generation MGU22/MGU22H, and is used in a wide variety of BMW models - this unit in particular was found in one of BMW’s newest X1 U11 SUVs.

Read More
Edge Connector Breakout Boards

Edge Connector Breakout Boards

The goal was simple: For the past year or so, I’ve been poking at my car’s head unit in my free time. This has now escalated to the point where I have two or three of the head units…

They use a 1mm-pitch edge connector for debugging and development access, and I didn’t want to solder wires directly to the pins in an irreversible way. As such, I created a breakout board!

Read More
Bulk Shared Library Collecting for Ghidra

Bulk Shared Library Collecting for Ghidra

The device I’m currently working with has over five hundred shared libraries, all spread out across random folders within the filesystem. Bleh!

This is a common issue I’ve run into when working with embedded systems. You want to import an arbitrary binary into Ghidra, but first you have to spend 10 minutes tracking down where all of it’s shared libraries are located! A major pain.

But have no fear, a one-liner is here! (every Linux graybeard’s favorite saying)

Read More
Firmware Border Binaries and Multi-Binary Taint Analysis
Firmware Tim Firmware Tim

Firmware Border Binaries and Multi-Binary Taint Analysis

In general, most software security operates on the basis of sources and sinks - vulnerable data, input, influence, etc. comes from a known source, and eventually reaches a vulnerable sink. When thinking of a single binary, this concept can be fairly straightforward:

If a binary takes input via argv that eventually ends up in a system() call and leads to command execution, argv() is the source, and system() is the sink.

But what about when thinking of an entire embedded system, rather than just a single binary?

This is where the concept of border binaries come into play!

Read More