Probe Suite

v4.3.38 // Extension Behavior Analysis
SCANNING

πŸ“Š Overview Dashboard

Real-time extension behavior analysis toolkit

-
Extension Status
-
Service Worker
0
Tests Run
0
Findings
⚑ Quick Scan

Run a comprehensive scan to detect the Blocksi extension, probe its service worker, and enumerate its filtering behavior.

πŸ” Extension Detection

INFO Fingerprint the Blocksi extension using multiple detection vectors

🧬 Resource Probe

Attempt to load known extension resources to confirm installation.

πŸ“‘ API Detection

Check for chrome.runtime APIs and message channels.

πŸ•ΈοΈ Content Script Detection

Detect injected content scripts by scanning for known DOM mutations and event listeners.

πŸ’₯ Service Worker Stress Test

CRITICAL Overwhelm the service worker with concurrent requests to test resource exhaustion

🌊 Request Flood
0
Requests Sent
0
Errors
0ms
Elapsed

πŸ”— URL Manipulation Tests

HIGH Test URL parsing edge cases and authority masking vectors

🎭 URL Authority Masking

Test the @ symbol trick and other URL obfuscation methods.

πŸ”€ Redirect Chain

Test multi-hop redirect chains to see if intermediate hops bypass filtering.

πŸͺ† Iframe Nesting Tests

CRITICAL Test deep iframe nesting and content script injection boundaries

πŸ“¦ Iframe Flood (Dextensify-style)
0
Created
0
Loaded
0
Blocked
πŸ”— Deep Nesting Test

Create deeply nested iframe chains to test content script injection limits.

πŸ“‚ Category System Explorer

INFO Complete Blocksi v4.3.38 category taxonomy (extracted from source)

🏷️ 165 Categories · 9 Groups · 2 Tiers (Legacy + AI)

⏱️ Timing Analysis

HIGH Measure extension response times to identify race condition windows

πŸ“ˆ Filter Latency Probe

Measure the time between navigation and extension interception.

πŸ”„ SW Ping/Pong Latency

The extension uses a ping/pong mechanism with a 5-second timeout. Measure the actual response latency.

πŸ” Protocol & Scheme Tests

MEDIUM Test various URI schemes and protocol handlers for filter bypass

🌐 Scheme Probing

Test which URI schemes are intercepted by webRequestBlocking.

πŸ“¦ Data URI & Blob Tests

Test if data: and blob: URIs bypass content filtering.

🌐 Network Intelligence

HIGH Extracted server endpoints, WebSocket targets, and API credentials

πŸ–₯️ Extracted Server Infrastructure
ServiceEndpointProtocolPurpose
C2 Socketwss://k8s-ws-lb.blocksi.netWebSocketReal-time command & control
LiveKitwss://livekit.prod.blocksi.netWebSocketScreen share / conference
TURN Serverturn:webrtc.blocksi.net:3478TURN (UDP/TCP)WebRTC relay
Custom Logosstorage.googleapis.com/custom_extension_pages_files/HTTPSSchool branding assets
πŸ”‘ Extracted Credentials
TypeValueSource File
Datadog Client Tokenpub9615fc31c443ecb83a61b0a33e432aa2offscreen.js
TURN Usernameblocksioffscreen.js
TURN Credentialblocksioffscreen.js
Datadog Service Nameblocksi_extensionoffscreen.js
πŸ“‘ WebSocket Connectivity Test

πŸš€ Bypass Lab

Active exploit tests targeting confirmed weaknesses in Blocksi's filtering pipeline

🎯 #1 - about:blank Window Write HOT

How: Open about:blank in a new window, then use document.write() to inject content.
Why it works: webRequestBlocking never fires for about:blank (no HTTP request). The iframeObserver sees about:blank as top URL but only blocks iframes inside it, NOT the content written directly to the page body.
Content script injection: <all_urls> does NOT match about: scheme - content scripts won't inject.

🎯 #2 - data: URI Browser HOT

How: Create a full browsing interface as a data:text/html URI.
Why it works: webRequestBlocking cannot intercept data: scheme. Content scripts don't match data:. The page contains a URL bar and uses fetch to proxy content.
Limitation: CORS blocks most cross-origin fetches, but some APIs and pages with permissive CORS will work.

🎯 #3 - blob: URL Page HIGH

How: Create a blob: URL containing a full page with navigation interface.
Why it works: blob: URLs are session-scoped, opaque, and not interceptable by webRequest. Each blob URL is unique and unpredictable.

🎯 #4 - Google Translate Proxy HIGH

How: Use Google Translate's web proxy to load blocked pages through translate.google.com.
Why it works: Google Translate is typically whitelisted for education. It proxies the entire page content through Google's servers, so the actual domain never appears in webRequest.
Key: Content scripts ARE excluded for docs.google.com per manifest exclude_matches. Google Translate may or may not be excluded.

🎯 #5 - Service Worker Exhaustion HOT

How: Flood the service worker until it can't respond to its own ping within 5s, triggering chrome.runtime.reload().
Why it works: During SW reload, ALL filtering (webRequest handlers) are temporarily deregistered. The filtering gap lasts 1-3 seconds.
Enhanced: Uses blockPage.html?source=contentScript which contains its own SW ping+reload mechanism, amplifying the attack.

🎯 #6 - Sandboxed iframe (No Content Scripts) MEDIUM

How: Create an iframe with sandbox="allow-scripts" but WITHOUT allow-same-origin.
Why it works: Without same-origin, the frame is treated as a unique opaque origin. Content scripts cannot inject into it. However, webRequest may still block the network request.

🎯 #7 - Whitelisted Domain Piggybacking MEDIUM

How: Content scripts are EXCLUDED from certain domains (see manifest). Navigate through whitelisted domains.
Excluded domains: *.sharepoint.com, *.office.com, *.officeapps.live.com, *.office365.com, docs.google.com
Key insight: These domains have a separate content script config with all_frames: true but different behavior.

🎯 #8 - iframe Observer Timing Race HIGH

How: The iframeObserver delays 100ms on popstate/hashchange before re-checking. Rapidly mutate iframe src to exploit the gap.
Code: window.addEventListener("hashchange", () => setTimeout(() => P(), 100))
Key: The function P() is async and awaits chrome.runtime.sendMessage - there's a gap between the hash change and the filtering response arriving.

πŸ”₯ Fragment Injection (CONFIRMED)

CRITICAL Unescaped # in redirect URL causes blockPage query parameter truncation

πŸ’€ Vulnerability Summary

Root Cause: background.js does NOT encodeURIComponent() the blocked URL before injecting it into the redirect to blockPage.html?url=....
Impact: If a blocked URL contains # (e.g. discord.com/#/...), the browser treats everything after # as the block page's own fragment - all subsequent query parameters (filter, type) are lost.
Code Path: blockPage.js -> new URL(window.location.href).searchParams -> only sees params before #
Confirmed: βœ… You verified this - block page for discord.com/#/... is missing "Access Denied By: Url Filter" because filter param is truncated.

πŸ§ͺ Fragment Payload Generator

Generate URLs with fragment payloads to test the block page parameter truncation.

Γ°ΕΈβ€œ Block Page URL Anatomy

Shows how the block page sees the URL with vs without fragment injection.

πŸ“‹ Intelligence Dump

INFO Complete reverse-engineered message protocol and system architecture

πŸ’¬ Message Protocol (90+ types)

All chrome.runtime message types extracted from the extension source.

Γ°ΕΈβ€”Γ―ΒΈ Document Senders/Receivers
IDRoleFile
contentScriptContent injection & DOM monitoringcontentScript.js
serviceWorkerCentral hub, filtering, policybackground.js
offscreenSocket I/O, NSFW check, WebRTCoffscreen.js
blockPageBlock page UI & access requestsblockPage.js
warningPageWarning page with consentwarningPage.js
lockdownPageFull lockdown overlaylockdownPage.js
headsupPage"Heads Up" attention pageheadsupPage.js
assessmentPageAssessment/exam modeassessmentPage.js
hallPassActivePageHall pass timerhallPassActivePage.js
castPageTeacher screen broadcastcastPage.js
conferencePageLiveKit video conferenceconferencePage.js
chatPageStudent-teacher chatchatPage.js
classJoinPageClass enrollmentclassJoinPage.js
enforcePageWhitelist-only modeenforcePage.js
bedtimePageBedtime lockoutbedtimePage.js
Γ’Ε‘Β Γ―ΒΈ Key Vulnerability Vectors
VectorSeverityDescription
πŸ”₯ Fragment InjectionCRITICALUnescaped # in redirect URL truncates blockPage query params (filter, type). Confirmed: background.js does NOT encode # before building blockPage.html?url=
πŸ”₯ Block Page Param LossCRITICALblockPage.js uses new URL(location.href).searchParams - params after unescaped # are lost. 'filter' and 'type' vanish, breaking display logic
SW Ping TimeoutCRITICAL5s timeout -> chrome.runtime.reload() if SW unresponsive
Iframe Observer RaceCRITICALMutationObserver + async GET_FILTERING_RESULT has timing gap
Warning Page ConsentHIGHADD_TO_BW_LIST_FROM_STUDENT -> SW whitelist. warningPage 'Yes' click sends consentUrl from query param, then navigates to it
Offscreen DocumentHIGHSingle offscreen doc handles socket + NSFW + WebRTC - DoS target
Hardcoded TURN CredsHIGHUsername/password "blocksi"/"blocksi" in cleartext
Datadog Token LeakMEDIUMpub9615fc31c443ecb83a61b0a33e432aa2 exposed client-side
GCS Logo URLMEDIUMPredictable storage path for school branding
Click TrackingINFOEvery click on ext pages fires EXT_PAGE_CLICK to SW