DEV Community

Cover image for Is Piwaa Safe on LinkedIn? A Source-Code Audit of an Abandoned Extension
Michael Harris
Michael Harris

Posted on

Is Piwaa Safe on LinkedIn? A Source-Code Audit of an Abandoned Extension

The original Chrome Web Store listing for Piwaa—mirrored by Extpose and chrome-stats as of September 7, 2026—made an explicit safety claim:

"Piwaa behaves exactly like the standard LinkedIn messaging, the difference is in the interface and additional functionality that does not generate suspicious behavior with LinkedIn."

Standard LinkedIn messaging never intercepts the platform's security telemetry. Piwaa’s shipped code did.

A line-by-line static audit of Piwaa’s final build (v1.0.30, updated 2021-09-03) confirms a split verdict: its session handling was clean, but its telemetry blocking, Active Extension Detection (AED) footprint, and raw API access created significant detection exposure.

1. The Critical Flaw: Incomplete Telemetry Suppression

Piwaa attempted to hide by canceling outgoing browser reporting requests in initProtection (background.js:82205-82226):

- Conditional CSP Drop: Cancelled Sales Navigator violation reports containing an "sn" parameter before LinkedIn received them (background.js:82206-82213).

- Unconditional Drops: Cancelled four specific URL patterns outright (background.js:82214-82226):

  • platform-telemetry/cspf=l
  • lite/contentsecurity
  • uas/js/TXbEYyrcV7m5DbGr
  • sc/h/br/*

The Detection Mechanism: BrowserGate (the independent 2025–2026 investigation reverse-engineering LinkedIn’s JavaScript) documented that suppressing reporting endpoints creates a self-exposure pattern. A blocklist remains invisible only as long as it is 100% exhaustive.

Because Piwaa was abandoned in 2021, modern telemetry endpoints (li/track, /platform-telemetry/li/apfcDf, /apfc/collect, /sensorCollect, and li.protechts.net) remained unblocked. When one active endpoint reports to LinkedIn that adjacent telemetry has gone silent, the block pattern itself becomes an anomaly signal.

2. Tracing the Data Flow: What Shipped vs. What Leaked

The runtime audit reveals where Piwaa protected user data and where it left architectural traces:

- No Credential Theft (li_at): Checked only whether the li_at cookie existed to set a login boolean (background.js:51967-51980, 52134-52144). It never read, extracted, or transmitted li_at values.
- Local CSRF Extraction: Read JSESSIONID from document.cookie solely to populate standard csrf-token headers for same-origin requests (contentscript.js:1671-1679).
- Voyager API Calls (Request-Map Anomaly): Fired direct calls against private /voyager/ endpoints (voyager appears 80 times in code). Bypassing typical UI navigation generates API calls stripped of normal DOM assets, stylesheets, and neighboring tracking pings—a visible server-side footprint.
- DOM Injection: Injected a single messenger-header badge (renderPiwaaBagde, contentscript.js:1580-1604), creating an artifact inspectable by LinkedIn’s recursive DOM scanner (Spectroscopy).
- Profile Extraction: Contrary to its listing claim ("We do not store any data"), the extension extracted profile data via /voyager/api/me, packaged the user’s ID/name into an edfp payload, and sent scraped conversation results to piwaa-api.herokuapp.com (background.js:51205-51217).
- Remote Command Bridge: Listened to an 8-action command array (get_contact_infos, mark_all_items_as_seen, etc.) dispatched via its backend, turning the local client into an externally driven queue.
- No Synthetic Input Flags: The single .click() call (contentscript.js:1686) merely triggered a local attachment; it did not fake human clicks.

Audit Vector Recap

Check / Vector Risk Class Detection Consequence Evidence
li_at Session Handling Clean / Low None (value never accessed or uploaded) Code read
Telemetry / CSP Blocking High Incomplete suppression alerts neighboring endpoints Code read (background.js)
AED Extension Probe High LinkedIn detects installation before usage Match on Feb 2026 probe list (assets/32x32.png)
Direct Voyager API Calls Medium Request-map anomaly in server logs Code read (voyager string count: 80)
DOM Badge Injection Low Exposed to list-free Spectroscopy DOM sweeps Code read (contentscript.js)
Profile & Message Upload Privacy Risk Data egressed to vendor backend (now deleted) Code read (background.js:51205)
Remote Command Listener Medium Batch volume surges driven by external queue Code read (background.js:51560)
Abandoned Origin Critical Extension retains privileges to dead Heroku domain DNS / HTTP probes (Sept 2026)

Active Extension Detection (AED) Footprint

Piwaa’s extension ID (bkcibcjcbhgjoddeldfmgkbaipjkidpf) was placed on LinkedIn’s internal Active Extension Detection (AED) probe list.

LinkedIn’s silent in-page probe:

JavaScript

fetch("chrome-extension://bkcibcjcbhgjoddeldfmgkbaipjkidpf/assets/32x32.png")
Enter fullscreen mode Exit fullscreen mode

A fulfilled response emits an internal AedEvent to LinkedIn's servers, logging the extension as installed before any messaging action occurs. By February 2026, this probe list contained 6,167 entries.

Current Status: Why You Must Uninstall It

Chrome Web Store delisted Piwaa in August 2026 citing a "Minor Policy Violation." As of late August 2026, chrome-stats still recorded roughly 1,000 active installations.

If the extension remains in your browser, it retains elevated permissions:

  • webRequest, webRequestBlocking, cookies, tabs
  • Host access across linkedin.com/* and piwaa.com/*
  • contentscript.js running on
  • Hardcoded communication channels to orphaned domains (app.piwaa.com, piwaa-api.herokuapp.com)

Because the vendor backend no longer resolves, retaining an unmaintained extension with wide intercept privileges is a standing security liability. Remove it directly via chrome://extensions.

Architectural Contrast: Browser Extensions vs. Standalone Desktop

Piwaa highlights the inherent trade-offs of browser extensions. While it successfully kept the core session token (li_at) local, it remained constrained by the Chrome extension model: exposing a detectable Store ID to AED, leaving DOM injection artifacts, and using brittle network interception.

Standalone desktop engines like Linked Helper address these structural weaknesses by operating outside the Chrome Web Store model entirely:

- No Extension Footprint: Eliminates chrome-extension:// paths and Web Store IDs, removing the AED surface.
- Native Interface Emulation: Instead of executing naked Voyager API calls or patching network requests, it navigates pages inside an isolated browser instance using real hardware events (isTrusted: true), human-like typing delays, and organic mouse paths.
- Zero Telemetry Suppression: Avoids touching LinkedIn's security or CSP endpoints, bypassing the self-exposure traps of incomplete blocklists.
- Controlled Cloud Alternative: For 24/7 campaign execution, users can deploy the desktop engine on a private VPS paired with its Web Version, keeping session tokens completely off third-party vendor servers.

A tool's safety claim is only a hypothesis. The permissions, manifest boundaries, and shipped request handlers are the only facts that prove what it actually touches.

Top comments (0)