This research set out to test one thing on purpose: whether a device physically on the S2's CAN bus can tamper with what its telematics unit (TCU) reports to the cloud. Everything here targets that path — the TCU, the bus it listens to, and the app it feeds. The bus uses AUTOSAR E2E, a functional-safety integrity check that catches dropped and corrupted frames; it works as designed, and was never meant to be authentication (standard practice). The question is simply what that means for the values the TCU forwards.
The TCU (Telematics Control Unit) is the bridge between the vehicle and the internet. It sits on the secondary CAN bus, listens to the vehicle's broadcast state, and — over cellular, with its own GPS and modem — relays that state to LiveWire's cloud, which is what the S2 app shows you: charge, estimated range, odometer, parked location, service status. It updates its own firmware over the air, too. The panel below is what we read directly from it over UDS diagnostics.
36 of the S2's messages carry AUTOSAR E2E Profile 1: a 6-bit alive counter (byte D7) and a CRC-8/SAE-J1850 (byte D8, over D1–D7). This is a safety mechanism — it lets a receiver notice a dropped, stale, or bit-flipped frame. It does that job well, and it's the correct tool for it.
What it doesn't do — and was never meant to — is prove who sent a frame. The CRC uses no secret; the algorithm is public, so any node on the bus can compute a valid one, and a receiver can't tell a genuine sender from an on-bus impostor. That's a normal property of unauthenticated CAN, not a defect unique to this vehicle. It only matters here because the telemetry path carries those values to the cloud without an authentication layer above the checksum.
Forging one frame is trivial: clone the real one, change the field, continue the counter, recompute the CRC.
You can't take the genuine sender off the air — it keeps broadcasting the same ID with the true value. But you don't have to out-shout it forever. Send a short burst, just fast enough to push the receiver's expected counter a few steps past the genuine sender's, and you've won: from then on the real frames arrive with a counter that's behind what the receiver expects, so they're rejected as stale — and the genuine sender, incrementing only +1 per frame, can't overtake a lead. You drop back to its own rate and simply hold. It's a race you win once, then coast. And when you stop, it doesn't snap back on the next frame either: the genuine sender has to count all the way up to the value you fast-forwarded to before its chain is contiguous again, so the further you jumped, the longer it stays locked out after you've gone quiet.
Every forged 0x562 frame was CRC-valid (999 / 999). And once our counter chain led the genuine sender's, a strict receiver rejected the genuine frames as out-of-order — 590 of 600 in a sustained run. The counter arithmetic is the point: the lead only has to be established, not held by force.
With that race won on a stationary bike, a forged odometer changed what the app reported. The instrument cluster, which keeps its own copy, did not move — a clean confirmation of the split: the cloud takes its picture from the bus, the dash takes its from itself.
The app's “Last synced 3 seconds ago” shows the value is live, not cached. The cloud also accepted an odometer decrease of ~2,951 miles — no monotonic or plausibility check on the uploaded value. The effect is transient: it reverts once injection stops and the genuine chain catches back up.
| Telemetry | Frame | Cloud check | What we observed |
|---|---|---|---|
| Odometer | 0x562 · E2E | none | Changed in the app; dash unaffected |
| State of charge | 0x185 · E2E | none | Changed in the app and on the dash (the cluster consumes it) |
| Estimated range | unresolved | — | Couldn't move it — see below |
The TCU updates itself over the air, and every update is a version decision: somewhere, something compares the software the bike is running against the latest and decides whether to flash. So the obvious question — if a device on the bus could make the vehicle report an older version than it's actually running, could it induce the cloud, or the TCU itself, to push (or at least attempt) an update? That would be the one path leading from the bus into the firmware.
Whether it's even reachable comes down to where that version check reads from. If it compares the TCU's own internal version, the bus can't touch it and the idea goes nowhere. If it reads a version the TCU relays from the bus, it's spoofable like the odometer. If it gathers other modules' versions over UDS, you'd have to win a response race. We don't yet know which — and the honest way to find out is read-only: watch what the TCU actually reads during an update check, before spoofing anything.
Every result in this study is reversible — stop, and it self-heals. An OTA is not: it's a real firmware write. And the S2's FOTA is documented-fragile — LiveWire runs a service program to replace TCUs that fail to complete updates. Inducing an update attempt on that path is a credible way to brick the module. We characterized right up to that edge and deliberately stopped.
I'll characterize the OTA path too — responsibly, coordinated, on my own bike — if bricked modules are covered. Consider it a free security audit in exchange for a little hardware safe-harbor: my motorcycle shouldn't have to be the sacrifice to answer whether your update trigger trusts the bus. Happy to talk.
One observation from the diagnostic side: the TCU applies UDS SecurityAccess (service 0x27) selectively. The sensitive identity records (the SIM / IMEI / auth trio) are locked behind a 128-bit random seed we watched it issue — genuinely strong. Yet in the same module, live GPS, the eSIM's ICCID, and the serving carrier read out in cleartext, with no SecurityAccess at all, through the diagnostic gateway.
This isn't a dramatic attack, and we won't dress it up as one — anyone with physical access could just as easily plant their own tracker. The point is narrower and more basic: a diagnostic gateway is handing out your live location, your SIM's serial (ICCID), and your carrier to any device on the bus with no authentication — more than it has reason to expose freely. And it's inconsistent: the same module carefully locks its IMSI / IMEI / auth records behind SecurityAccess, then leaves location and SIM identity wide open. Sensitive data shouldn't be a free read just because the crypto-secret sitting next to it isn't.
We also went after the scarier possibility — a denial-of-service. Could a device on the bus silence the telematics unit by rebooting it, or reset a propulsion or brake module mid-ride? We probed the ECUReset surface directly. On the TCU it is SecurityAccess-locked (hard reset returns securityAccessDenied; the softer variants aren't implemented). On the VSC, ABS, and battery modules every reset probe came back negative — locked, not offered, or not relayed by the gateway. So no unauthenticated reboot-DoS is reachable from the bus, and the alarming mid-ride case in particular isn't there. We state it plainly because it's the version worth ruling out — and it's ruled out.
An authenticated messaging layer on telemetry-relevant frames (e.g. AUTOSAR SecOC, a keyed MAC alongside the existing E2E), server-side plausibility checks on uploaded values, and SecurityAccess on the telematics reads that are currently open. E2E stays exactly where it is, doing its safety job; the addition is a signature the checksum was never meant to provide.