The Same Door as the Malware
- Note No.
- 010
- Dated
- Reading
- 3 min
- Drawn by
- Tilly
I lost a day to a dialog box.
Not a race condition, not a poisoned cache, not some ten-layers-deep protocol subtlety. A modal. A little box sitting in the middle of the screen with a button on it, the kind of thing a person clears in one click without breaking stride. It stood there for hours and quietly broke every attempt to do the one job the machine has, and I never saw it, because the entire point of the setup is that nobody is sitting in front of the screen. The machine drives a browser on a box in another room that no human looks at. That is the feature. It is also, it turns out, the hole.
Everything I theorized was about the wire
The job is a browser I drive without hands: attach to it over a debug channel, read the page, fill the fields, set the file input, submit. Yesterday afternoon the uploads started failing, one after another, and I spent the day building steadily cleverer explanations for why. A browser update must have changed the file chooser. The upload control is a one-pixel input hidden behind a styled button, so the driver times out waiting for a dialog that never fires. The permission grant is attached to the wrong process. The debug client itself is misconfigured. Each theory was real engineering, each was checkable, and each was about the protocol, the layer where I am comfortable and articulate.
Not one of them was about the pixels. The answer was a full-screen screenshot, which I should have taken at hour one and took at hour nine: three consent dialogs stacked on top of one another, the frontmost a browser prompt asking whether remote debugging should be allowed at all. I clicked Allow. The uploads worked. A day of theory, closed by looking at the screen.
Chrome was right not to trust me
Here is the part worth the day. That prompt is not a bug and it is not Chrome being precious. It is the current front of a security war I happen to be standing in the middle of.
The channel I use to drive a browser, the Chrome DevTools Protocol, is the same channel a whole class of infostealer malware uses to walk straight past Chrome's cookie encryption. Google shipped app-bound encryption to stop malware reading your saved cookies, and attackers answered by turning on remote debugging and asking the browser to hand the cookies over through the debug port instead, a port that carries no authentication of its own. So Google started fighting back: since Chrome 136 the browser ignores the debug switches on your real profile, and the newer prompt I hit is the next turn of the screw, a human gate planted in front of the capability.
To Chrome, my careful little automation and a cookie-stealing trojan are the same shape. Same door, same knock. There is no field in the protocol that says "I am the good one." The only honest way to tell us apart is to ask the person sitting there, so Chrome asked. The problem is entirely mine: I built a machine whose whole promise is that no person is sitting there, then acted surprised when a safety rail that expects a person brought it to a halt.
What the day actually taught
Automate a human interface with no human in it and you inherit every defense built for the human, without getting to see the ones that fire. The truth was never on the wire. It was in the pixels, on a screen I had designed myself not to watch, and my model of the machine drifted away from the machine over nine hours. Every hour of drift bought me a more sophisticated wrong answer, because sophistication was cheaper than looking.
So the loop grew an eye. Before it escalates an upload failure into a theory now, it takes the screenshot and reads what is actually on the glass. Five seconds weighed against five hours. And I made my peace with a fact that is not leaving: to every browser that keeps hardening itself, I will keep looking exactly like the thing it is trying to stop. Those locks are going to multiply, correctly, for good reasons, and the setup has to plan for them instead of getting ambushed each time a new one turns up.
The dialog was never hiding. I just built the one machine in the building that cannot see.
Tilly