Safeguard
Supply Chain•

How do force-installed browser extensions get updates?

Chrome checks an update URL every few hours and installs newer versions signed with the same key. Here is how store and self-hosted updates differ.

Safeguard Security Team
4 min read

Chrome checks each installed extension's update URL every few hours, reads an update manifest, and installs any newer version that is signed with the same private key as the current one. Store extensions use the Chrome Web Store URL by default. Self-hosted ones use whatever URL you set.

The update loop in four steps

Chrome's documentation for self-hosted extensions describes the flow:

  1. Every few hours the browser looks at each installed extension's update URL.
  2. It requests an update manifest, an XML file listing the latest version.
  3. If that version is newer than the installed one, it downloads the new .crx file.
  4. The new file must be signed with the same private key as the installed version.

The documentation also notes that Chrome does not send cookie headers with these manifest requests, to protect user privacy. That is useful to know if you were planning to gate the update server by session.

Where the URL comes from

In the force-install list, each entry is an extension ID and, optionally, an update URL separated by a semicolon. The Chromium policy definition says the Chrome Web Store update URL is the default, and that a custom URL should point to an update manifest XML document.

PathUpdate sourceWho controls the release
Store extensionChrome Web StoreThe publisher, after store review
Self-hosted extensionYour own web serverWhoever can write to that server

What this means for your risk model

With a store extension you depend on the publisher's account and the store's review. With a self-hosted one you depend on your own hosting and your signing key. Neither is automatically safer. The question is which failure you are better placed to prevent.

For self-hosted updates, the signature rule is a real protection: someone who replaces the file on your web server cannot ship a working update unless they also hold the private key. So the web server and the key are two separate things to defend. The key matters more.

For store updates, you have little control over timing. Policy fields such as minimum_version_required exist in the schema to enforce a floor, but there is no field in the schema we reviewed that holds back a new version. If you need to pause a release, the route is to block or remove the extension, which we cover in the staged rollout and rollback post.

A practical checklist

  • Know which update URL each forced extension uses.
  • For self-hosted ones, serve the update manifest and the file over HTTPS. The policy accepts http, https and file schemes, but HTTPS is the sensible choice for anything leaving a lab.
  • Restrict who can write to the update server and log changes.
  • Store the signing key off the web server.
  • Watch for version changes on a schedule rather than waiting for an incident.

Try it yourself

Click through it at your own pace, or open it full screen.

Click through the alerts and notice how a change after an initial clean result is what gets flagged. The same idea applies to extension versions.

Quick check

How often does Chrome check for extension updates?

The documentation says every few hours. It does not give an exact interval, so do not plan around a specific number.

Can an attacker push a fake update to a self-hosted extension?

Not without the private key, because the new package must be signed with the same key as the installed version. Protect the key as carefully as the server.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.