Is AI Email Response Generator - superReply safe?
superReply is high risk. Clicking superReply in a Gmail reply window reads the quoted thread and forwards it to its hosted iframe at super-reply-dbaf0.web.app. No body was captured since the click wasn't triggered, but code passes the thread HTML to the bridge.…
Who publishes itsuperReply - no other listings under this identity
superReply - no other listings under this identity
What this publisher told the store about itself, and the other listings that told it the same thing.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Gmail reply threads forwarded to SuperReply web app
Clicking superReply in a Gmail reply window reads the quoted thread and forwards it to its hosted iframe at super-reply-dbaf0.web.app.
No body was captured since the click wasn't triggered, but code passes the thread HTML to the bridge.
- Severity
- High unwanted
- Type
- Unexpected
- CWE
- CWE-200
- Source
- Dynamic sandbox
You click the superReply button while replying in Gmail.
The extension adds this control to Gmail compose and thread-reply areas.
The extension reads the quoted Gmail thread and forwards it to the SuperReply iframe.
The value is packaged as Gmail message data before the popup iframe is shown.
- Quoted Gmail thread<div class="gmail_quote">On Tue, Jul 14, 2026 at 9:12 AM Alex Rivera <alex.rivera@example.com> wrote:<div>Can you send the contract notes?</div></div> (illustrative)
This can include earlier messages in the conversation you are replying to, not just the new text you type.
- Sender display nameJordan Lee (illustrative)
This ties the thread data to the Google account name visible in Gmail.
- Message type markergmail_message_data
This tells the receiving iframe that the data came from a Gmail message flow.
Hosted iframe document request; GET has no request body.
The shipped code reads Gmail thread HTML and hands it to the hosted iframe
Button handler packages the Gmail thread as waterfall_str
js/content.jstick() { let e = Array.from(document.querySelectorAll(this.selectors.compose_window)); this.activated_compose_window && !1 === e.includes(this.activated_compose_window) && (this.activated_compose_window = null, this.parent.popup_controller.hide()), e.forEach((e => { if ("1" !== e.dataset.super_reply_extended) { let t = this.get_waterfall_str(e); if (t && "1" !== e.dataset.super_reply_extended) { e.dataset.super_reply_extended = "1"; let r = e.querySelector(this.selectors.reply_buttons); if (null === r.querySelector(this.selectors.super_reply_button)) { let s = l.html_to_element(` <div class = "super-reply-button" > ${m()} </div> `); r.firstElementChild.after(s), s.addEventListener("click", (() => { this.activated_compose_window = e, this.parent.popup_controller.toggle(e, s, { type: "gmail_message_data", version: "1.0.0", waterfall_str: t, sender: this.get_sender() }) })) } } } })), Array.from(document.querySelectorAll(this.selectors.thread_page_reply_buttons)).forEach((e => { if ("1" !== e.dataset.super_reply_extended) { e.dataset.super_reply_extended = "1"; let t = l.html_to_element(` <div class = "super-reply-button-big" > ${p()} <span>superReply</span> </div> `); e.prepend(t), t.nextElementSibling instanceof HTMLElement && t.addEventListener("click", (() => { let e = Array.from(document.querySelectorAll(this.selectors.compose_window)), r = t.nextElementSibling; r instanceof HTMLElement && r.click(), this.wait_for_new_compose_window_then_activate_it(e, 3e3) })) } })), this.parent.storage.user_settings?.main_gmail_view_enabled && Array.from(document.querySelectorAll(this.selectors.msg_items)).forEach((e => { e.querySelector(`.${this.selectors.super_reply.reply_btn}`) || this.paste_btn_in_msg_item(e) }))}Popup display forwards the prepared object to the Firebase iframe proxy
js/content.jsasync show(e, t, r) { let s = t.getBoundingClientRect(), o = e.getBoundingClientRect(), i = document.body.getBoundingClientRect(), n = v.get_modal_position(600, 360, s, o, i); this.modal_position = n, this.popup.style.display = "block", this.iframe.classList.add("super-reply-no-transitions"), this.button_left = s.left, this.button_top = s.top, this.iframe instanceof HTMLElement && (this.iframe.style.opacity = "0", this.iframe.style.width = "40px", this.iframe.style.height = "40px", this.iframe.style.top = `${s.top}px`, this.iframe.style.left = `${s.left}px`), await l.wait(10), this.iframe.classList.remove("super-reply-no-transitions"), await l.wait(10), this.iframe.style.opacity = "1", this.iframe.style.width = "600px", this.iframe.style.height = "360px", this.iframe.style.top = `${n.top}px`, this.iframe.style.left = `${n.left}px`, r && this.proxy_firebase_iframe.set_thread_data(r)}Iframe helper creates the remote iframe URL
pages/iframe/iframe.jsinject_iframe(e, t) { let r = document.createElement("iframe"); r.name = JSON.stringify({ parent: "extension" }), r.setAttribute("allow", "camera; microphone; fullscreen; display-capture; clipboard-read; clipboard-write"), r.src = i.get_url(e, t), document.body.appendChild(r)}- super-reply-dbaf0.web.app
Firebase Hosting web app that serves the iframe receiving Gmail message data from the extension bridge.
- us-central1-super-reply-dbaf0.cloudfunctions.net
Firebase Cloud Functions backend configured for the SuperReply project.
- plankton-app-65l3o.ondigitalocean.app
DigitalOcean-hosted API root named in the extension configuration and verification indicators.
Extension UI loads from remote Firebase app, bypassing Chrome Web Store review
Testing captured the extension fetching a version string from its Firebase host, then injecting an iframe from super-reply-dbaf0.web.app.
AI reply and auth logic run there, outside CWS review; the developer can update behavior anytime.
- Severity
- Medium unwanted
- Type
- Unexpected
- CWE
- CWE-829
- Source
- Dynamic sandbox
You open the extension popup or visit Gmail or Outlook with superReply installed.
This happens automatically on each mail page load.
The extension fetches the current UI version from a remote Firebase server and injects an iframe whose source points to that server.
All AI reply generation, user authentication, and data handling run from the remotely-served JavaScript, which can be updated without a CWS review.
HTTP 200, 9 bytes. Body: '1.1.0.8.2'. Extension stores this value as version_frontend in chrome.storage.local and uses it to construct the iframe URL.
Remote version fetch and iframe injection
// pages/popup/popup.js:947-948 (identical in pages/iframe/iframe.js:947-948)async fetch_version_frontend() { return await fetch( s.urls.firebase_hosting_root + '/v/' + c + '.txt?ts=' + Date.now() ).then((e => e.text())) .catch((e => (console.log('error', e), null))) || c // falls back to installed version on fetch failure}// inject_iframe uses the returned version_frontend:inject_iframe(e, t) { let r = document.createElement('iframe'); r.name = JSON.stringify({ parent: 'extension' }); r.setAttribute('allow', 'camera; microphone; fullscreen; display-capture; clipboard-read; clipboard-write'); r.src = i.get_url(e, t); // resolves to https://super-reply-dbaf0.web.app/{version_frontend}/iframe/ document.body.appendChild(r);}- super-reply-dbaf0.web.app
Developer-controlled Firebase Hosting. Serves the versioned iframe bundle with all AI reply, auth, and data-handling logic. Content can be updated without a CWS review cycle.
- us-central1-super-reply-dbaf0.cloudfunctions.net
Firebase Cloud Functions backend. Receives API calls from the remote iframe for AI reply generation and account management.
What it can do
Permissions this extension asks for, as declared in version 1.1.0.8. Asking for a permission is not a finding on its own - it is what the extension can do if it chooses to.
Read and change your data on mail.google.com
https://mail.google.com/*
Read and change your data on outlook.office365.com
https://outlook.office365.com/*
Read and change your data on outlook.live.com
https://outlook.live.com/*
Read and change your data on outlook.office.com
https://outlook.office.com/*
Store data in your browser
storage