Extension Security Review
Use this skill before installing or enabling any untrusted extension, plugin, package, or repo.
Treat everything as untrusted code until the review says otherwise.
Table of Contents
Inputs
Require all of these before reviewing:
- Source URL or path: GitHub, npm, git, tarball, or local path
- Package name
- Exact version, tag, or commit
If any input is missing, request it first or mark risk as elevated.
Review workflow
1. Identify the install surface
Determine:
- install method: npm, git clone, tarball, local copy, etc.
- whether installation executes scripts
- whether the shipped artifact differs from source
- whether a build step produces bundled output
Return:
install_path_summary
artifact_traceability: clear | partial | unclear
2. Inspect high-signal files
Prioritise:
package.json
- lockfiles:
package-lock.json, pnpm-lock.yaml, yarn.lock
- entrypoints:
main, bin
- build scripts
- CI workflows in
.github/workflows/
Extract:
- lifecycle scripts
- dependency list
- build pipeline
- any install-time automation
3. Detect dangerous capabilities
Search for:
child_process, exec, spawn
- filesystem access outside the project
- network calls:
http, https, fetch, WebSocket
eval, new Function, dynamic import
- credential access:
process.env, .env, .ssh, cloud config files
Classify each finding as:
required
justified
suspicious
excessive
4. Audit lifecycle scripts, critically
From package.json, flag:
preinstall
install
postinstall
prepare
For each script, note:
- the command run
- whether it fetches remote code
- whether it executes shell commands
- whether it is necessary for the package to function
If present without strong justification, raise risk to High.
5. Assess dependency risk
Check:
- dependency count
- pinned vs loose versions
- native modules
- transitive install scripts
- unknown or low-trust maintainers
Flag:
- large dependency trees
- install-time execution in dependencies
- unusually broad dependency scopes
6. Evaluate maintainer and repo trust signals
Check:
- maintainer history
- commit activity consistency
- PR review patterns
- recent ownership changes
- signed commits or tags, if visible
Do not treat stars or download counts as trust signals.
7. Model network and exfiltration risk
Determine:
- outbound domains contacted
- whether data leaves the workspace
- whether editor state, secrets, or credentials can be transmitted
- whether runtime fetches remote code
Flag:
- undocumented telemetry
- broad data access without need
- remote code loading at runtime
8. Model execution capability
Determine whether the extension can:
- run shell commands
- modify files automatically
- read the full workspace
- access IDE or editor state
- persist changes through hooks or config files
Summarise the blast radius clearly.
9. Check reproducibility and integrity
Assess:
- whether a lockfile is present
- whether versions are pinned
- whether release tags match source
- whether install is reproducible without surprise network access
10. Return a verdict
Use this output shape:
Summary
- Package:
- Source:
- Version:
- Risk:
Low | Medium | High | Reject
Key findings
Red flags
- List the most important concerns
Positive signals
- List trust-building signals
Unknowns
- List anything not verified
Recommended usage
- Safe install method, for example
npm install --ignore-scripts first
- Isolation needed:
yes | no
- Pin version or commit:
yes | no
Verdict thresholds
Use these thresholds when assigning risk:
Low — source and artifact are traceable, version is pinned, no suspicious install-time behaviour, and no meaningful exfiltration path is visible.
Medium — one or more unknowns exist, but there is no direct evidence of hidden install-time execution or broad data exposure.
High — strong risk signals exist, such as install-time scripts, broad filesystem or network access, unpinned dependencies, or partial artifact traceability, but the package is still reviewable.
Reject — hidden install-time execution, untraceable artifacts, unexplained exfiltration or credential access, runtime remote code loading, or any behaviour that cannot be justified safely.
Default policies
- Treat all extensions as untrusted code.
- Prefer pinned commits and no lifecycle scripts.
- Reject if traceability is unclear or install-time behaviour is hidden.
- Reject unexplained shell, network, or credential access.
JS-specific rules
Only apply this section when the target is a JavaScript or TypeScript package.
- Treat
package.json scripts as executable code.
- Assume
npm install can run arbitrary commands.
- Audit transitive dependencies if risk is above
Medium.
- Flag dynamic code execution such as
eval or Function.
- Flag unsanitised shell or file operations.
- Prefer deterministic installs with lockfiles.
Safe install procedure
- Inspect without execution:
npm install --ignore-scripts
- Preview package contents:
- Run in isolation:
- container, VM, or low-privilege user
- no secrets in environment
- Only then enable normally.
Edge cases and fallback
- If the manifest or equivalent entry file is missing, say so and raise risk.
- If the artifact is binary-only or built elsewhere, mark
artifact_traceability as unclear unless source-to-artifact mapping is explicit.
- If the package is not JavaScript, skip the JS-specific rules and use the ecosystem's native manifest and build files instead.
- If a tool fails, report the failure and continue with direct file inspection rather than guessing.
- If version, tag, or commit is missing, request it before concluding.
1---2name: extension-security-review3description: Use when adding an extension, plugin, GitHub repo, npm package, or local plugin and you need a structured security review before installing or enabling it.4---56# Extension Security Review78Use this skill before installing or enabling any untrusted extension, plugin, package, or repo.9Treat everything as untrusted code until the review says otherwise.1011## Table of Contents1213- [Inputs](#inputs)14- [Review workflow](#review-workflow)15 - [1. Identify the install surface](#1-identify-the-install-surface)16 - [2. Inspect high-signal files](#2-inspect-high-signal-files)17 - [3. Detect dangerous capabilities](#3-detect-dangerous-capabilities)18 - [4. Audit lifecycle scripts, critically](#4-audit-lifecycle-scripts-critically)19 - [5. Assess dependency risk](#5-assess-dependency-risk)20 - [6. Evaluate maintainer and repo trust signals](#6-evaluate-maintainer-and-repo-trust-signals)21 - [7. Model network and exfiltration risk](#7-model-network-and-exfiltration-risk)22 - [8. Model execution capability](#8-model-execution-capability)23 - [9. Check reproducibility and integrity](#9-check-reproducibility-and-integrity)24 - [10. Return a verdict](#10-return-a-verdict)25- [Default policies](#default-policies)26- [JS-specific rules](#js-specific-rules)27- [Safe install procedure](#safe-install-procedure)28- [Edge cases and fallback](#edge-cases-and-fallback)2930## Inputs3132Require all of these before reviewing:3334- Source URL or path: GitHub, npm, git, tarball, or local path35- Package name36- Exact version, tag, or commit3738If any input is missing, request it first or mark risk as elevated.3940## Review workflow4142### 1. Identify the install surface4344Determine:4546- install method: npm, git clone, tarball, local copy, etc.47- whether installation executes scripts48- whether the shipped artifact differs from source49- whether a build step produces bundled output5051Return:5253- `install_path_summary`54- `artifact_traceability`: `clear | partial | unclear`5556### 2. Inspect high-signal files5758Prioritise:5960- `package.json`61- lockfiles: `package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`62- entrypoints: `main`, `bin`63- build scripts64- CI workflows in `.github/workflows/`6566Extract:6768- lifecycle scripts69- dependency list70- build pipeline71- any install-time automation7273### 3. Detect dangerous capabilities7475Search for:7677- `child_process`, `exec`, `spawn`78- filesystem access outside the project79- network calls: `http`, `https`, `fetch`, `WebSocket`80- `eval`, `new Function`, dynamic import81- credential access: `process.env`, `.env`, `.ssh`, cloud config files8283Classify each finding as:8485- `required`86- `justified`87- `suspicious`88- `excessive`8990### 4. Audit lifecycle scripts, critically9192From `package.json`, flag:9394- `preinstall`95- `install`96- `postinstall`97- `prepare`9899For each script, note:100101- the command run102- whether it fetches remote code103- whether it executes shell commands104- whether it is necessary for the package to function105106If present without strong justification, raise risk to `High`.107108### 5. Assess dependency risk109110Check:111112- dependency count113- pinned vs loose versions114- native modules115- transitive install scripts116- unknown or low-trust maintainers117118Flag:119120- large dependency trees121- install-time execution in dependencies122- unusually broad dependency scopes123124### 6. Evaluate maintainer and repo trust signals125126Check:127128- maintainer history129- commit activity consistency130- PR review patterns131- recent ownership changes132- signed commits or tags, if visible133134Do not treat stars or download counts as trust signals.135136### 7. Model network and exfiltration risk137138Determine:139140- outbound domains contacted141- whether data leaves the workspace142- whether editor state, secrets, or credentials can be transmitted143- whether runtime fetches remote code144145Flag:146147- undocumented telemetry148- broad data access without need149- remote code loading at runtime150151### 8. Model execution capability152153Determine whether the extension can:154155- run shell commands156- modify files automatically157- read the full workspace158- access IDE or editor state159- persist changes through hooks or config files160161Summarise the blast radius clearly.162163### 9. Check reproducibility and integrity164165Assess:166167- whether a lockfile is present168- whether versions are pinned169- whether release tags match source170- whether install is reproducible without surprise network access171172### 10. Return a verdict173174Use this output shape:175176#### Summary177- Package:178- Source:179- Version:180- Risk: `Low | Medium | High | Reject`181182#### Key findings183- Top 3 risk drivers184185#### Red flags186- List the most important concerns187188#### Positive signals189- List trust-building signals190191#### Unknowns192- List anything not verified193194#### Recommended usage195- Safe install method, for example `npm install --ignore-scripts` first196- Isolation needed: `yes | no`197- Pin version or commit: `yes | no`198199### Verdict thresholds200201Use these thresholds when assigning risk:202203- `Low` — source and artifact are traceable, version is pinned, no suspicious install-time behaviour, and no meaningful exfiltration path is visible.204- `Medium` — one or more unknowns exist, but there is no direct evidence of hidden install-time execution or broad data exposure.205- `High` — strong risk signals exist, such as install-time scripts, broad filesystem or network access, unpinned dependencies, or partial artifact traceability, but the package is still reviewable.206- `Reject` — hidden install-time execution, untraceable artifacts, unexplained exfiltration or credential access, runtime remote code loading, or any behaviour that cannot be justified safely.207208## Default policies209210- Treat all extensions as untrusted code.211- Prefer pinned commits and no lifecycle scripts.212- Reject if traceability is unclear or install-time behaviour is hidden.213- Reject unexplained shell, network, or credential access.214215## JS-specific rules216217Only apply this section when the target is a JavaScript or TypeScript package.218219- Treat `package.json` scripts as executable code.220- Assume `npm install` can run arbitrary commands.221- Audit transitive dependencies if risk is above `Medium`.222- Flag dynamic code execution such as `eval` or `Function`.223- Flag unsanitised shell or file operations.224- Prefer deterministic installs with lockfiles.225226## Safe install procedure2272281. Inspect without execution:229 - `npm install --ignore-scripts`2302. Preview package contents:231 - `npm pack --dry-run`2323. Run in isolation:233 - container, VM, or low-privilege user234 - no secrets in environment2354. Only then enable normally.236237## Edge cases and fallback238239- If the manifest or equivalent entry file is missing, say so and raise risk.240- If the artifact is binary-only or built elsewhere, mark `artifact_traceability` as `unclear` unless source-to-artifact mapping is explicit.241- If the package is not JavaScript, skip the JS-specific rules and use the ecosystem's native manifest and build files instead.242- If a tool fails, report the failure and continue with direct file inspection rather than guessing.243- If version, tag, or commit is missing, request it before concluding.