NavSentinel is a defensive browser extension. Its job is to make common navigation and credential-deception paths harder to execute quietly.
The most security-sensitive code lives in:
extension/src/content/main_guard.tsextension/src/content/capture_isolated.tsextension/src/content/credential_guard.tsextension/src/shared/domain.tsextension/src/shared/storage.tsextension/src/sw/sw.ts
- steady-state relaying uses a transferred
MessagePortscoped to the current document/frame rather than ordinary page-visible messages - challenge-response proves liveness and possession of the transferred port; it does not authenticate an isolated-world identity against hostile same-page code, so document-start ordering remains a mitigation and #175/#186 block beta
- per-document session and schema checks reject stale/cross-document traffic
- explicit inbound message-type allowlists
- replayable blocked actions with short-lived ids
- no authorization decision should rely on an arbitrary page-originated message
- popup and redirect allowance windows are time-limited
- blocked actions expire quickly
- rollback exists as a recovery path for suspicious committed navigations
- allowlists are site-scoped rather than global
- password submits are intercepted before dispatch completes
- risk and destination are evaluated before a blocked submit can resume
- trusted domains are stored locally and scoped to registrable domains
- paste warnings discourage silent use of saved secrets on untrusted surfaces
- local-only storage
- bounded event log retention
- normalization and migration of older key shapes
- event logging is best-effort because
chrome.storage.localis not transactional - domain normalization uses a build-time PSL snapshot; new TLDs require a data rebuild
- page-injected navigation/credential prompts currently expose protection- lowering actions to page-controlled placement and scripted activation. RI-01 blocks beta until injected UI is warn/cancel only and extension-origin UI owns every proceed/allow/trust/resume decision with tab/destination binding and TTL
- the release-eligible interaction-only profile has no reputation runtime,
asset, or claim. A deterministic 15-domain
.examplefixture remains only in the explicit unpacked research profile, which package and release checks reject - a browser extension cannot defend against a fully compromised browser or OS
If a bug could materially weaken the extension's protections, use the private vulnerability report instead of opening a public issue. GitHub private vulnerability reporting is enabled for this repository; the report and follow-up remain private to the reporter and repository maintainers until coordinated disclosure is appropriate.
When reporting, include:
- affected file paths
- reproduction steps
- expected and actual behavior
- whether the issue affects navigation protection, credential protection, or both