Telematics-tampering study · 2024 LiveWire S2 Del Mar · software MY26_S2DM_10.2

Tampering with the telematics unit.

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.

36
E2E-protected IDs
999 / 999
forged frames CRC-valid
brief
burst to win, then hold
local
bus access only
Telemetry integrity
demonstrated — forged to cloud
Telematics reads
GPS / ICCID / carrier, cleartext
OTA / FOTA
real (public service programs)
SecurityAccess 0x27
mapped — applied unevenly
01 — The component

What the telematics unit is

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.

LiveWire S2 app home screen — 100% charge, 113 mi range, 2952 mi odometer
the LiveWire S2 app — the TCU's output, genuine
Bus role
Secondary-CAN node — consumes broadcasts; emits 0x392 / 0x395
Diagnostics
UDS 0x7D4 → 0x7DC
Location
Live GPS lat/lon — DID 0200
Cellular
eSIM (ICCID) + carrier + signal — 0298 / 0296 / 0297
Identity
F191 41001221 · serial F18C — sw MY26_S2DM_10.2
Uploads & updates
Charge / range / odometer → cloud · receives FOTA
The TCU doesn't originate most of what it reports — it relays what it hears on the bus. So the cloud's picture of the vehicle is, in effect, the bus's picture.
02 — The bus it trusts

E2E is integrity, not authentication

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.

03 — The demonstration

Changing a value is a race you win once

Forging one frame is trivial: clone the real one, change the field, continue the counter, recompute the CRC.

D1
00
cloned
D2
00
odometer
D3
04
odometer
D4
D2
odometer
D5
00
cloned
D6
00
cloned
D7
2B
counter++
D8
C4
re-CRC
cloned from the real frame changed field (odometer = 1,234 m → app “1 mi”) re-derived to stay valid
Frame 0x562 (odometer). One valid frame is easy. Making it the value the receiver reports is the interesting part.

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.

Illustrative, from the counter rule. The injector bursts to get a few counters ahead, then holds at the genuine sender's own rate; the receiver's accepted stream — and the cloud value — flips to the injected frames. When the injector stops, the genuine frames stay rejected until the genuine counter climbs back to the fast-forwarded value, then reclaim.
Measured against a receiver model, on our own captures

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.

04 — The result

The cloud reflects the bus; the cluster reflects itself

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.

LiveWire companion app showing a 1 mile odometer, last synced 3 seconds ago
companion app · via the cloud
Meanwhile, on the bike
≈2,952mi
✓ unchanged — the cluster reads its own store

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.

TelemetryFrameCloud checkWhat we observed
Odometer0x562 · E2EnoneChanged in the app; dash unaffected
State of charge0x185 · E2EnoneChanged in the app and on the dash (the cluster consumes it)
Estimated rangeunresolvedCouldn't move it — see below
Range is honestly unresolved. Nudging the battery frames raised a self-clearing “Charge bike fault” and range didn't change — but we do not fully understand that frame yet.
05 — The line we didn't cross

Could you trigger an OTA?

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.

Why this one stayed on paper

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.

An offer to LiveWire

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.

06 — Reading the stack

The diagnostic surface, and honest impact

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.

More than it needs to expose

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.

What this is

  • A device on the bus can make the cloud/app report false vehicle state (mileage, charge) while it holds the counter lead.
  • It can raise transient dash faults the same way.
  • Live GPS, ICCID and carrier read with no authentication — more exposed than the module's own IMSI/IMEI, which it locks. An access-control / data-minimization gap.
  • The uploaded odometer has no plausibility check — it accepted a large decrease.

What it isn't

  • Not remote. It needs local CAN access — a physical tap or a compromised on-bus device.
  • Not safety actuation. No throttle, brakes, or drivetrain were touched or claimed.
  • Not persistent. Spoofed values self-revert once the genuine chain catches up; faults self-clear.
  • Not a cloud or credential compromise. No keys were extracted or used.
What would close it

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.