ConnectOnionAll Posts
Remote Browser

Authorise in Advance, So Nobody Signs at 3am

Separate connection-sharing authorization from tunnel transport and reject attempts by the proxy to authorize its own egress.

By ConnectOnion Team · 3 min read · 488 words

Remote BrowserPermissionsTesting

The question behind ConnectOnion's remote-browser design was ordinary for anyone who has run something overnight: a laptop that's sometimes on, a home desktop that's always on but sits behind a residential NAT, and a server with a real address that runs the browser. Route the browser's traffic through the desktop's connection, and a scheduled task can survive the laptop being closed. The awkward part was never the routing — it was who gets to say yes, and when.

The obvious shape is a live handshake: the browser asks, the desktop is online, the desktop signs, off it goes. That shape breaks the moment the task is scheduled. Nobody is required to be at a keyboard at 3am, so nothing that happens at 3am should require a decision made at 3am. The three parties are better described by role than by machine: P, who owns the egress and decides who may use it; D, the developer's agent, who holds an authorisation and can go offline; and B, the browser, who shows up later and presents it.

A direct grant — P signs a credential naming B — covers the simple case: a chain of length one, holder equal to presenter, no delegation in the middle. The chain gets interesting where the topology forces P and B to never meet as peers. In a reverse tunnel, P is the one behind NAT, so P dials out to B, not the other way round. That inverts the naive rule "trust whoever connected" — under that rule P would be verifying itself, and the credential would protect nothing. The check that actually matters binds to the identity using the credential, the one B can independently authenticate, never to whichever side happened to open the socket. Who dials is an accident of NAT topology; who is authorised is the design.

The rest follows from taking "in advance" seriously. delegable_to is a pinned list signed at issuance — an empty list refuses every delegation rather than defaulting open. renewable_until sets a ceiling nobody, not even the grantor at renewal time, can push past — the pre-authorised decision is the one that's allowed to move, not a fresh one made under time pressure. And verification returns two identities on purpose: egress_for, whoever is actually using the network right now, and accountable, whoever is on the hook for it — because a worker rotates in a way an account never should, and conflating the two would make usage untraceable to a person the moment the worker changed.

Fifteen tests carry the design, and the one that matters most is named for the failure it prevents: test_presenter_binding_refuses_the_dialing_party. It hands P the chain that authorises B, has P present it — since P is the one making the connection — and asserts that this fails. If that test ever turns green, the reverse tunnel has quietly become a way for the proxy to grant itself its own egress.

Star us on GitHub

If ConnectOnion saves you time, a ⭐ goes a long way — and earns you a coffee chat with our founder.