Skip to content
Published on

The Exact Scope of the Phrase x86 Hardware Backdoor — Reading rosenbridge as Its Author Wrote It

Share
Authors

Introduction — the distance between the title and the body

There is a GitHub repository called xoreaxeaxeax/rosenbridge. Its description is one line: "Hardware backdoors in x86 CPUs." It has more than 2,500 stars and periodically climbs back to the top of the community feed.

Concluding from that title alone that "my CPU has a backdoor" is natural. Yet read the README of that same repository to the end and the situation looks considerably different.

This post starts by reading that document from beginning to end and carrying over exactly the boundary the author drew for himself. After that, it turns to what actually generalizes out of this research.

Let me state the dates first. This repository was created on 9 August 2018 according to the GitHub API, and the last commit is 12 October 2018. This is not a new 2026 announcement; it is 2018 research. It appears the whole profile drew attention again when the same author put up other repositories in August 2026.

What rosenbridge actually is

The structure the README describes is this.

Alongside the main x86 core there is one more small non-x86 core. This core is enabled by a control bit in a model specific register, and after that you switch into it with an instruction called the "launch-instruction." Once switched, it takes and executes commands wrapped inside specially formatted x86 instructions, and the author calls this command set DEIS (deeply embedded instruction set).

The instructions this core executes bypass all memory protection and privilege checks. So ring 3, that is an ordinary user program, can freely read and write ring 0 kernel data.

Normally, enabling this feature requires kernel privileges. But the README writes that on some systems it was observed to be enabled by default. In that case unprivileged code can modify the kernel directly.

That much is the confirmed mechanism. The repository also carries tools that support it: an assembler for DEIS, a privilege escalation proof of concept, a boot script that closes the backdoor through an MSR, and the fuzzers used in the research.

The four boundaries the author drew himself

The README has several sentences that narrow the scope of this finding. They are worth quoting.

First, the scope of impact. "It is believed that only VIA C3 CPUs are affected by this issue." VIA's C series was sold for industrial automation, POS, ATMs, medical hardware, and some consumer desktops and laptops.

Second, generations. "The scope of this vulnerability is limited. CPUs of generations after the C3 no longer have this feature."

Third, intent. The disclaimer says this. VIA processors are known for their excellence in low-power and embedded designs, and the feature described here is regarded as having been built in good faith as a useful feature for the embedded market and left unintentionally enabled in some early generations. And it states explicitly that "no malice is implied."

Fourth, the limits of the tooling. The checking tool is in alpha, must be run only on bare metal, and warns that it "may crash, kernel panic, or hang a system that does not have the backdoor." And decisively, it writes that because these tools were designed on the assumption of a specific processor family and core, any backdoor even slightly varied from the form studied will be missed.

The author himself defines the character of this work like this: it is published as a case study and a thought experiment showing how backdoors can arise in increasingly complex processors, and how researchers and end users might identify such features.

Dropping these four things and circulating only the title is the most common way this research is made inaccurate.

Why it has to be discussed separately from ME and PSP

There is an interesting comparison in the README. rosenbridge is entirely separate from publicly known x86 coprocessors such as the Intel Management Engine or the AMD Platform Security Processor, and is more deeply embedded than any known coprocessor. That is because it can access not only all of the CPU memory but the register file and the execution pipeline as well.

This distinction matters because the threat model is different.

ME and PSP are separate processors. They run their own firmware and access system memory, but they are not inside the main core's execution pipeline. The responses match that. Firmware version management, blocking network access, and attempts at disabling it in some environments are what get discussed.

What rosenbridge describes is different. It is switched into from within the running instruction stream and skips privilege checks in the same pipeline. From a software point of view it is closer to a single instruction suddenly meaning something else.

Lump the two together as "a hidden core inside the CPU" and the responses get lumped together too. In reality they are problems at completely different layers, and a response to one does not work at all on the other.

How it was found — the problem of exploring an instruction set with no documentation

Now for the part of this research that actually generalizes. How it was found.

Exploring the x86 instruction set from the outside is harder than it sounds. There are a few reasons.

Instructions are variable length. Some are one byte, some are fifteen. So there is no correct answer to the request "enumerate every instruction." The byte combination space is astronomical, so you cannot brute-force your way through it either.

An undocumented instruction by definition has no table to consult. Disassemblers are built on the manual, so about things not in the manual the disassembler knows nothing either.

And executing the wrong bytes kills the program or hangs the system.

That is the problem the author's tool sandsifter solves. In the README wording, it "audits x86 processors for hidden instructions and hardware bugs, by systematically generating machine code to search through a processor's instruction set, and monitoring execution for anomalies."

The core is finding disagreement. It compares how the processor actually interprets something against how a reference disassembler interprets it, and collects the places where the two answers diverge. Rather than a human reading the manual and guessing, it is an automatic collection of the differences of opinion between two machines.

What a sandsifter scan actually turns up

The description of this tool's results is realistic enough to be worth quoting.

The basic audit is run like this.

sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t

According to the README, a scan takes hours to days depending on the speed and complexity of the processor. When it finishes you run the summarizing tool.

./summarize.py data/log

And here is the important part. The README writes: "typically millions of undocumented instructions will be found on your processor, but these generally group into a small number of groups."

Which means there is no need to be alarmed by the number in the millions. The summarizing tool groups the anomalies and then attempts to classify them into three categories.

  • Software bugs — bugs in a hypervisor or a disassembler
  • Hardware bugs — bugs in the CPU itself
  • Undocumented instructions — instructions that exist in the processor but are not acknowledged by the manufacturer

The README also states explicitly that automatic classification is sometimes difficult and manual analysis may be required.

The list of achievements gets carried over as well. The tool is said to have found "secret processor instructions from every major vendor, software bugs pervasive across disassemblers, assemblers, and emulators, flaws in enterprise hypervisors, and both benign and security-critical hardware bugs in x86 chips."

The method generalizes; the finding does not

Put those two together and how this research should be handled becomes clear.

The finding is narrow. VIA C3, 2018, absent from later generations, presumed no malice. The likelihood that your laptop or server CPU has this today is effectively nil. It is a different story if you are still operating industrial equipment containing a VIA C3, but in that case it is probably already due for replacement for other reasons anyway.

The method is wide. The approach of "when facing an interface with no documentation, put two independent interpreters side by side and automatically collect the places where they disagree" is not used only on processors.

The same structure applies in places like these.

  • Finding the places where two parsers interpret the same input differently (this is the origin of request smuggling and deserialization vulnerabilities)
  • Finding the places where a client and a server interpret the same protocol message differently
  • Finding the places where a compiler and an interpreter handle the same source differently
  • Differential fuzzing in general: running two different implementations on the same input and comparing the results

A recent example is the pgrust project, which reimplements PostgreSQL in Rust. By running the original and the reimplementation on the same input and finding where the behavior diverges, it reportedly even found bugs on the original PostgreSQL side, according to the repository documentation. Having a reference implementation means having a free oracle, and that is the most valuable asset there is in fuzzing.

What a practitioner takes away from this

Let me sum up.

First, the repository description and the body of the README can differ in scope. In security research, the title states the category of the finding and the body states the scope of the finding. When you quote, you should quote the body.

Second, do not delete the qualifications the researcher attached. The rosenbridge disclaimer is the author writing, in his own words, that "no malice is implied." Quoting it with that sentence removed means making a claim on the researcher's behalf that he did not make.

Third, read the detection limits of the tool alongside it. The rosenbridge checking tool states explicitly that it "will miss anything even slightly varied from the form studied." That is not a problem unique to this tool but a property of signature-based detection in general. The scanner you use has the same limitation, and it usually does not say so.

Fourth, check the effective scope of a mitigation. The README offers a script that manipulates an MSR at boot to close the backdoor, while noting that "even with this applied, an attacker with kernel privileges can turn it back on." Most mitigations are of this form. They are effective only under a specific attacker capability, and above that capability they are void. If you do not know which threat model a mitigation is effective in, you cannot know whether it is effective for you.

Hardware trust is a real problem, and research like this makes that problem discussable. Which is all the more reason it is worth quoting accurately.

References

I did not run the rosenbridge checking tool or a sandsifter scan myself. Both tools require bare-metal execution and warn that they can hang a system. The behavioral descriptions in this post are entirely what is written in the repository documentation.