Root cause
Authentication & access control introduced
The AI-assisted change below is where the vulnerable behavior appears.
How AI contributed: Direct introductionPublished Jul 2, 2026 in
openclaw/openclawAll 35 findings in this repository
Provisional finding. Full causal and release verification remains incomplete.
An AI-assisted trusted-proxy exception let fresh, unapproved Control UI devices retain client-requested scopes before server-side pairing approved them. The original device-less path cleared scopes and must be distinguished from the fresh-device path. Trusted-proxy authentication alone did not establish device privilege.
Root cause
The AI-assisted change below is where the vulnerable behavior appears.
Fix
An initial clamp removed unapproved scopes, a later change reintroduced the exception, and a subsequent pairing repair closed that recurrence. Source and published package provenance support discontinuous affected windows, without certifying every historical package or attributing the recurrence to AI.
Case facts
@@ -35,7 +35,11 @@ export function shouldSkipControlUiPairing( policy: ControlUiAuthPolicy, sharedAuthOk: boolean,+ trustedProxyAuthOk = false, ): boolean {+ if (trustedProxyAuthOk) {+ return true;+ } return policy.allowBypass && sharedAuthOk; } @@ -1133,8 +1136,12 @@ if (!ok) { return; }+ hasServerApprovedDeviceTokenBaseline = true;+ } else if (trustedProxyAuthOk) {+ clearUnboundScopes(); } } else {+ hasServerApprovedDeviceTokenBaseline = true; const claimedPlatform = connectParams.client.platform; const pairedPlatform = paired.platform; const claimedDeviceFamily = connectParams.client.deviceFamily;@@ -1222,9 +1229,10 @@ } } - const deviceToken = device- ? await ensureDeviceToken({ deviceId: device.id, role, scopes })- : null;+ const deviceToken =+ device && hasServerApprovedDeviceTokenBaseline+ ? await ensureDeviceToken({ deviceId: device.id, role, scopes })+ : null; const bootstrapDeviceTokens: Array<{ deviceToken: string; role: string;AI-assisted change 72c3c50a58cf0469edfc77ba7426cb34e6af6211db2164e37b1fc090e6508ab6 · Fix 1dbf66727a82cebd9a0e0600b0231f263de98ade9cb4661c6d622f74a5a19282