CleanTab Refresh

ID: eehgpfplcneadgaphlmdgijmcelcbfgo

Could be malicious

Supported Languages

🇺🇸English

Extension Info & Metadata

Status
Removed
Version
1.0.0
Size
0.04 MB
Rating
5.0/5
Reviews
15
Users
5,210
Type
Extension
Updated
Mar 18, 2023
Category
7_productivity
Price
Free
Featured
No
Visibility
Listed
Mature
No
By Google
No
Trusted
Yes

Publisher Contextual Analysis

Trusted
Author
Bobbi EdrakeView Profile
MX records exist
Yes
Domain exists
Yes
Is disposable
No
Is role-based
No
Mailbox exists
Yes
Total Extensions
1
Active
0
Obsolete
1
Listed
1
Unlisted
0
Total Users
5,210

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.

Item
Type
Severity
Description
scripting
Permission
Critical
This permission allows injection and execution of JavaScript on any webpage. Rated Critical because it can modify page content, steal sensitive data, and inject malicious code into any site the extension has access to.
declarativeNetRequest
Permission
Critical
This permission allows the extension to define rules to block, redirect, or modify network requests. Rated Critical because it can control all network traffic, potentially blocking security updates or redirecting to malicious sites.
<all_urls>
Host
Critical
Broad host access — the extension can read/modify content on every website.
Broad Host Permissions
Risk Factor
High
This extension has broad host permissions allowing it to access many or all websites.
Broad Content Script Access
Risk Factor
High
This extension can inject scripts into any website.
storage
Permission
Medium
This permission allows storing data locally in the browser. Rated Medium because it can persist sensitive user data, track user activities over time, and potentially store malicious payloads.
alarms
Permission
Low
This permission schedules periodic tasks. Rated Low because it can only trigger events at specified times without access to sensitive data.

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.

js/background.js (Line 647)
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.

js/background.js (Line 1)
! 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.

js/background.js (Line 604)
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.

js/background.js (Line 628)
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.

js/background.js (Line 637)
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

Critical1
High2
Medium2
Low0

Versions scanned

Showing 1 of 3 scanned versions with more than one unique finding. Counts are unique findings that include each version.

Extension VersionCode Review Findings
1.0.05

Files with findings

1 distinct path — top paths by unique finding count:

  • js/background.js5
S.No.
Category
Severity
File
Summary
Found in Version
1Code Injection
critical
js/background.js (line 647)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: …
2Network Interception
high
js/background.js (line 604)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 v…
3Obfuscation
high
js/background.js (line 1)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 n…
4Other
medium
js/background.js (line 637)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 head…
5Tracking
medium
js/background.js (line 628)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 explici…
URLs
2
IPv4
0
IPv6
0

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.

github.com/uuidjs/uuidhttps://github.com/uuidjs/uuid#getrandomvalues-not-supported
clients2.google.com/service/update2/crxhttps://clients2.google.com/service/update2/crx

Gain full insight into all external connections.

Upgrade for full visibility.

No IP addresses found
Showing 1 to 3 of 10 rows
Rows per page:

Code Diff

Compare extension code between any two versions.

0 changed files (scanned top 25 shared text files)

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.