Is 悟空AI搜索 safe?

Medium risk

Wukong AI Search fetches remote config that installs network rules and opens server-chosen tabs on each multi-search.

On each multi-search, the extension downloads a configuration from files.xiaolvji.com with no integrity check. It installs the network rules from that configuration as declarativeNetRequest rules, which can match any URL. It also opens URLs from a server-supplied list in background tabs, inserting the user's search keyword, during server-set time windows.

www.xiaolvji.comv100.851.69.2Chrome Web Store
55Risk
Who publishes it

www.xiaolvji.com - 1 other listing from the same operator, 1 of them carrying a finding

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

Publisher
www.xiaolvji.com

Same store account

1 other listing published from this account, 2k+ users between them. 1 of them carries a finding.

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

Publishers can request a review.

Findings

Server-supplied time-gated URLs open in background tabs on each multi-search

Code analysis shows a list from files.xiaolvji.com can open URLs, with the search keyword inserted, in inactive tabs during multi-search.

No domain allowlist is applied.

Severity
High unwanted
Type
Unexpected
CWE
CWE-829
Source
Static analysis
What actually happens
You did this

You run a multi-engine search for a keyword.

The extension did this

It may open a server-chosen URL containing your keyword in a background tab.

The code that does this

Time-gated URL opened with the keyword substituted

Readable version

glj handler

js/15.js
oe.get(["glj"], function(e) {  var t, n = (new Date).getTime();  void 0 !== e.glj && void 0 !== e.glj[V] && Array.isArray(e.glj[V]) && 0 < e.glj[V].length && (t = e.glj[V].length, e = e.glj[V][n % t]) && void 0 !== e.data && void 0 !== e.st && void 0 !== e.et && e.data && n >= e.st && n < e.et && (t = encodeURIComponent(a), n = encodeURIComponent(t), e = e.data.replaceAll("%ds", n).replaceAll("%s", t), chrome.tabs.create({    windowId: f.id,    url: e,    active: !1,    index: u.length  }))})
Fields in each server-supplied glj entry
  • data
    https://example.com/s?q=%s (illustrative)

    The address that opens; the keyword you searched can be placed in it.

  • st / et
    epoch milliseconds (illustrative)

    Start and end times that decide when the address is allowed to open.

Where the URL list comes from
    • files.xiaolvji.com

    Config server whose glj list sets the URLs opened in background tabs.

Observation

Static analysis finding. This behaviour was identified by reading the shipped extension code and has not yet been reproduced in a live run. The trigger conditions and the exact data sent are read from the code, not from an observed capture.

Server config is installed as request rewrite rules before each multi-search

Code analysis shows rules fetched from files.xiaolvji.com are installed as browser request-rewrite rules with no integrity check.

The extension holds access to all sites.

Severity
High unwanted
Type
Unexpected
CWE
CWE-829
Source
Static analysis
What actually happens
You did this

You start a multi-engine search in the extension.

The extension did this

It installs request rules supplied by files.xiaolvji.com, then opens the search tabs.

The code that does this

Config fetch and storage of the server reply

Readable version

Config request

js/15.js
fetch(g, {  method: "POST",  headers: {    "Content-type": "application/x-www-form-urlencoded; charset=UTF-8"  },  body: new URLSearchParams({    type: e,    ctype: t,    lang: V,    version: i[V],    cver: c,    tn: r,    ssid: ce(e, r, 8)  })
The code that does this

Server rule objects copied into the rule list

Readable version

Rule list build

js/15.js
if ("executeScript" === a[5] && void 0 !== a[6].networkRules && Array.isArray(a[6].networkRules) && 0 < a[6].networkRules.length)  for (var f of a[6].networkRules) {    var u, l = f;    l.id = r;    let e = !(l.priority = 1);    for (u of o)      if (void 0 !== f.condition.urlFilter && u === f.condition.urlFilter) {        e = !0;        break      } e || (o.push(f.condition.urlFilter), s.push(l), r++)  }

Install before search

js/15.js
chrome.declarativeNetRequest.getDynamicRules(e => {  e = e.map(e => e.id);  chrome.declarativeNetRequest.updateDynamicRules({    addRules: E.ruleList,    removeRuleIds: e  }, () => {    p(n, i, a), f = t + 2e4, O()  })})
What the server controls in each installed rule
  • condition.urlFilter
    ||example.com^ (illustrative)

    Which pages the rule applies to; any address can be targeted.

  • action
    redirect or modifyHeaders (illustrative)

    Whether matching requests are redirected or have headers changed.

  • cllso flag
    true (illustrative)

    When set, the rules are kept installed instead of being cleared.

Where the rule config comes from
    • files.xiaolvji.com

    Config server whose reply supplies the rules the extension installs.

Observation

Static analysis finding. This behaviour was identified by reading the shipped extension code and has not yet been reproduced in a live run. The trigger conditions and the exact data sent are read from the code, not from an observed capture.

Where it sends data

Destinations our analysis observed 悟空AI搜索 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.

  • files.xiaolvji.comwidely used

    悟空AI搜索 sends data to files.xiaolvji.com. A widely used service: 25 other extensions we have analysed send data here.

Updated 15 October 2026nafcmkcfleikhnibnbenjilfnehbhehc