Security Verdict: SAFE
After analyzing 90 files containing 64,670 lines of code, this audit confirms that SN Utils does NOT phone home or transmit data to external servers.
Network Communication
| External HTTP/HTTPS | 0 calls |
| ServiceNow API (relative) | 41 calls |
| WebSocket (localhost only) | 1 call |
| sendBeacon / EventSource | 0 calls |
| RTCPeerConnection | 0 calls |
Code Execution Vectors
| eval() | 0 (excl. Monaco) |
| new Function() | 0 (excl. Monaco) |
| Remote script loading | 0 |
| Dynamic script.src (local) | 6 |
| innerHTML/insertAdjacentHTML | DOMPurify sanitized |
Content Security Policy (manifest.json:112)
Key finding: The connect-src directive explicitly restricts ALL network connections to only ServiceNow domains and localhost:1978 WebSocket. This is browser-enforced and cannot be bypassed by extension code.
Only External-Looking Connection: WebSocket to Localhost
Connects to VS Code extension "sn-scriptsync" running on the same machine for live code editing
127.0.0.1 is localhost - never leaves your machine. Requires VS Code extension running locally.
Audit Methodology
Patterns Searched (Regex)
Network APIs
fetch\s*\(XMLHttpRequest|new\s+XMLHttpRequestWebSocket|new\s+WebSocketnavigator\.sendBeaconEventSource|new\s+EventSourceRTCPeerConnection
URLs & Domains
https?://wss?://\.com|\.net|\.org|\.io
Code Execution
eval\s*\(new\s+Function\s*\(createElement\s*\(\s*['"]script\.src\s*=import\s*\(
Suspicious Names
tracking|analytics|beacontelemetry|ping|reportupload|sync|phone|sendatob|btoa
Clone Repository
Cloned from github.com/arnoudkooi/SN-Utils for local analysis
Enumerate All Files
Found 90 source files (JS, HTML, JSON, CSS) totaling 64,670 lines
Run Pattern Searches
Used ripgrep to search all patterns across entire codebase with line numbers and context
Manual Code Review
Read each flagged line with surrounding context to determine actual behavior
Classify All URLs
Every URL categorized as: ServiceNow relative, localhost, extension local, or external link
Verify Manifest Permissions
Analyzed all 6 manifest variants (Chrome, Firefox, Edge, Safari, On-prem)
Audit Third-Party Dependencies
Verified all 8 bundled libraries are local copies with no CDN loading
Complete File Inventory (90 files)
Core Extension Files (16 files, 12,541 lines)
Supporting JS Files (js/ directory)
Bundled Libraries (All Local - No CDN)
HTML Files (10 files)
- popup.html
- scriptsync.html
- codesearch.html
- codeeditor.html
- diff.html
- viewdata.html
- sidepanel.html
- snippets.html
- settingeditor.html
- welcome.html
Manifest Files (6 variants)
All Network Calls with Context
fetch() Calls (38 total) All to ServiceNow or local
... and 34 more fetch() calls, all following the same pattern: relative URLs to ServiceNow APIs or local extension files.
XMLHttpRequest (3 total) All to ServiceNow
WebSocket (1 total) Localhost only
127.0.0.1 is localhost - this connection never leaves your machine. It's for communicating with the VS Code "sn-scriptsync" extension for live code editing.
Security: Instance URL Validation safeFetch wrapper
Security control: This wrapper validates that all API requests in scriptsync only go to user-approved ServiceNow instances. URLs must be explicitly added to the allowlist by the user.
Chrome Storage & Extension APIs
chrome.storage.sync Usage
Syncs via user's Chrome/Firefox account - standard browser feature, not external telemetry
| Key | Purpose | Sensitive? |
|---|---|---|
| changelog_seen_version | Tracks which changelog user has seen | No |
| snusettings | User preferences (UI options) | No |
| instancetag | Instance color/label settings | No |
| {instance}-slashcommands | Custom slash commands per instance | No |
chrome.storage.local Usage
Local only - does NOT sync externally
| Key | Purpose |
|---|---|
| popupSize | Remember popup window dimensions |
| scriptsyncinstances | Allowed/blocked instance URLs for scriptsync |
| synctab | Tab ID for scriptsync helper |
Manifest Permissions Analysis
Chrome Manifest Permissions
✓ Minimal permissions. Host access limited to ServiceNow domains only.
On-Prem Manifest Note
The on-prem version uses <all_urls> and *://*/* because on-premises ServiceNow instances use custom domains (not *.service-now.com). This is expected and documented in PRIVACY.md.
All Search Patterns & Results
fetch\s*\(
38 matches - all safe
All fetch calls use relative URLs to ServiceNow or chrome.runtime.getURL()
new XMLHttpRequest
3 matches - all safe
All XHR calls use relative URLs to ServiceNow APIs
new WebSocket
1 match - localhost only
Single WebSocket to ws://127.0.0.1:1978 for VS Code integration
sendBeacon|EventSource|RTCPeerConnection
0 matches
No tracking beacons, SSE, or WebRTC found
eval\(
0 matches (excluding Monaco)
No eval() in extension code. Monaco editor has standard eval for code execution.
tracking|analytics|telemetry|beacon
0 suspicious matches
Found in ServiceNow table names (sys_report) only, not telemetry code
createElement('script')
6 matches - all local
All use chrome.runtime.getURL() or snusettings.extensionUrl for local files