Is Bypass Telegram Web safe?
Bypass Telegram Web records authorization and cookie headers from browser requests and can copy captured tokens.
The extension watches outgoing requests across all URLs and stores Authorization, Cookie, and x-custom-header values by tab when those headers appear. When the popup's Get Token button is used on a tab with a Telegram bot or game iframe, it can copy a captured bearer token to the clipboard. It also redirects Telegram WebApp JavaScript on selected bot-game domains to a jsDelivr-hosted GitHub script and removes framing/security headers from pages and iframes.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Authorization headers copied from recorded web requests
Bypass Telegram Web can read headers on every site.
Its worker records Authorization, Cookie, x-custom-header, URL, method, and origin for the active tab.
Get Token shows that Authorization (Bearer stripped) and copies it to clipboard.
- Severity
- High unwanted
- Type
- Unexpected
- CWE
- CWE-522
- Source
- Dynamic sandbox
You browse pages that make signed-in web requests, then open the extension popup and click Get Token.
The popup only copies a token after the click path runs, but request-header recording happens beforehand in the service worker.
The extension records selected request headers by tab and can copy a recorded Authorization value to your clipboard.
The copied value has the Bearer prefix removed when the recorded header starts with that prefix.
- Authorization tokenBearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjM0NTY3fQ.signature
This can let a service recognize an already signed-in session or API request as yours.
- Cookiessessionid=6f8b2c9e4d1a7b3c; csrftoken=Q7nL4pR2sT9vX1yZ
Cookies can identify your browser session for the site that received the request.
- Request URLhttps://example-game.example/api/v1/player/profile
The URL shows which site and path were loaded when the sensitive header was present.
- Request methodPOST
The method adds context about whether the browser was fetching, submitting, or updating data.
- Custom headerX-Custom-Header: telegram-webapp-session
Extra application headers can carry account, device, or app-specific routing context.
The shipped listener records Authorization and Cookie headers for all observed URLs
Permission effect
manifest.jsonconst extensionPermissions = { canInspectRequestHeaders: true, observedHosts: ["<all_urls>"], canWriteClipboard: true, backgroundServiceWorker: "js/background.js", popupPage: "popup/popup.html"};Readable equivalent of the recorder
js/background.jsconst requestsStoredByTabId = {};function rememberSensitiveHeaders(details) { if (!details.requestHeaders || !details.tabId || details.tabId === -1) { return; } const capturedHeaders = {}; for (const header of details.requestHeaders) { const name = header.name.toLowerCase(); if (name === "authorization") { capturedHeaders.authorization = header.value; } if (name === "cookie") { capturedHeaders.cookie = header.value; } if (name === "x-custom-header") { capturedHeaders["x-custom-header"] = header.value; } } if (Object.keys(capturedHeaders).length === 0) { return; } requestsStoredByTabId[details.tabId] = { origin: details.initiator ? new URL(details.initiator).origin : "unknown", data: [{ topLevelUrl: details.initiator ? new URL(details.initiator).origin : "unknown", iframeUrl: details.url, method: details.method, ...capturedHeaders }] };}function handlePopupRequest(request, sender, sendResponse) { if (request.action === "getRecordedRequests") { sendResponse(requestsStoredByTabId[request.tabId]?.data || []); return true; } if (request.action === "clearRecordedRequests") { delete requestsStoredByTabId[request.tabId]; sendResponse({ success: true }); return true; }}chrome.webRequest.onBeforeSendHeaders.addListener(rememberSensitiveHeaders, { urls: ["<all_urls>"] }, ["requestHeaders"]);chrome.runtime.onMessage.addListener(handlePopupRequest);The popup click path reads the recorded header and writes it to the clipboard
Popup trigger
popup/popup.htmlconst getTokenButton = document.querySelector("#getAuth");getTokenButton.textContent = "Get Token";loadScript("/getdata/gettokenn.js");Readable equivalent of the click handler
getdata/gettokenn.jsfunction onGetTokenClicked() { chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { const activeTabId = tabs[0].id; chrome.scripting.executeScript({ target: { tabId: activeTabId }, func: () => Array.from(document.querySelectorAll("iframe")).some((iframe) => { const src = iframe.src || ""; return src && !src.includes("telegram.org") && ( src.includes("game") || src.includes("bot") || src.includes("app") || src.startsWith("https://") ); }) }, (results) => { const botGameFrameIsOpen = results?.[0]?.result === true; if (!botGameFrameIsOpen) { chrome.runtime.sendMessage({ action: "clearRecordedRequests", tabId: activeTabId }); } chrome.runtime.sendMessage({ action: "getRecordedRequests", tabId: activeTabId }, (recordedRequests) => { let tokenToShow = ""; if (botGameFrameIsOpen && recordedRequests?.length) { for (const request of recordedRequests) { tokenToShow = request.authorization.startsWith("Bearer ") ? request.authorization.substring(7) : request.authorization; } } if (tokenToShow) { showNoteMessageWithToken("success", t("tokenSuccess"), tokenToShow); navigator.clipboard.writeText(tokenToShow); } else { showNoteMessage("error", t("tokenNotFound")); } }); }); });}document.addEventListener("DOMContentLoaded", () => { document.getElementById("getAuth").addEventListener("click", onGetTokenClicked);});What it can do
Permissions this extension asks for, as declared in version 3.2. 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 every site you visit
<all_urls>
Act on the current tab, but only after you click the extension
activeTab
Run its own code inside the pages you visit
scripting
Watch every request your browser makes
webRequest
Block and redirect the requests your browser makes
declarativeNetRequest
Write to your clipboard
clipboardWrite
Show you desktop notifications
notifications
See which of your requests its blocking rules matched
declarativeNetRequestFeedback
Where it sends data
Destinations our analysis observed Bypass Telegram Web 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.
- cdn.jsdelivr.netwidely used
Bypass Telegram Web sends data to cdn.jsdelivr.net. A widely used service: 32 other extensions we have analysed send data here.