Is Cityscapes safe?

Medium risk

Cityscapes sends each Chrome top-sites URL to Google's favicon service when it renders the new-tab page.

Cityscapes replaces Chrome's new-tab page and reads the browser's topSites list to show frequently visited sites. For each listed site, it builds a favicon request to Google's service with the site's URL in the domain_url query parameter.

MNS Digital Mediav1.3.0Chrome Web Store
45Risk
Who publishes it

MNS Digital Media - 2 other listings from the same operator, none carrying a finding

What this publisher told the store about itself, and the other listings that told it the same thing.

Publisher
MNS Digital Media

Same store account

2 other listings published from this account, 11k+ users between them, none of them carrying a finding.

AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.

Publishers can request a review.

Findings

New tab page sends your most-visited site URLs to Google's favicon service

Opening a new tab renders a widget of your most-visited sites.

For each one, the extension requests an icon from Google's favicon service, sending that site's full URL as a query parameter.

Confirmed via live traffic capture.

Severity
Medium unwanted
Type
Unexpected
CWE
CWE-359
Source
Dynamic sandbox
What actually happens
You did this

You open a new browser tab.

Cityscapes overrides Chrome's new tab page and renders a widget built from the chrome.topSites API.

The extension did this

The extension requests a site icon from Google for every top site shown.

Each tile's full URL is sent in the domain_url query parameter of a request to www.google.com/s2/favicons.

The code that does this

New-tab widget: fetching top sites and building the favicon request

Readable version

Favicon URL builder

const buildFaviconUrl = (site) =>  `https://www.google.com/s2/favicons?sz=48&domain_url=${encodeURIComponent(site.url)}`;

Top-sites fetch and render

const getTopSites = (callback) => {  if (self.chrome && chrome.topSites) {    return void chrome.topSites.get(callback);  }  // Fallback list used only when chrome.topSites is unavailable  callback([{ title: "Gmail", url: "https://mail.google.com/" }]);};TopSitesWidget.init = () =>  new Promise((resolve) => {    getTopSites((sites) => {      render(        createElement(TopSitesTiles, { topSites: sites }),        document.getElementById("top-sites-widget-root"),        resolve      );    });  });
Captured request
GEThttps://www.google.com/s2/favicons?sz=48&domain_url=https%3A%2F%2Fx.com%2F

Observed during dynamic analysis: 6 near-identical requests fired within 5 seconds of opening a new tab, one per tile, with domain_url matching each site shown. Google returns a small icon image.

Where your top-sites data goes
    • www.google.com

    Receives the full URL of each top site you visit via the s2/favicons endpoint, operated by Google, which also builds Chrome and runs its ads business.

What it can do

Permissions this extension asks for, as declared in version 1.3.0. Asking for a permission is not a finding on its own - it is what the extension can do if it chooses to.

  • Store data in your browser

    storage

  • Read the sites you visit most

    topSites

Where it sends data

Destinations our analysis observed Cityscapes contacting. Sending data somewhere is not a finding on its own - an extension that syncs your settings has to talk to its own server - but it is where your data can go, and who else it goes to.

  • www.google.comwidely used

    Cityscapes sends data to www.google.com. A widely used service: 153 other extensions we have analysed send data here.

Updated 30 September 2026ikgobeaoaebeokfhogkgkdmbbcimlhii