Is 写作猫浏览器插件 safe?

Medium risk

写作猫 captures text you type into editable fields on any site and sends it to xiezuocat.com a few seconds after you stop typing.

A content script runs on every page and watches editable fields; about three seconds after you pause typing, it sends both the rich HTML and plain text of what you wrote to xiezuocat.com for checking. Separate popup and toolbar features send the full HTML of the current page to metaso.cn, upload the page or a downloaded PDF to a WebDAV store at service.metapro.cn tagged with your account ID, and send screen-capture images to an OCR service at ocr_api_mt.metaso.cn over plain unencrypted HTTP.

上海秘塔网络科技有限公司 v2.0.2Chrome Web Store
49Risk
Who publishes it

上海秘塔网络科技有限公司 - 1 other listing 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
上海秘塔网络科技有限公司

Same store account

1 other listing published from this account, 10k+ 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

Popup extract posts the current page HTML to Metaso

Code analysis shows clicking the popup extract button makes the extension request `document.documentElement.outerHTML` from the active tab and POST that markup to `https://metaso.cn/extract_html` with browser credentials included.

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

You click the extension's popup extract button.

The popup skips Chrome Web Store pages, then sends an extract command to the active tab.

The extension did this

The extension reads the active page's rendered HTML and posts it to Metaso.

The background extraction function wraps the HTML in a JSON `text` field and sends it with credentials included.

Fields produced by the extract path
  • Rendered page HTML
    <html><head><title>Quarterly roadmap</title></head><body><main>Launch plan draft</main></body></html> (illustrative)

    The page structure and visible text the browser has rendered, including content from any article, document, dashboard, or form open.

  • Document title
    Quarterly roadmap (illustrative)

    The title can reveal the page or document you were viewing when you used the extract action.

  • Links in page markup
    https://intranet.example.com/roadmap/q3 (illustrative)

    URLs embedded in the page can reveal sites, internal tools, or document links present in the current page.

Captured request
POSThttps://metaso.cn/extract_html
The code that does this

Popup-to-content-script extraction path

Readable version

Popup sends the extract command

js/popup.js
function d(e) {  s({    event_name: "popupExtractButtonClick",    text: "",    value: 1  }), chrome.tabs.query({    active: !0,    currentWindow: !0  }, function(t) {    t[0].url.startsWith("https://chrome.google.com/webstore") ? f("该网页无法进行使用。", !1) : chrome.tabs.sendMessage(t[0].id, {      cmd: "extract"    }, function(t) {      t && t.htmlText ? u.a.effect({        htmlText: t.htmlText,        successFunc(t) {          Object(c.d)(t.msg, {            ai: e          })        }      }) : f("当前页面需要进行刷新。", !0)    })  })}

Content script returns full document HTML

js/content.js
chrome.runtime.onMessage.addListener(function(A, E, B) {  if ("extract" === A.cmd) {    B({      htmlText: document.documentElement.outerHTML    })  }})
The code that does this

Background function that posts the HTML

Readable version
function f(t, n) {  let e = Object(r.a)(),    i = new Headers;  i.append("Content-Type", "application/json"), i = Object(u.a)(i);  let o = new Request(e.uranusUrl + "/extract_html", {    method: "POST",    headers: i,    mode: "cors",    credentials: "include",    body: JSON.stringify({      text: t    })  });  fetch(o).then(t => {    if (200 === t.status) return t.json().then(function(t) {      n(t)    }), {};    throw Error("Request rejected with status ".concat(t.status))  }).then(t => {    e.blackList = t  }).catch(t => {    e.blackList = []  })}
Remote host reached by the extract path
    • metaso.cn

    Receives the rendered HTML submitted by the popup extract action.

What it can do

Permissions this extension asks for, as declared in version 2.0.2. 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 every site you visit

    <all_urls>

  • See the address and title of every tab you have open

    tabs

  • Store data in your browser

    storage

  • Read and change cookies, including the ones that keep you signed in

    cookies

  • Write to your clipboard

    clipboardWrite

Where it sends data

Destinations our analysis observed 写作猫 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.

  • metaso.cn

    写作猫 sends data to metaso.cn. No other extension we have analysed sends data here.

  • ocr_api_mt.metaso.cn

    写作猫 sends data to ocr_api_mt.metaso.cn. No other extension we have analysed sends data here.

  • service.metapro.cn

    写作猫 sends data to service.metapro.cn. No other extension we have analysed sends data here.

  • xiezuocat.com

    写作猫 sends data to xiezuocat.com. No other extension we have analysed sends data here.

Updated 15 October 2026giijkmholjmdmpojlmmoieghkilnhkhb