Skip to content
Back to skills

Manifest Permissions Audit

ASecurity

Audit a browser extension's manifest.json against the least-privilege bar and Manifest V3 conformance: every permission and host match justified, activeTab/optional-permission opportunities, no remotely-hosted code, scoped web_accessible_resources, and the store-review risk each entry carries. Reach for this before a store submission, after a permissions rejection, or when reviewing an inherited extension.

  • 7 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 23, 2026
ai-agentsrustapisecurity

Works with

  • cli
  • api

Security analysis

A100/100

Scanned September 23, 2026

npx -y skills add mcorbett51090/RavenClaude --skill manifest-permissions-audit --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Manifest Permissions Audit?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Manifest Permissions Audit
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/mcorbett51090-manifest-permissions-audit/badge)](https://www.skillsdirectory.com/skills/mcorbett51090-manifest-permissions-audit)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: manifest-permissions-audit
description: "Audit a browser extension's manifest.json against the least-privilege bar and Manifest V3 conformance: every permission and host match justified, activeTab/optional-permission opportunities, no remotely-hosted code, scoped web_accessible_resources, and the store-review risk each entry carries. Reach for this before a store submission, after a permissions rejection, or when reviewing an inherited extension."
---

# Skill: Manifest & Permissions Audit

Every permission an extension requests is a store-review risk and a user-trust
cost. This skill audits a `manifest.json` for *least privilege* and MV3
conformance, and returns a prioritized fix list. Used by both agents.

## Step 0 — One opinion up front: justify every grant, or drop it

The default verdict on any permission is "remove it." Keep it only if there's a
concrete feature that breaks without it. The narrowest grant that works is always
the right one.

## Step 1 — Host permissions

| Smell | Fix |
|---|---|
| `<all_urls>` / `*://*/*` | Narrow to specific match patterns; if interaction is user-initiated, prefer `activeTab` (grants the current tab on click, no broad grant). |
| Broad host perms for an occasional feature | Move to **optional** `host_permissions`, requested at runtime via `permissions.request()`. |
| Host perms requested at install with no immediate use | Defer to runtime/optional. |

`activeTab` is the single biggest permissions win for user-initiated extensions —
it sidesteps the "this extension can read all your data on all sites" warning.

## Step 2 — API permissions

For each entry in `permissions`:

- Name the feature that requires it. No feature → drop it.
- Prefer **`declarativeNetRequest`** over the deprecated blocking `webRequest`
  (MV3 removed blocking `webRequest` for most cases).
- Flag high-review-risk permissions (broad host access, `tabs` for URL reading,
  `scripting`, `cookies`, `nativeMessaging`) and confirm each is truly needed.
- Move anything used only occasionally to **`optional_permissions`**.

## Step 3 — MV3 conformance

- `manifest_version: 3`.
- Background is a **service worker** (`background.service_worker`), not a
  `background.page`/`scripts` with `persistent`.
- **No remotely-hosted code** — all executable JS is in the package. No
  `content_security_policy` loosened to allow remote scripts; no remote module
  import or `eval` of fetched code. (A hard rejection if present.)
- `action` (not the MV2 `browser_action`/`page_action`).

## Step 4 — `web_accessible_resources`

- Expose only the specific resources needed.
- Scope `matches` to the specific origins that need them — never `<all_urls>`/`*`.
- Each exposed resource is reachable by web pages, so treat it as an attack
  surface.

## Step 5 — Output: a prioritized fix list

1. **Rejection blockers** — remotely-hosted code, MV2 leftovers, permissions far
   exceeding the stated purpose.
2. **Least-privilege wins** — `<all_urls>`→`activeTab`/narrow match;
   install-time→optional; over-broad `web_accessible_resources`.
3. **Hardening** — drop unused permissions, tighten CSP, narrow content-script
   matches.

Each finding states the corrected manifest entry and its store-review-risk
rationale. Pair with [`store-submission-readiness`](../store-submission-readiness/SKILL.md)
before submitting. See [`../../knowledge/manifest-v3-architecture.md`](../../knowledge/manifest-v3-architecture.md)
for the permissions-minimization decision tree.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…