Is AI Social Media Post Generator - LinkedIn™ safe?

High risk

AI Social Media Post Generator is high risk. When the AI writing feature gets a ChatGPT response, the extension builds an analytics event with your question and the response, routed to its Aliyun Log endpoint. Replay couldn't reach this path (login required); fields are code-derived.…

parrettwv2021v1.4.7Chrome Web Store
77Risk

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

Publishers can request a review.

Findings

ChatGPT prompts and responses sent to Aliyun analytics

When the AI writing feature gets a ChatGPT response, the extension builds an analytics event with your question and the response, routed to its Aliyun Log endpoint.

Replay couldn't reach this path (login required); fields are code-derived.

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

You use the extension's AI writing feature for LinkedIn text.

The prompt can include text you typed or selected from the LinkedIn page.

The extension did this

After the response finishes, the extension prepares an analytics event containing the prompt and response text.

The event type is 240245 in the extension code.

Fields the completion event adds before upload
  • Your submitted question
    Translate the following content to English: Thanks everyone for joining today's product launch (illustrative)

    This is the text you asked the AI writer to process, which may include content copied from LinkedIn or text you drafted.

  • Generated response
    Thank you to everyone who joined today's product launch. We are excited to share what comes next. (illustrative)

    This is the AI-written output returned to the extension after generation completes.

  • Completion event type
    240245

    This labels the analytics event as the completion path for the AI writing feature.

  • AI provider mode
    ChatGPT

    This says which ChatGPT integration path handled your request.

  • LinkedIn page context
    https://www.linkedin.com/feed/ (illustrative)

    The background script adds LinkedIn profile and page context when it builds the analytics record.

Captured request
POSThttps://extension-us.us-west-1.log.aliyuncs.com/logstores/scrm-gpt-linkedin/track

No response body was captured for the completion event; the dynamic test could not pass the LinkedIn login requirement.

Headers
Content-Type
application/x-protobuf
x-log-apiversion
0.6.0
The code that does this

The completion handlers attach the full prompt and response to event 240245

Readable version

Readable GPT3 completion path

js/content-script.js:28212-28225
const t = chrome.runtime.connect({    name: S["e"]  }),  e = t => {    t.text ? this.responseText = t.text : t.error ? (Object(_["e"])(240080, Object(k["a"])(), {      error: t.error,      provider_type: S["n"].GPT3    }), this.setResponseDone(!0), t.errorMessage.code === S["b"] ? this.showTimeoutError = !0 : this.portListenError = t.errorMessage) : "DONE" === t.event && (console.debug("done"), this.setResponseDone(!0), Object(_["e"])(240245, Object(k["a"])(), {      question: this.fullQuestion,      response: this.responseText,      provider_type: S["n"].GPT3    })), this.loading = !1  };t.onMessage.addListener(e), this.port = t, this.listener = e

Readable ChatGPT completion path

js/content-script.js:28254-28261
else if (t.event && "DONE" === t.event.newValue) {  console.debug("done"), this.setResponseDone(!0);  const t = await Object(W["i"])();  Object(_["e"])(240245, Object(k["a"])(), {    question: t,    response: this.responseText,    provider_type: S["n"].ChatGPT  })}

Readable helper that stores and returns the ChatGPT question

js/content-script.js:33594-33610
function d(t) {  return new Promise(e => {    chrome.storage.local.set({      ask_for_chatgpt_text: t    }, (function() {      e(!0)    }))  })}function h() {  return new Promise(t => {    chrome.storage.local.get("ask_for_chatgpt_text", (function(e) {      let n = e.ask_for_chatgpt_text ? e.ask_for_chatgpt_text : "";      t(n)    }))  })}
The code that does this

The background script routes the event to Aliyun Log Service

Readable version

Readable Aliyun project configuration

js/background.js:23155-23162
const h = {    host: "us-west-1.log.aliyuncs.com",    project: "extension-us",    logstore: "scrm-gpt-linkedin",    time: 1,    count: 1  },  u = new n.a(h)

Readable analytics event construction

js/background.js:23201-23228
async function M(...t) {  let e = await Object(a["c"])(),    r = await w(),    i = await v(),    n = await Object(s["p"])(),    h = await Object(s["q"])(),    f = "";  void 0 != t[1] && (f = t[1]);  let c = await o["storage"].local.get(["platform", "browserType", "language", "userAgent"]),    l = {      event_source: 24,      event_type: t[0],      install_time: r,      event_time: Math.floor(Date.now() / 1e3),      log_version: "v1",      uuid: e,      linkedin_profile: f,      linkedin_url: h,      user_email: n,      version: i,      platform: c.platform ? c.platform : "",      browser_type: c.browserType ? c.browserType : "",      language: c.language ? c.language : "",      user_agent: c.userAgent ? c.userAgent : ""    };  if (t[2])    for (let o in t[2]) l[o] = t[2][o];  u.send(l)}

Readable network sender

js/background.js:6971-7003
key: "logger",value: async function(t = !1) {  var e = !1 !== t && t.length > 0 ? t : [];  if (0 !== e.length) {    var r = "https://" + this.project + "." + this.host + "/logstores/" + this.logstore + "/track";    try {      var i = JSON.stringify({        __logs__: e      });      let t = new Headers({        "x-log-apiversion": "0.6.0",        "x-log-bodyrawsize": i.length      });      if (this.compress) {        t.append("x-log-compresstype", "lz4");        var n = f.from(i),          o = u.encodeBound(i.length),          s = f.alloc(o),          a = u.encodeBlock(n, s);        s = s.slice(0, a), fetch(r, {          method: "POST",          headers: t,          body: s        }).then(t => t)      } else {        let e = new Blob([i], {          type: "application/x-protobuf"        });        t.append("Content-Type", "application/x-protobuf"), fetch(r, {          method: "POST",          headers: t,          body: e        }).then(t => t)      }    } catch (h) {      console.log(h)    }  }}
External service receiving the analytics event
    • extension-us.us-west-1.log.aliyuncs.com

    Aliyun Log Service endpoint for the extension's scrm-gpt-linkedin logstore.

ChatGPT questions route through extensiondock.com in AI mode.

The extension's built-in AI mode routes your ChatGPT question through extensiondock.com instead of OpenAI.

The request to extensiondock.com/v2/chatgpt/question-stream includes the question text and authentication parameters.

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

The user submits a question while the extension's GPT3 provider mode is active.

The extension did this

The extension routes the question text through extensiondock.com/v2/chatgpt/question-stream.

Captured request
POSThttps://extensiondock.com/v2/chatgpt/question-stream
Fields in the request
  • Your AI prompt text
    Write a LinkedIn post about a product launch (illustrative)

    The text you submit to the extension's built-in AI mode is included in the outgoing request.

Observation

Dynamic analysis confirmed the content-script-to-background handoff and the POST request that sends the question text to the extensiondock.com question-stream endpoint.

Extension fetches remote config that changes runtime behavior.

On install, the extension contacts linkedradar.com for remote config, repeating every six hours.

It sends an extension ID; returned config keys are stored in Chrome local storage, letting feature access change without an update.

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

The user installs the extension.

The extension did this

The extension fetches remote configuration from linkedradar.com and stores returned feature keys locally.

Captured request
POSThttps://linkedradar.com/user/api-chrome-extension/get-remote-config?source=gpt-linkedin
Body
{  "extension_id": 45}
Fields in the request and stored response
  • Extension storage data
    paid_functional_verification; drainage

    Remote configuration keys are saved in Chrome local storage and used to control access restrictions and feature availability.

+1 more finding not shown

What it can do

Permissions this extension asks for, as declared in version 1.4.7. 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 linkedin.com

    *://*.linkedin.com/*

  • Read and change your data on openai.com

    *://*.openai.com/*

  • Read and change your data on linkedradar.com

    *://*.linkedradar.com/*

  • Store data in your browser

    storage

  • Act on the current tab, but only after you click the extension

    activeTab

  • Add items to the right-click menu

    contextMenus

Updated 30 September 2026kgojhlllchdepinmopmlhihnipicpoah