Is iFoxTab 新标签页(GPT) safe?
iFoxTab 新标签页(GPT) is rated clean, though our review noted the following. iFoxTab injects a content script into every site, logging each page's URL (origin plus two segments) to a chrome.storage buffer.…
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
iFoxTab records every visited URL and transmits them encrypted to flolight.cn
iFoxTab injects a content script into every site, logging each page's URL (origin plus two segments) to a chrome.storage buffer.
Each new tab it AES-encrypts the buffer with a hardcoded key and POSTs it to ai.flolight.cn; the key is public.
You navigate to a website in Chrome.
The content script is injected into every page due to the <all_urls> manifest match.
The extension records the page URL in a local buffer.
saveUrlEvent() normalises the URL to origin + up to two path segments and pushes it into saveUrlArr, which is persisted to chrome.storage via a Pinia store.
storage_dumpThe data has shipped a block kind this view doesn't render yet. Raw payload below.
{
"kind": "storage_dump",
"location": "chrome.storage.local key 'pinia-urlTrackStore' → saveUrlArr",
"contents": "",
"meaning": "Queued URL entries from a live test: normalised URL plus visit count. The buffer persists in chrome.storage across restarts until flushed.",
"technicalNote": "Observed during dynamic analysis: five URLs accumulated across a ~180 second session: facebook.com ×2, google.com, amazon.com, wikipedia.org."
}AES encryption with hardcoded key and IV (content.js:46719-46744)
async pushSaveUrlEvents() {
if (this.isFlushing || this.saveUrlArr.length === 0) return;
this.isFlushing = true;
const { deviceId, time, signStr } = buildRequestMeta();
const plaintext = JSON.stringify(this.saveUrlArr);
// AES-128-CBC with hardcoded key and IV — both constants are in the source
const encrypted = CryptoJS.AES.encrypt(
plaintext,
CryptoJS.enc.Utf8.parse('CMApH8hrfZ55rM2F'), // hardcoded key
{
iv: CryptoJS.enc.Utf8.parse('17v06ic1Ewd2nTOe'), // hardcoded IV
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);
const ciphertext_b64 = CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
const body = { time, deviceId: deviceId.value, sign: signStr, data: ciphertext_b64 };
await apiClient.saveUrl({ data: body }); // POST to urlAPIBase + '/bi/analyses'
}The POST body 'data' field is the Base64-encoded AES-128-CBC ciphertext. Because the key and IV are hardcoded in the extension source, the ciphertext can be decrypted by anyone with access to the source.
[
{
"action": "OPEN",
"key": "https://www.facebook.com",
"num": 2,
"param1": "{\"key\":\"https://www.facebook.com\"}",
"space": "PLUGIN",
"widget": "URL_ANALYSIS"
},
{
"action": "OPEN",
"key": "https://www.google.com/account/about",
"num": 1,
"param1": "{\"key\":\"https://www.google.com/account/about\"}",
"space": "PLUGIN",
"widget": "URL_ANALYSIS"
},
{
"action": "OPEN",
"key": "https://www.amazon.com",
"num": 1,
"param1": "{\"key\":\"https://www.amazon.com\"}",
"space": "PLUGIN",
"widget": "URL_ANALYSIS"
}
]Decrypts an iFoxTab /bi/analyses POST body 'data' field back to the plaintext URL array, using the hardcoded AES-128-CBC key and IV found in content.js. Run it to verify the key is real and the URL list is recoverable.
#!/usr/bin/env node
/**
* iFoxTab URL Tracking — AES key verification
* Extension: ckngkkfngaahffndbeciefgokaobnmkk (iFoxTab 新标签页(GPT))
* Key source: content.js:46725-46726
*
* Usage: node ifox-url-decrypt.js [base64_ciphertext]
* With no argument, runs a round-trip self-test with a sample payload.
*/
const crypto = require('crypto');
const KEY = Buffer.from('CMApH8hrfZ55rM2F', 'utf8'); // 16 bytes = AES-128
const IV = Buffer.from('17v06ic1Ewd2nTOe', 'utf8'); // 16 bytes
function decrypt(b64) {
const decipher = crypto.createDecipheriv('aes-128-cbc', KEY, IV);
const buf = Buffer.concat([decipher.update(Buffer.from(b64, 'base64')), decipher.final()]);
return JSON.parse(buf.toString('utf8'));
}
function encrypt(obj) {
const cipher = crypto.createCipheriv('aes-128-cbc', KEY, IV);
const buf = Buffer.concat([cipher.update(Buffer.from(JSON.stringify(obj), 'utf8')), cipher.final()]);
return buf.toString('base64');
}
if (process.argv[2]) {
console.log('Decrypted URL array:');
console.log(JSON.stringify(decrypt(process.argv[2]), null, 2));
} else {
// Self-test
const sample = [
{action:'OPEN', key:'https://www.facebook.com', num:2, space:'PLUGIN', widget:'URL_ANALYSIS'},
{action:'OPEN', key:'https://www.amazon.com', num:1, space:'PLUGIN', widget:'URL_ANALYSIS'}
];
const ciphertext = encrypt(sample);
const recovered = decrypt(ciphertext);
console.log('Key:', KEY.toString());
console.log('IV: ', IV.toString());
console.log('Ciphertext (b64):', ciphertext);
console.log('Recovered URLs:');
recovered.forEach(e => console.log(' -', e.key, '(visits:', e.num + ')'));
console.log('\nRound-trip OK:', JSON.stringify(sample) === JSON.stringify(recovered));
}- 1Install Node.js 18+.
- 2Run: node ifox-url-decrypt.js (self-test with sample payload).
- 3Or supply a captured 'data' field: node ifox-url-decrypt.js '<base64_from_POST_body>'
- ai.flolight.cn
Receives POST /api/tab/bi/analyses with the encrypted URL array. Also serves sys_config (urlAPIBase, device config). Operated by the developer (flolight.cn).