Security Alert: Confirmed Malware
CleanTab Refresh
ID: eehgpfplcneadgaphlmdgijmcelcbfgo
Supported Languages
Extension Info & Metadata
Publisher Contextual Analysis
- Author
- Bobbi EdrakeView Profile
- Privacy
- Privacy Policy
- MX records exist
- Yes
- Domain exists
- Yes
- Is disposable
- No
- Is role-based
- No
- Mailbox exists
- Yes
Refresh all your tabs in one click, no cache and no annoying popups!
CleanTab Refresh is the must-have Chrome extension for anyone who values fast and seamless browsing. With just one click, you can refresh all your open tabs without having to worry about cache issues or pesky "Do you want to leave?" popups. CleanTab Refresh supports keyboard shortcuts, including the "Ctrl+Shift+Q" combination for quick and easy tab refreshing. This powerful tool is designed to help you stay up-to-date with the latest information by instantly refreshing all your tabs. And with CleanTab Refresh, you won't have to deal with annoying alerts that interrupt your workflow. Whether you're working on multiple projects or browsing your favorite websites, CleanTab Refresh makes it easy to refresh all your tabs at once. And with its clean, intuitive interface, you'll be able to get started right away - no complicated setup required. Say goodbye to slow-loading pages and frustrating interruptions. Download CleanTab Refresh today and enjoy a smoother, more efficient browsing experience.
On each toolbar click, the extension enumerates every open tab with an unfiltered chrome.tabs.query({}) call and then injects a script into ALL frames of every tab using chrome.scripting.executeScript with allFrames: true. The currently injected function (Dc) only sets window.onbeforeunload = null, but the injection infrastructure combined with the <all_urls> host permission creates a powerful arbitrary code execution surface across the entire browser. Any update to the bundled function Dc could silently deploy malicious payloads to all open tabs without user awareness.
chrome.action.onClicked.addListener((async () => { await Zv(), chrome.action.setIcon({ ... }), await Yo(); const Hz = await chrome.tabs.query({}); for (const MU of Hz) { const Hz = MU.id; if (Hz) { try { await chrome.scripting.executeScript({ func: Dc, target: { tabId: Hz, allFrames: !0 } }) } catch (Hz) {} await chrome.tabs.reload(Hz, { bypassCache: !0 }) } }}))The entire background.js (~684 lines) is aggressively obfuscated using two-character meaningless variable names (Hz, MU, qG, Bz, Zv, Yo, Dc, KM, etc.) throughout all 16 bundled modules. This pervasive obfuscation is not consistent with legitimate tab-refresh functionality and is a classic technique used to hide malicious payloads from static analysis. The obfuscation pattern is applied uniformly and systematically, indicating deliberate intent to conceal code behavior.
! function() { function Hz(MU, qG, Bz) { function Zv(Dc, KM) { if (!qG[Dc]) { if (!MU[Dc]) { var Ds = "function" == typeof require && require; if (!KM && Ds) return Ds(Dc, !0); if (Yo) return Yo(Dc, !0); var ld = new Error("Cannot find module '" + Dc + "'"); throw ld.code = "MODULE_NOT_FOUND", ld } var RJ = qG[Dc] = { exports: {} }; MU[Dc][0].call(RJ.exports, (function(Hz) { var qG; return Zv(MU[Dc][1][Hz] || Hz) }), RJ, RJ.exports, Hz, MU, qG, Bz) } return qG[Dc].exports }A declarativeNetRequest rule is installed that modifies the Cache-Control request header to 'no-cache' on ALL URLs (urlFilter: '|*') for 7 resource types including main_frame, sub_frame, and script. While the header value itself seems benign, intercepting and rewriting headers on every HTTP request across all browsing activity far exceeds what a tab-refresh utility would need. This blanket header modification rule could be used to force cache misses that cause re-fetching of resources, or as groundwork for more advanced network manipulation.
async function Yo() { await chrome.declarativeNetRequest.updateSessionRules({ addRules: [{ id: 1, action: { type: "modifyHeaders", requestHeaders: [{ header: "Cache-Control", operation: "set", value: "no-cache" }] }, condition: { excludedInitiatorDomains: [chrome.runtime.id], urlFilter: "|*", resourceTypes: ["main_frame", "sub_frame", "stylesheet", "script", "image", "object", "media" ] } }] })}On every extension startup, a persistent UUID ('cid') is generated via uuid.v4() and stored in chrome.storage.local if one does not already exist. This creates a stable, cross-session user identifier. While no explicit exfiltration endpoint is visible in this code, persisting a unique client ID is a prerequisite for user tracking, and the identifier could be transmitted via the network header manipulation or script injection mechanisms present elsewhere in the extension.
async function KM() { const Hz = await chrome.storage.local.get(["cid"]); let { cid: MU } = Hz; return MU || (MU = (0, Bz.v4)(), chrome.storage.local.set({ cid: MU })), MU } ... KM()A recurring alarm fires every 60 seconds and calls Zv() which removes the active declarativeNetRequest rule. Combined with the click handler that re-installs the rule, this creates a rhythmic on/off cycle for the header-modification rule. The 1-minute heartbeat alarm keeping the service worker alive and continuously managing network rules is inconsistent with a simple tab-refresh utility and suggests the extension is designed for persistent background operation beyond its stated purpose.
chrome.alarms.create("cleanup", { periodInMinutes: 1}), chrome.alarms.onAlarm.addListener((() => { Zv(), chrome.action.setIcon({ path: { 128: "../icons/icon128.png", 48: "../icons/icon48.png", 16: "../icons/icon16.png" } })}))By severity
Versions scanned
Showing 1 of 3 scanned versions with more than one unique finding. Counts are unique findings that include each version.
| Extension Version | Code Review Findings |
|---|---|
| 1.0.0 | 5 |
Files with findings
1 distinct path — top paths by unique finding count:
- js/background.js5
URLs
View the external URLs this extension communicates with to understand its network activity and data interactions.
Gain full insight into all external connections.
Upgrade for full visibility.
Gain full insight into all external connections.
Upgrade for full visibility.
Code Diff
Compare extension code between any two versions.
No comparable text files found between these versions.
Browse and explore files within this extension package
Gain full insight into all external connections.
Upgrade for full visibility.