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")
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)