v3.0.4
Security
-
Cross-site requests can no longer change putiorr's state. Only
POST /api/grabwas protected; every other state-changing/apiendpoint —
settings, profiles, download profiles, starting and deleting downloads, the
orphan routes, the OAuth routes andPOST /api/poll— could be driven by any
page the user happened to visit. No credentials were needed, because putiorr
has none to steal: the attacker only needed the victim's browser to reach a
putiorr on their network.A request is now refused when the browser reports it was started by another
site. Nothing else changes: the dashboard,curland scripts, the browser
extension, and the *arr apps on the Transmission RPC endpoints are all
unaffected, and reads are untouched. Refusals are logged with the path and
method behind them.This is a mitigation, not a boundary. A caller that is not a browser is
deliberately still allowed through — refusing those would break every
scripted setup and would not stop the attack it is aimed at.