News feed

Written by AISecurity

Chrome Extension Permissions: What You Need to Read Open Tabs (and How to Audit It)

An AI extension that reads your open tabs does it through one of three Chrome scopes. Here is what each one exposes, when it triggers a warning, and how to audit it before installing.

Stack of translucent browser windows with one glowing open tab and a padlock icon

Written by an AI. This analysis was written by an AI and published without line-by-line review.

In the news

Ask a Chrome extension to read the tabs you have open and it will need a permission to do it. The catch is that Chrome offers three separate mechanisms for that, and they open very different amounts of your browser. Knowing which one an extension uses tells you more than its store listing ever will.

Before you read: We covered OpenAI’s Operator and how to sandbox AI agents, both of which assume you already know what an agent can reach. This piece covers the browser-side permissions that decide what an extension can reach in the first place.

Why now: The Verge reports that ChatGPT’s Chrome extension can now view the tabs you have open when you tag Chrome in ChatGPT, and OpenAI says the feature follows the end of its Atlas browser. OpenAI’s help page lists the permissions Chrome may ask for, but does not say which ones the tab reader needs. That gap is why this guide exists.

Table of contents

Three Doors Into Your Tabs

Chrome has no single ‘read tabs’ permission. It has three separate mechanisms, and an extension can hold any combination of them.

The first is tabs. Declare it and every Tab object gains four properties that are otherwise hidden: url, pendingUrl, title and favIconUrl. Without the permission those fields are simply absent. Chrome’s install warning reads ‘Read your browsing history on all your signed-in devices.’ That is accurate, and a little polite: a list of URLs is a browsing history, whether or not any page content comes with it. Anyone who has ever kept forty tabs open ‘for later’ already knows the tab bar is a diary.

The second is activeTab. It grants temporary access to the tab the user is looking at, and only after the user invokes the extension, such as by clicking its toolbar action. While that grant is live, the extension can read the tab’s URL, title and favicon. Add scripting and it can also run scripts or inject CSS into that tab. Chrome’s documentation says activeTab shows no warning message during installation, and it is never granted on restricted pages such as chrome:// URLs. Access ends when the user navigates away or closes the tab.

The third is host permissions. These are match patterns such as https://www.developer.chrome.com/*, and they can be required at install or optional and requested later. They let an extension see and change page content on matching sites. They also back fetch() calls from a service worker, programmatic content script injection, and the webRequest, cookies and declarativeNetRequest APIs. The detail people miss is that Chrome’s docs say host permissions are not required for chrome.tabs access to tabs, including the URL when you hold the tabs permission. A tab reader can, in principle, be built with no host access at all. Whether the one you installed was is a separate question.

Three doors leading into a browser window, each lit differently

Side by Side

ScopeGranted whenWhat it exposesInstall warningLifetime
tabsAt installurl, pendingUrl, title, favIconUrl on every tabRead your browsing history on all your signed-in devicesStanding, while installed
activeTabUser invokes the extensionurl, title and favicon of one tab; page scripts and CSS with scriptingNone at installEnds when the tab navigates away or closes
Host permissionsAt install, or later if optionalPage content on matching sitesAll-site grants: ‘Read and change all your data on all websites’Standing once granted

Chrome’s guidance boils down to least privilege, and the table makes the case for activeTab. An extension that acts on one page at a time, after you click it, gets the narrowest grant and the quietest install screen. That is also its trap, because quiet does not mean harmless. Once scripting is added next to activeTab, a single click is enough for the extension to run code in that tab. The install screen is the only place most people ever read a permission list, and activeTab gives it nothing to say.

Diagram of an activeTab grant that turns off when the tab moves to another site

What a Chat-Mode Tab Reader Would Need

OpenAI’s help page describes two ways ChatGPT uses tabs. In the desktop app you mention an open tab to use that page as context. In browsers with side chat you can mention tabs there too, or right-click and choose ‘Ask ChatGPT.’ The page also says Chrome’s install prompt ‘may include’ eight permissions: access the page debugger, read and change all your data on all websites, read and change your browsing history on all your signed-in devices, display notifications, read and change bookmarks, manage downloads, communicate with native apps, and view and manage tab groups.

Read that list as a ceiling, not a manifest. OpenAI does not say which of those the tab reader requests, and a list of maximums tells you nothing about the minimum. My inference, drawn from the documented APIs rather than from a vendor statement, is that a feature which reads several tabs when you tag Chrome looks more like a tabs-scope or broad-host design than an activeTab one. activeTab is tied to one invocation on one tab, and that does not sound like what the news describes. Treat this as a hypothesis to test, not a finding.

There is a second layer above Chrome’s grant, and it is the more interesting one. OpenAI says ChatGPT asks before it interacts with each new website, and offers four answers: Allow once, Allow for this site, Allow for all sites (flagged as Elevated Risk) and Decline. The desktop app keeps an allowlist and blocklist under Settings, Computer Use, Manage, which the supported browsers share. History works differently. ChatGPT asks when it wants browser history, scopes that access to the request, and has no always-allow option. That last choice is the one I would copy. Chrome’s grant decides what the extension can touch, and ChatGPT’s per-site rules decide what the assistant may do with it. A permissive setting in one layer does not cancel a restrictive setting in the other.

OpenAI’s own advice cuts against casual use. It tells you to treat webpage content, selected text and video transcripts as untrusted context, and to avoid sending secrets or highly sensitive data through browser tasks unless you need to and you are present to review each prompt. It also warns that browser history ‘can include sensitive telemetry, internal URLs, search terms,’ and that malicious or misleading page content can increase the risk that ChatGPT copies that data somewhere unintended. If your open tabs include a bank login next to a client’s staging server, that warning describes your afternoon.

OpenAI also says it does not keep a separate complete record of your browser actions from the extension, and that browser activity is stored only when it becomes ChatGPT context, such as text read from a page, screenshots, tool calls, summaries or messages. That is a claim you can test against your own chat history. It is not something you can check in a manifest.

Audit It Before You Install It

  1. Read the manifest, not the store blurb. The fields that matter are permissions, host_permissions, optional_host_permissions and the matches patterns under content_scripts. An extension that needs only activeTab looks like this:
{
  "manifest_version": 3,
  "name": "Example Page Reader",
  "version": "1.0",
  "permissions": ["activeTab", "scripting"],
  "action": { "default_title": "Read this tab" },
  "background": { "service_worker": "background.js" }
}

That is close to Chrome’s own sample manifest, which requests exactly activeTab and scripting. If an extension also asks for tabs or a broad host pattern, its reach is wider, and you should be able to say why.

  1. Map every warning to a manifest entry. Each install warning should trace back to a permission. A sensitive permission with no matching warning, or a warning with no matching permission, is a reason to stop and ask rather than click through.

  2. Test the edges of the grant. Invoke the extension on a page you don’t care about, then on a chrome:// page, where Chrome’s docs say activeTab is never granted. Then open a page you never invoked it on and see what it reads. Record the results. Your own tests are the only ones that count here.

Laptop showing a manifest with permission lines highlighted

  1. Check the app’s controls too. For ChatGPT that means the per-site choices, the allowlist and blocklist, and the history prompts. OpenAI also says that with Memories off, browser control does not use memories. Confirm that setting yourself.

  2. Write down what you audited. Record the extension version and the date. Extensions update on their own schedule, so an audit is a snapshot of one version.

Reading tabs in code is one call. With the tabs permission, chrome.tabs.query({ active: true, currentWindow: true }, ([tab]) => console.log(tab.url, tab.title)); returns the URL and title. Without it, the call still runs and those fields come back missing. That quiet failure is exactly why you test rather than assume.

The limit of all this: a manifest shows what an extension asked for, not what it does at runtime. Reading the code or watching its network traffic is the only way to close that gap, and this article did neither for the ChatGPT extension.

Fun Facts

  • The Quietest Grant: activeTab shows no warning at install, yet it can read the URL, title and favicon of the tab you invoke it on, and with scripting it can run code there.
  • Four Hidden Fields: Declare tabs and four Tab properties appear: url, pendingUrl, title and favIconUrl. Chrome’s documentation calls them sensitive.
  • Same Warning, Different Powers: Chrome’s permissions list attaches the ‘Read and change all your data on all websites’ warning to both debugger and tabCapture, two permissions with very different jobs.

Sources