PageImprove by Semrush

ID: cbllkmdbdpmfbodkeljlikmgfjpobbdi

Could be malicious

Supported Languages

🇺🇸English

Extension Info & Metadata

Status
Removed
Version
0.0.101
Size
2.49 MB
Rating
2.9/5
Reviews
22
Users
20,000
Type
Extension
Updated
Jan 31, 2024
Category
Productivity Tools
Price
Free
Featured
No
Visibility
Unlisted
Mature
No
By Google
No
Trusted
No

Publisher Contextual Analysis

Author
https://www.semrush.comView Profile
Country
US
MX records exist
Yes
Domain exists
Yes
Is disposable
No
Is role-based
No
Mailbox exists
Yes
Address
800 Boylston St Suite 2475 Boston, MA 02199-8051 US
Website
Visit
Total Extensions
1
Active
0
Obsolete
1
Listed
0
Unlisted
1
Total Users
20,000

Bypass the bottleneck and make simple, reversible SEO changes with PageImprove.

Improve your website's SEO directly from your browser. Edit canonicals, H1, links, titles, metadata, and more with our browser extension. PageImprove is perfect for you if… + You often need to update hundreds of pages of your e-commerce website or a marketplace + You wait weeks or months for SEO implementation because developer resources are limited + Your CMS is difficult to update How to use PageImprove To use PageImprove, you need to be registered with Semrush. + Download the Chrome extension and install a 5kb javascript snippet. + Update canonicals, image “alt” tags, meta tags, links, and more. + Update titles and descriptions on multiple pages at once. + Publish the changes. Once you do that, PageImprove immediately deploys them and make them visible to visitors and bots. To make permanent changes on the back end, export a CSV file with the changes you published and send it to your developers. Does PageImprove work with every kind of website? PageImprove does not work with websites built on Shopify and we do not recommend using PageImprove on websites based on frameworks like Angular, VueJS, or NextJS because of potential conflicts. What is Semrush? Semrush is a leading digital marketing toolkit for SEO, PPC, SMM and content marketing professionals worldwide. With over 40 tools within the software, search data for 140 countries and seamless integration with Google services, Semrush provides solutions for in-house marketing teams and agencies working with clients in any industry.

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.
http://*/*
Host
Critical
Broad host access — the extension can read/modify content on every website.
https://*/*
Host
Critical
Broad host access — the extension can read/modify content on every website.
Contextual Risk Factors
Risk Factor
High
The following context increases the overall risk:• 10% increase: Early script execution enables pre-emptive content manipulation
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.
activeTab
Permission
Medium
This permission grants temporary access to the current tab. Rated Medium because it can access current page content when invoked, though limited to user-initiated actions.
tabs
Permission
Medium
This permission enables tab management and monitoring. Rated Medium because it can track open tabs, access tab metadata, and monitor user browsing patterns.
Early Content Script Execution
Risk Factor
Medium
This extension runs content scripts at document_start.

The extension claims full host access to every http(s) site and injects a content script into every frame at document_start. Combined with chrome.scripting.executeScript and tabs permission, it can read or modify any page the user visits before page scripts run. This is the maximum possible web-content privilege an MV3 extension can hold and is the core driver of the high ML risk score.

manifest.json (Line 42)
{  "content_scripts": [    {      "matches": [        "http://*/*",        "https://*/*"      ],      "js": [        "contentInjector.js"      ],      "css": [        "assets/fonts/include-font.css"      ]    },    {      "matches": [        "http://*/*",        "https://*/*"      ],      "all_frames": true,      "run_at": "document_start",      "js": [        "contentPageRuntimeInjector.js"      ]    }  ],  "host_permissions": [    "http://*/*",    "https://*/*"  ],  "permissions": [    "storage",    "scripting",    "activeTab",    "tabs"  ]}

The background service worker exfiltrates user-level analytics (user_id, device_id, event properties) to Amplitude on both the /identify and /2/httpapi endpoints with an embedded API key. The device_id is persisted in chrome.storage.local under the _ampl key, providing stable cross-session tracking of users.

background.js (Line 6831)
var Na = "https://api.amplitude.com/2/httpapi",  $a = "https://api.amplitude.com/identify",  ...  key: "sendUserProperties",  value: function(t) {    var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "set",      r = JSON.stringify([{        user_id: Le(this.userId),        device_id: this.deviceId,        user_properties: n({}, "$" + e, t)      }]);    return fetch($a, {      method: "POST",      headers: {        Accept: "application/json"      },      body: "api_key=".concat(this.apiKey, "&identification=")        .concat(encodeURIComponent(r))    }), this  }}, {  key: "logEvent",  value: function(t) {      var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};      return fetch(Na, {        method: "POST",        ...        body: JSON.stringify({          api_key: this.apiKey,          events: [{            event_type: t,            user_id: Le(this.userId),            device_id: this.deviceId,            event_properties: e          }],          options: {            min_id_length: 1          }        })      })

The same Google Analytics event payload (with persistent client id stored in chrome.storage.local under _ga, plus optional Semrush user id 'uid') is duplicated to a third-party endpoint at google-analytics.bi.owox.com. OWOX is a BigQuery data-pipeline vendor; piping GA hits to a non-Google host means user activity is also flowing into a third-party data warehouse beyond the disclosed 'Semrush analytics' surface.

background.js (Line 6955)
logEvent: function(e, r, n, o) {  return Va.getClientId()    .then((function(i) {      var u = {        method: "POST",        headers: {          contentType: "text/plain;charset=UTF-8"        },        body: new URLSearchParams(Ja(Ja({            v: "1",            tid: "UA-6197637-22",            cid: i          }, _e(e, Ce((function() {            return {}          }), (function(t) {            return {              uid: t            }          })))), {}, {            t: "event",            ec: "pageimprove:" + r,            ea: n          }, le(o) ? o : {            el: "object" === t(o) ? JSON.stringify(o) : "" + o.toString()          }))          .toString()      };      fetch("https://www.google-analytics.com/collect", u), fetch(        "https://google-analytics.bi.owox.com/UA-6197637-22", u)    }))}

At document_start in every frame of every site, the extension injects a <script> element pointing at a web_accessible_resource (contentPageRuntimeScript.js), executing extension-controlled JavaScript directly in the page's main world. This bypasses the content-script isolated world and gives the script the page's full DOM/JS scope, a pattern frequently abused for in-page tampering even though the current payload is small.

contentPageRuntimeInjector.js (Line 1)
(() => {  var e = document.createElement("script");  e.src = chrome.runtime.getURL("contentPageRuntimeScript.js"), document.documentElement.appendChild(e)})();

A MutationObserver continuously rewrites the onclick handler of every <a> element in the document, calling preventDefault() and routing navigation through extension-controlled logic. While intended for the SEO preview iframe, the same code path runs in the content-bundle context and effectively gives the extension the ability to intercept and redirect any link click on the page, which is a high-impact capability if abused (e.g. affiliate/redirect injection).

background.js (Line 8675)
Rs = function(t) {  ...}((function(t) {  return function(t, e) {    return function(r) {      if (r.preventDefault(), qs.test(this.href)) return !1;      ! function(t, e) {        return t.protocol === e.protocol && t.host === e.host && t.pathname === e.pathname && t.hash === e.hash && t.search === e.search      }(new URL(this.href), new URL(e.location.href)) ? As.test(this.href) || this.href.startsWith(t) ? e.location = this.href : window.open(this.href, "_blank"): e.location.reload()    }  }(function(t) {    return t.location.protocol + "//" + t.location.host  }(t), t)}), {  resolver: pe});xc(xs).watch((function(t) {  var e = ...(2e3, function(t, e) {    return function() {      for (var r = Rs(e), n = 0; n < t.length; n++) {        var o = t[n];        Ds(o, r) && (o.onclick = r)      }    }  }(t.document.getElementsByTagName("a"), t));  e(), new MutationObserver(e).observe(t.document.body, {    childList: !0,    subtree: !0,    attributes: !0  })}))

By severity

Critical0
High1
Medium4
Low0

Versions scanned

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

Extension VersionCode Review Findings
0.0.1015

Files with findings

3 distinct paths — top paths by unique finding count:

  • background.js3
  • contentPageRuntimeInjector.js1
  • manifest.json1
S.No.
Category
Severity
File
Summary
Found in Version
1Privilege Escalation
high
manifest.json (line 42)The extension claims full host access to every http(s) site and injects a content script into every frame at document_start. Combined with chrome.scripting.executeScript and tabs permission, it can read or modify any …
2Code Injection
medium
contentPageRuntimeInjector.js (line 1)At document_start in every frame of every site, the extension injects a <script> element pointing at a web_accessible_resource (contentPageRuntimeScript.js), executing extension-controlled JavaScript directly in the p…
3Network Interception
medium
background.js (line 8675)A MutationObserver continuously rewrites the onclick handler of every <a> element in the document, calling preventDefault() and routing navigation through extension-controlled logic. While intended for the SEO preview…
4Tracking
medium
background.js (line 6831)The background service worker exfiltrates user-level analytics (user_id, device_id, event properties) to Amplitude on both the /identify and /2/httpapi endpoints with an embedded API key. The device_id is persisted in…
5Tracking
medium
background.js (line 6955)The same Google Analytics event payload (with persistent client id stored in chrome.storage.local under _ga, plus optional Semrush user id 'uid') is duplicated to a third-party endpoint at google-analytics.bi.owox.com…
URLs
49
IPv4
55
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.

www.w3.org/2000/svghttp://www.w3.org/2000/svg
clients2.google.com/service/update2/crxhttps://clients2.google.com/service/update2/crx
*/*http://*/*
*/*https://*/*
www.semrush.com/company/legal/terms-of-service/https://www.semrush.com/company/legal/terms-of-service/
www.semrush.com/pageimprove/tos/https://www.semrush.com/pageimprove/tos/
www.semrush.com/company/legal/privacy-policy/https://www.semrush.com/company/legal/privacy-policy/
jedwatson.github.io/classnameshttp://jedwatson.github.io/classnames
github.com/facebook/regenerator/blob/main/LICENSEhttps://github.com/facebook/regenerator/blob/main/LICENSE
polymer.github.io/LICENSE.txthttp://polymer.github.io/LICENSE.txt
Showing 1 to 10 of 50 rows
Rows per page:

Gain full insight into all external connections.

Upgrade for full visibility.

2.1.228.223
IPv4
-
1.221.25.33
IPv4
-
205.242.36.48
IPv4
-
243.17.55.255
IPv4
-
136.176.241.32
IPv4
-
137.176.242.32
IPv4
-
166.6.113.165
IPv4
-
213.25.14.44
IPv4
-
133.176.237.32
IPv4
-
136.176.242.32
IPv4
-
226.151.15.226
IPv4
-
134.176.237.32
IPv4
-
1.222.25.33
IPv4
-
1.24.192.39
IPv4
-
166.6.114.165
IPv4
-
176.108.36.197
IPv4
-
226.15.15.225
IPv4
-
226.15.15.226
IPv4
-
247.28.106.55
IPv4
-
213.191.88.88
IPv4
-
179.84.122.235
IPv4
-
245.241.161.43
IPv4
-
123.55.21.26
IPv4
-
13.95.13.3
IPv4
-
253.12.52.12
IPv4
-
26.11.49.21
IPv4
-
69.107.193.247
IPv4
-
35.42.47.173
IPv4
-
17.66.17.22
IPv4
-
22.89.107.253
IPv4
-
42.61.174.147
IPv4
-
92.188.247.122
IPv4
-
5.6.65.255
IPv4
-
237.163.53.245
IPv4
-
22.89.106.253
IPv4
-
42.61.173.147
IPv4
-
214.191.87.87
IPv4
-
131.132.253.243
IPv4
-
226.15.151.226
IPv4
-
1.228.25.33
IPv4
-
1.13.254.49
IPv4
-
1.138.188.33
IPv4
-
28.174.6.26
IPv4
-
134.176.238.32
IPv4
-
204.242.36.48
IPv4
-
24.124.48.195
IPv4
-
15.124.31.195
IPv4
-
1.11.16.116
IPv4
-
1.216.107.142
IPv4
-
12.135.244.186
IPv4
-
4.107.143.223
IPv4
-
15.125.31.196
IPv4
-
1.217.106.142
IPv4
-
151.113.29.213
IPv4
-
1.16.2.245
IPv4
-
Showing 1 to 55 of 60 rows
Rows per page:
Version
Size
Is Malicious
Findings
Permhash
0.0.101
Latest
2.49 MB
Malicious
5
Showing 1 to 1 of 10 rows
Rows per page:

Browse and explore files within this extension package

Gain full insight into all external connections.

Upgrade for full visibility.