← cd ~/index

How your smart TV phones home

A gentle intro to automatic content recognition, and how to watch your own TV do it on a network you control.

The television is the one appliance in your house that watches you back, and it is surprisingly open about it once you know where to look.

The mechanism is called automatic content recognition, or ACR. The idea is simple and a little audacious. Many smart TVs sample what is on the screen, a few frames per second, or a fingerprint of the audio, and ship those samples to a server. The server matches them against a catalogue and figures out what you are watching, including content coming in over HDMI from a console or a cable box that the TV vendor otherwise knows nothing about. That match becomes a data point: this household, this show, this minute. Multiply by every TV they sell and you have a viewership dataset assembled without a survey.

That is the part worth sitting with. ACR does not care whether the content came from the TV’s own apps. Point a laptop at the HDMI port and the TV will still try to recognize the frames. The screen is the sensor.

The good news for the curious: this all happens over the network, and the network is observable. You can watch your own TV do it, on your own gear, on a connection you control. A few honest ways in, roughly in order of effort:

Watch the names it looks up. Put the TV on a network where you can see DNS. A Pi-hole, your router’s query log, or tcpdump on the gateway all work. Power the TV on and just read the domains. ACR and telemetry endpoints tend to have unsubtle hostnames, and they tend to beat like a metronome, a request every few seconds whether or not you touch the remote. Idle traffic is the tell.

# on a box that sees the TV's traffic
sudo tcpdump -n -i any port 53 and host <tv-ip>

Look at where the bytes go and how often. Drop the DNS filter and watch the flows. You are looking for periodic connections to a small set of hosts, especially ones that keep going when the TV is “idle.” Note the rhythm. Rhythm survives encryption even when the payload does not.

Read the payload when you can. Some traffic is plaintext or yields to an intercepting proxy on hardware you own. mitmproxy in transparent mode will show you the request bodies that are not pinned. You do not need to decode the whole protocol to learn a lot. The cadence, the size, and the destination already tell a story.

Then run the experiment that actually matters. Find the ACR setting in the menu, the one usually labelled something soothing about “viewing information” or “personalization.” Capture with it on. Capture with it off. Compare. That before-and-after is the entire game, and it is exactly the kind of measurement I do in the lab. A toggle that changes the traffic is a real control. A toggle that changes nothing is set dressing.

One rule, and I mean it: do this only on devices and networks that are yours. The interesting question is what the box does to you, and you are allowed to investigate your own box. Point it at someone else’s and you are not a researcher anymore, you are the problem.

Everything is hackable, even your toothbrush. The television just happens to hack back, and it leaves the receipts on the wire if you bother to read them.