Is Desktop companion app for Dynamics 365 Contact Center safe?
We analyzed Desktop companion app for Dynamics 365 Contact Center version 1.1.0.9's actual code and gave it a 45/100 trust score. The extension has…
Bottom line
The extension has legitimate contact-center functions but exposes powerful desktop access to every HTTPS website.
What it can access
It runs on every HTTPS website, communicates with a desktop app, and handles recordings and large file transfers for its stated purpose.[Q1][Q5][Q15][Q19]
Security weaknesses
Any HTTPS website can send requests through the extension to the desktop app because the bridge lacks origin checks and command restrictions.[Q16][Q21]
Signs of misuse
The package shows telemetry and purpose-related recording uploads, but no clear evidence of spying, credential theft, remote code execution, or unrelated misuse.[Q6][Q7][Q14][Q23]
Code findings
What access does this extension ask for, and does that access make sense for what it claims to do?
Its packaged page access runs automatically in the top-level frame of every HTTPS site and the extension has native-messaging access.
Matches https://*/* and declares nativeMessaging and offscreen permissions. — manifest.json:21-29
Initializes the page-message bridge in each top-level matched page. — content-script.js:1
Which websites can it run on, and can it read or change what appears on those pages?
No evidence of this behavior was found in the reviewed package.
Listens for structured window messages and reads location.hostname, without querying or serializing page content. — content-script.js:1
Can it see sensitive information you type, such as passwords, payment details, messages, or form entries?
The bridge carries contact-center session messages, file-transfer metadata, and screen-recording data between a page and the desktop app.
Forwards page request objects to the extension and relays native responses back to the page. — content-script.js:1
Handles file transfer, video chunks, session events, and native-host request/response routing. — service-worker.js:1
Can it access private browser data such as cookies, signed-in sessions, browsing history, bookmarks, or downloads?
No evidence of this behavior was found in the reviewed package.
Requests only nativeMessaging and offscreen permissions. — manifest.json:27-29
Can it access anything else on your device, such as files, location, camera, microphone, clipboard, or installed applications?
It supports large file and screen-recording transfers through an offscreen document and the native desktop app.
Routes initFileTransfer, sendFileChunk, fileTransferComplete, and VIDEO_CHUNK messages. — service-worker.js:1
Buffers transfers up to 5 GB and uploads completed data to the configured Dataverse host. — offscreen.js:2
Does it send information outside your browser? If so, what information is sent, where does it go, and why?
It sends operational telemetry to Microsoft and uploads user-initiated contact-center recording data to the configured Dataverse service.
Initializes Microsoft Aria telemetry collectors and applies a PII/token redaction routine to logged custom properties. — content-script.js:1
Uses OData requests to initialize and complete recording uploads to the session's Dataverse host. — offscreen.js:2
Does it download or run code, settings, or instructions supplied by a remote server?
No evidence of this behavior was found in the reviewed package.
Accepts baseUrl, organizationId, and clientSessionId as session context rather than executable configuration. — content-script.js:1
Can it take actions without a clear user request, such as opening pages, redirecting searches, downloading files, or sending requests?
The bridge and native-host connection initialize automatically when the extension and matched pages load.
Registers its page listener and opens a runtime port automatically in each top-level HTTPS page. — content-script.js:1
Connects to com.dynamics.vca and creates the offscreen transfer document at service-worker startup. — service-worker.js:1
Can it change important browser settings, including your proxy, search engine, homepage, privacy settings, or other extensions?
No evidence of this behavior was found in the reviewed package.
Does not request browser settings, proxy, or search-provider permissions. — manifest.json:27-29
Is any important behavior difficult to inspect because the code is hidden, heavily obfuscated, dynamically generated, or supplied by third parties?
The main scripts are large minified bundles, but names and message flows remain identifiable and minification is not evidence of abuse.
Contains a minified production bundle with readable telemetry and bridge symbols. — content-script.js:1
Contains a minified production bundle with readable native-host and transfer logic. — service-worker.js:1
Does it use eval(), new Function(), or string-based timers to turn text into executable code?
No evidence of this behavior was found in the reviewed package.
No dynamic JavaScript execution sink was found in the page bridge. — content-script.js:1
Native messages are serialized objects, not evaluated as JavaScript. — service-worker.js:1
Does it track the websites, pages, searches, or links you visit?
No evidence of this behavior was found in the reviewed package.
Reads window.location.hostname after a non-embedded session context is set and sends it to the service worker. — content-script.js:1
Caches the hostname by organization and client-session ID for file-transfer initialization. — service-worker.js:1
Does it create a persistent ID or browser fingerprint to recognize you?
It processes organization, client-session, transaction, transfer, user, and telemetry identifiers.
Accepts organizationId, clientSessionId, baseUrl, and transaction IDs from page session messages. — content-script.js:1
Routes native responses by organization and client-session IDs and emits a unique telemetry identifier. — service-worker.js:1
Does it send cookies, session details, authentication data, or page contents elsewhere?
No evidence of this behavior was found in the reviewed package.
Does not request cookies permission. — manifest.json:27-29
An extension-directed OData request uses credentials include, but the code does not read or export the credential value. — content-script.js:1
Does it record typing, form entries, clipboard contents, or screenshots?
It transfers screen-recording video chunks for the advertised contact-center function; no keylogging was found.
Relays VIDEO_CHUNK requests to the embedded contact-center frame and returns the response. — content-script.js:1
Routes screen-recording chunks between the desktop app, page bridge, and offscreen uploader. — service-worker.js:1
Can a website or remote server send commands that make the extension take actions?
Any top-level HTTPS page can supply structured requests that the extension forwards to the desktop companion; harmful command acceptance by that app was not demonstrated.
Accepts MESSAGE_TO_VCA page messages without checking event.origin, source identity, or a site allowlist. — content-script.js:1
For request messages received over a content-script port, directly posts the supplied object to com.dynamics.vca. — service-worker.js:1
Does it alter links, referral codes, advertisements, shopping carts, or search results?
No evidence of this behavior was found in the reviewed package.
Uses postMessage and extension messaging without DOM mutation APIs for the host page. — content-script.js:1
Does it redirect or modify web traffic, request headers, downloads, or proxy settings?
It performs Dataverse OData requests and multi-gigabyte recording uploads as part of the advertised companion workflow.
Initializes, chunks, retries, and completes file uploads to a session-selected HTTPS host. — offscreen.js:2
Executes extension-directed OData POST requests and returns status/data to the offscreen workflow. — content-script.js:1
Can it communicate with software on the computer or services running on localhost?
It has a live native-messaging connection to the local com.dynamics.vca desktop host.
Declares nativeMessaging permission. — manifest.json:27-29
Calls chrome.runtime.connectNative('com.dynamics.vca'), forwards requests, and receives native events and responses. — service-worker.js:1
Does it decode, decrypt, or unpack hidden data and then execute or inject it?
No evidence of this behavior was found in the reviewed package.
Forwards message objects without evaluating them as code. — content-script.js:1
Routes native message types through fixed extension logic rather than loading executable modules. — service-worker.js:1
Can ordinary websites access privileged extension features through messaging or exposed files?
A confirmed unrestricted page bridge lets any top-level HTTPS site reach extension and native-app messaging without origin authentication.
Injects the bridge on all HTTPS sites and grants native messaging. — manifest.json:21-29
The window message listener checks only data.direction === 'MESSAGE_TO_VCA'; it never validates event.origin or restricts the current hostname. — content-script.js:1
Accepts request messages from every connected content-script port and forwards them to the native host without a command allowlist. — service-worker.js:1
Does suspicious behavior activate only for certain users, websites, dates, or remote settings?
No evidence of this behavior was found in the reviewed package.
Native access fails when com.dynamics.vca is absent, while event/response routing requires organizationId and clientSessionId. — service-worker.js:1
The page itself supplies the organization and client-session identifiers used to create the routing context. — content-script.js:1
Does it perform hidden resource-intensive work, such as cryptocurrency mining?
No evidence of this behavior was found in the reviewed package.
Background work is native messaging, telemetry, and recording/file-transfer orchestration. — service-worker.js:1
Does it change form fields or where a form sends its information?
No evidence of this behavior was found in the reviewed package.
Contains no form/input queries or mutations; the exposed surface is the page-message bridge. — content-script.js:1