DEV Community

Cover image for “Is GetProspect Safe?” Is the Wrong Question
Michael Harris
Michael Harris

Posted on

“Is GetProspect Safe?” Is the Wrong Question

Asking whether a LinkedIn extension is simply "safe" or "unsafe" collapses three separate architectural layers into a single, misleading binary: session custody, platform detectability, and scraped-data governance.

GetProspect passes the session-security test while exposing its users to measurable LinkedIn detection signals. Separately, it transmits the professional data it gathers to third-party servers.

Below is a technical teardown of the shipped GetProspect Chrome extension (bhbcbkonalnjkflmdkdodieehnmmeknp, build v6.2.13, released 2026-05-29, audited 2026-06-11). The verdict is Medium Risk—defined not by an arbitrary score, but by how the code separates local credentials from external data flows.

1. Permissions: The False Reassurance

GetProspect’s host_permissions manifest key lists only:

  • https://*.getprospect.com/
  • http://localhost/*

LinkedIn is nowhere on the list. A shallow inspection of the permission dialog might lead an auditor to believe the extension cannot interact with LinkedIn.

json
// manifest.json extract
"content_scripts": [{
  "matches": ["https://*[.linkedin.com/](https://.linkedin.com/)*"],
  "js": ["foreground.bundle.js"],
  "run_at": "document_end"
}]
Enter fullscreen mode Exit fullscreen mode

A declared content_scripts entry executes foreground.bundle.js directly within every LinkedIn page context. Furthermore:

  • externally_connectable enables cross-origin communication between GetProspect web properties (or localhost) and the extension.
  • An offscreen document supports background tasks without an open UI tab.

Neither setting constitutes an active detection signal on its own, but they demonstrate why reading host_permissions in isolation is a flawed audit shortcut.

2. The Layer GetProspect Clears: Local Session Custody

GetProspect avoids the credential-handling pitfalls common to cloud scrapers:

  • Zero Session Extraction: No cookies permission is requested, the li_at authentication cookie is never read or stored, and there is no cookie-jar harvest routing sessions to vendor servers.
  • Local CSRF Extraction: JSESSIONID is read via document.cookie purely to set the csrf-token header on same-origin requests dispatched from the user's active tab. Shipped source contains 9 JSESSIONID, 27 csrf, and 4 document_cookie occurrences (static string counts).
  • Native Fingerprinting: Because every request originates from the operator’s physical browser, the 48-point client browser fingerprint (APFC/DNA) aligns naturally with the connection. There is no parallel session, geographic jump, or headless browser mismatch.
  • No Telemetry Tampering: declarative_net_request is empty. The extension does not attempt to drop or block LinkedIn tracking calls, avoiding the self-exposure vector where silencing telemetry flags an incomplete blocklist.

Because no session is hosted on external infrastructure, a cloud exit-IP test is architecturally inapplicable. There is no vendor proxy pool, datacenter IP, or ASN mismatch to measure on LinkedIn's end.

3. The Detection Layer: Local Does Not Mean Invisible

While session custody is sound, the extension exposes multiple client-side inspection surfaces:

Active Extension Detection (AED)
GetProspect's extension ID (bhbcbkonalnjkflmdkdodieehnmmeknp) is a target entry in LinkedIn’s client-side AED scanner under the label "Email Finder - GetProspect".

As documented by BrowserGate and Linked Helper's security study (spanning static reviews of 16 extensions and live tests of 7 cloud engines), LinkedIn's production bundle silently fires probe requests on page load:

JavaScript
fetch("chrome-extension://bhbcbkonalnjkflmdkdodieehnmmeknp/assets/img/extension/icon16.png")
Enter fullscreen mode Exit fullscreen mode

A successful response triggers an internal AedEvent telemetry log. While LinkedIn's probe list grew from 5,459 entries in December 2025 to 6,167 by February 2026 (~12 new additions daily), v6.2.13 declares zero web_accessible_resources (war_count: 0). Consequently, static analysis cannot confirm whether this specific asset probe currently succeeds.

However, LinkedIn's separate DOM-wide Spectroscopy scanner sweeps page elements for uncatalogued chrome-extension:// strings without relying on a target list.

Voyager Direct Calls & Request-Map Anomalies
The content script invokes LinkedIn's internal endpoints directly (foreground.bundle.js:2737, :2848), containing 30 voyager and 9 graphql string occurrences.

When a human views a profile, the browser loads stylesheets, images, tracking scripts, and prefetch assets alongside profile data. Direct programmatic calls to Voyager endpoints bypass this surrounding request ecosystem, creating a measurable request-map anomaly in LinkedIn's server-side logs.

Synthetic DOM Events (isTrusted: false)
The code includes 9 synthetic-event and 5 programmatic-click patterns (new MouseEvent, dispatchEvent, .click()).

In modern browsers, programmatic content-script dispatches produce events with isTrusted: false, which client-side JavaScript cannot forge without exposing yellow native debugger banners via chrome.debugger.

4. Automation Guardrails: What the Code Actually Enforces

Vendor marketing positions the extension as self-regulating:

"The extension enforces LinkedIn's daily limits automatically, stopping when the threshold is reached..."
"GetProspect protects the account from being banned."

The shipped code does not support this level of behavioral defense:

  • Controls Present: interval: 13 (unbounded), plus three fixed delays of 0ms, 160ms, and 320ms.
  • Controls Absent: No randomized delay distributions, no automated daily limits, no working-hours scheduler, and no gradual warm-up ramping.

GetProspect is not an outreach sender—it does not automate connection invites, direct messages, skill endorsements, or profile follows. The practical behavioral concern is raw Voyager query frequency rather than connection request volume.

5. Data Egress vs. Platform Detection

Data extraction logic routes scraped information off the machine:

LinkedIn cannot monitor external outbound traffic to vendor endpoints, meaning data egress does not act as an account restriction trigger. Instead, this represents a governance and privacy boundary: candidate/prospect PII moves to a third-party processor, while bulk scraping remains governed by LinkedIn User Agreement 8.2.

Audit Vector Summary

Vector / Component Classification Operational Finding Audit Verification
li_at Extraction Clean / Low Risk Zero token reads or remote exports Source analysis (manifest.json, script bundles)
Fingerprint Mismatch Clean / Low Risk Identical client fingerprint (runs locally) Direct origin tracing
Telemetry Suppression Clean / Low Risk declarative_net_request is null; pings unmodified Manifest audit
AED Listing Medium Risk ID listed in LinkedIn production probe array Cross-checked against Feb 2026 probe list
Direct API Writes Medium Risk Direct Voyager calls strip typical page-load telemetry Static call-site analysis (foreground.bundle.js)
Event Trust Flag Medium Risk Programmatic clicks dispatch with isTrusted: false Event construction review
Rate-Limiting Controls Medium Risk Fixed millisecond delays; missing dynamic daily caps Configuration object review
Data Transmission Compliance Risk Scraped PII leaves browser for vendor infrastructure API payload mapping

Practical Takeaway

GetProspect keeps the core session token local, avoiding the parallel-session flags and IP reputation mismatches that penalize cloud-hosted scrapers.

However, local session retention does not make an extension invisible. Running within the page context means interacting with LinkedIn's behavioral scoring models: AED indexing, synthetic DOM dispatches, and isolated Voyager queries contribute cumulative risk signals.

Auditing outreach tooling requires evaluating data-flow boundaries and execution contexts rather than relying on permission dialog summaries.

The full line-by-line audit is available at safe-outreach.com/is-getprospect-safe.

If this kind of teardown is useful, subscribe. I take apart a different tool each time.

Top comments (0)