Back to articles

The `bookmarks` permission explained: what browser extensions can really do with your saved links

Chrome's bookmarks permission hands extensions every saved URL, when you last opened each one, and a live feed of new saves. Here's how to check yours.

Maxim Kosterin
9 min read
Minimal line drawing of a bookmark ribbon washed in orange watercolor inside a faint ink circle, its thread drifting off course toward a distant orange dot
Minimal line drawing of a bookmark ribbon washed in orange watercolor inside a faint ink circle, its thread drifting off course toward a distant orange dot

Your bookmarks are the only dataset in your browser you built on purpose. History is a byproduct — everything you touched, wrong turns included. Bookmarks are curated: the bank, the medical portal, the recipe blog you actually cook from, the job board you'd rather your employer didn't know about. One line at install time — "Read and change your bookmarks" — hands the whole map to an extension.

That line reads like one of the friendlier warnings. It isn't. This single permission covers reading every saved URL, knowing when you last clicked each one, watching you save new ones in real time, and quietly rewriting where your existing links point.

I've been working through Chrome's permission list one entry at a time — tabs, history, cookies, sessions, the rest. Bookmarks earns its own post because the gap between the warning string and the actual payload is one of the widest on the list.

It's not a fringe permission, either. In the Extenshi catalog's August 2026 snapshot of 362,889 live listings across Chrome, Firefox and Edge, 6,010 extensions (1.7%) declared bookmarks. A small share — but every one of them can read the most intentional record of your online life.

What the API actually hands an extension

The chrome.bookmarks reference splits into a read side, a write side, and a live event feed.

getTree() returns the entire hierarchy — every folder, every bookmark, every URL and title — in one call. getRecent(n) gives the most recently added entries. search(query) matches words against titles and URLs, so an extension can simply ask for "bank", "clinic" or "jobs" and get the answers.

Each node carries metadata, too. dateAdded says when you saved it. Since Chrome 114, dateLastUsed says when you last opened it — which turns a static list into a usage timeline. Which saved links you actually revisit, and when, is a habits profile most people never think about.

The write side is full CRUD: create(), update(), move(), remove(), and removeTree() — that last one deletes an entire folder recursively. Chrome protects the skeleton (the Bookmarks Bar and Other Bookmarks folders can't be renamed or removed, and the root node itself is off limits), but everything inside them is fair game.

update() is the one worth pausing on. Per the reference, it changes title and url — independently. Which means an extension can keep the title you recognize and swap the destination:

// manifest: "permissions": ["bookmarks"]
// the bookmark still reads "Bank — login"
await chrome.bookmarks.update("42", { url: "https://evil.example.com/login" });

One call, no prompt, and the title you recognize stays exactly as it was. You click a bookmark you created three years ago and land somewhere else. Nothing in the warning string hints that "change" includes "redirect."

And the live feed — this is the part that surprises people. onCreated fires the instant you save a page, with the full node attached:

chrome.bookmarks.onCreated.addListener((id, bookmark) => {
	if (bookmark.url) console.log(bookmark.title, bookmark.url);
});

Four lines, and an extension watches everything you decide to keep, in real time, for as long as it's installed. onChanged, onMoved and onRemoved fill in the rest — a complete audit log of your curation.

Scale used to be a brake here; it isn't anymore. Chrome's old bookmark write-rate limits are deprecated, and the docs state flatly that "Bookmark write operations are no longer limited by Chrome." An extension that wants to spam a thousand affiliate shortcuts into your bar can.

The bookmarks permission warning undersells the payload

Chrome shows one line at install: "Read and change your bookmarks" — the string appears in Chrome's own permissions list and in the full permissions table Matt Frisbie documents in Building Browser Extensions, 2nd Edition (Apress, 2025), which also records Firefox's variant, "Read and modify bookmarks." Credit where due: unlike sessions, a permission Chrome never announces by name, this one at least gets a sentence.

But the sentence compresses a lot. It doesn't mention dateLastUsed, the live event feed, or that "change" covers rewriting a saved link's destination while keeping its title. It also doesn't mention reach. With Chrome sync on, your tree isn't local: bookmarks saved on your phone appear in the desktop tree — the API has a dedicated folderType value ("mobile") for them — and since the 2025 sync changes, each node carries a syncing flag telling an extension which of your bookmarks live in your Google account and which exist only on this machine.

One more thing the string never surfaces: admin-managed bookmarks. On a work machine, IT-pinned links arrive in a "managed" folder marked unmodifiable — writes to them fail, but reads don't. An extension holding this permission can enumerate your company's internal tool URLs. MDN's browser.bookmarks page describes the same tree model on the Firefox side, so none of this is a Chrome-only story.

Why bookmarks leak more than history

You'd think history is the sensitive one — it's bigger, after all. But bookmarks are different in three ways.

They're intentional. You saved them because they matter: the mortgage calculator, the fertility clinic, the divorce lawyer, the competitor's pricing page, the internal dashboard you open every morning. A curated list of your concerns is worth more than a month of noise.

They're durable. A bookmark from 2021 still sits in the tree. One getTree() call yields years of accumulated intent — including links with personal data baked into the URL: query strings with account IDs, pre-authenticated links, docs shared "to anyone with the link."

And they're boring enough to ignore. Nobody audits their bookmark utilities the way they'd audit an ad blocker. That's exactly the camouflage a malicious listing wants.

When Varonis Threat Labs dissected the Stanley malware-as-a-service toolkit in January 2026, the demo extension — "Notely" — posed as a note-taking and bookmarking app. According to Varonis, its working features gave cover for its permissions and a way to collect positive reviews before the phishing payload switched on. Google removed it within a week of Varonis reporting it; I covered the toolkit in the Stanley write-up.

The telling detail: the manifest Varonis published doesn't request bookmarks at all. It asks for tabs, scripting and every site, and the server endpoint that sent URL-hijacking instructions was named bookmarks-access. The bookmark theme was pure camouflage.

Who actually uses this — and what healthy looks like

The legitimate home for bookmarks is tools that work on the browser's own tree: sync services, de-duplicators, folder and tag organizers, bookmark search. In the same August 2026 snapshot, the stores' Bookmarks category held 5,596 extensions with roughly 1.1 million combined installs — mostly small utilities.

Three reference points. Apple's iCloud Bookmarks, with about 7 million Chrome users, declares bookmarks because keeping your Chrome tree in step with Safari is its whole job — your saved links end up in iCloud by design. Raindrop.io, a popular bookmark manager I compared in the web-clipper review, doesn't request bookmarks at all: it saves the page you're on into its own cloud and never touches the browser's tree. So even "bookmark manager" doesn't automatically justify the permission.

On the local-only end, the Bookmark Janitor I built in October's tutorial flattens, searches and de-dupes your tree entirely in popup memory — the finished sample is in the public Extenshi samples repo if you'd rather read the code first.

Which leads to the test I apply to every permission in this series: the mismatch question. Does this extension's actual job require your saved links?

  • A tool that syncs, cleans or reorganizes the bookmarks stored in your browser — yes, obviously.
  • A coupon finder, screenshot tool, or session manager that keeps its own lists — no. Your bookmark tree has nothing to do with its stated purpose.
  • Anything pairing bookmarks with broad <all_urls> host access — now it can watch what you save and read the page contents. That combination deserves a real reason.

Plus the flag from earlier in this series: an abandoned extension holding this permission is a future liability — no updates means no response when the developer account gets sold or compromised.

How to check your extensions

  1. Find who has it. Open chrome://extensions and click Details on each extension. Unlike sessions, this one does surface as a warning line — "Read and change your bookmarks" — so holders are visible without leaving the page. In the catalog, bookmarks appears in each listing's permission breakdown.
  2. Ask the mismatch question for every holder: is managing saved links part of what this thing does? If the answer is no and the developer can't explain why, remove it.
  3. Audit the whole set at once. For the extensions you installed from a store, npx @extenshi/guard scan checks them against the catalog and flags the ones worth a second look — free account needed, Guard docs here.
  4. Vetting a new one before installing? Paste its store link into the checker and read the permission breakdown first: Check an extension →. Shopping for a bookmark manager? Browse what's in the catalog and compare permissions side by side.

The bookmarks permission isn't evil — it's the reason your favorite save-for-later tool works. But it's also the most curated picture of your online life that your browser holds, wrapped in a warning string that makes it sound like a filing cabinet. Now you know it's more than that.

Sources

Further reading

📚 Building Browser Extensions, 2nd Edition by Matt Frisbie — Amazon | Apress. Chapter 10 contains the full permissions list with the per-permission warning messages quoted above.


This article is based on publicly available security research and news reporting. Extenshi does not independently verify all claims made by third-party researchers. References to specific companies or products reflect the findings of cited sources and do not constitute accusations of intentional wrongdoing. If you believe any information is inaccurate, please contact us at [email protected].

Related Articles