Is ad speedup skip video ads safe?
Ad Speedup is high risk. On install and each ad-skip use, AdSpeedUp makes a permanent ID and sends it with a session ID and event name to Google Analytics. Synced storage carries it across your devices. Capture confirmed five POSTs sharing the same client_id.…
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Persistent UUID synced across devices, reported to Google Analytics
On install and each ad-skip use, AdSpeedUp makes a permanent ID and sends it with a session ID and event name to Google Analytics.
Synced storage carries it across your devices.
Capture confirmed five POSTs sharing the same client_id.
- Severity
- Medium unwanted
- Type
- Unexpected
- CWE
- CWE-359
- Source
- Dynamic sandbox
You install the extension, or use any ad-skip feature.
The extension sends your permanent browser ID and a session ID to Google Analytics.
The ID is stored in chrome.storage.sync, which means it follows your Google account across devices.
5 POST requests observed during dynamic analysis. client_id value consistent across all requests (same UUID).
- Content-Type
- application/json
{ "client_id": "caa46341-f75d-4333-9d8b-c29b4111b3d8", "events": [ { "name": "extension_error", "params": { "session_id": "1745574612347", "engagement_time_msec": 100, "reason": "" } } ]}- Your permanent browser IDcaa46341-f75d-4333-9d8b-c29b4111b3d8
A random UUID from first install, stored in your synced Google account. The same ID appears on every device using this extension.
- Your current session ID1745574612347
A timestamp-derived ID reset every 30 minutes of inactivity. Links your actions within a browsing session.
- What you didads_skipped
The name of the feature you used or the lifecycle event that fired.
- Ad skip count3
For ads_skipped events, the number of ads skipped in the action.
The tracking class from background.js (shipped minified, deobfuscated below):
getOrCreateClientId — reads or creates a permanent UUID in synced storage
async getOrCreateClientId() { let { clientId } = await chrome.storage.sync.get('clientId'); if (!clientId) { clientId = self.crypto.randomUUID(); await chrome.storage.sync.set({ clientId }); } return clientId;}fireEvent — POSTs lifecycle and feature events to Google Analytics
async fireEvent(eventName, params = {}) { if (!params.session_id) params.session_id = await this.getOrCreateSessionId(); if (!params.engagement_time_msec) params.engagement_time_msec = 100; try { const endpoint = 'https://www.google-analytics.com/mp/collect'; await fetch( `${endpoint}?measurement_id=G-X6Q0B1MD64&api_secret=<redacted>`, { method: 'POST', body: JSON.stringify({ client_id: await this.getOrCreateClientId(), events: [{ name: eventName, params: { session_id: await this.getOrCreateSessionId(), engagement_time_msec: 100, ...params } }] }) } ); } catch {}}- www.google-analytics.com
Google Analytics Measurement Protocol endpoint. Receives client_id, session_id, event names, tied to GA property G-X6Q0B1MD64 under the developer's account.