Is Roblox Friend Remover Button safe?
Roblox Friend Remover Button modifies Roblox purchase pages to promote RoEarn and roexport redirects.
On Roblox catalog and game-pass pages, its content scripts hide eligible purchase controls and add RoEarn promotional buttons that open the RoEarn Chrome Web Store page. It also adds Save Template and Re-Upload controls for clothing items that open roexport.io/redirect.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
Roblox purchase areas are replaced with promo redirects
This runs content scripts on Roblox pages, changes catalog/store purchase areas, and adds RoEarn or roexport controls.
RoEarn buttons open a Web Store listing with campaign params; Save Template/Re-Upload open roexport.io/redirect.
- Severity
- Medium unwanted
- Type
- Unexpected
- CWE
- CWE-506
- Source
- Dynamic sandbox
You open a Roblox catalog item, bundle, clothing card, or game store page.
The extension manifest matches every roblox.com page, so the content scripts run during normal Roblox browsing.
The extension changes the purchase area and adds buttons that point away from Roblox.
Catalog and game-pass pages receive RoEarn buttons; clothing catalog cards and item pages receive Save Template and Re-Upload controls.
- Roblox page scope*://*.roblox.com/*
This behavior follows you across matching Roblox catalog and game pages rather than one isolated screen.
- Original catalog purchase area.shopping-cart-buy-button.item-purchase-btns-container .btn-container
The normal Roblox buy control can be removed from view before the added RoEarn control is inserted.
- Original game-pass purchase area.PurchaseButton.rbx-gear-passes-purchase
The Roblox game-pass buy button area can be removed from view while an added RoEarn button is placed before it.
- RoEarn catalog buttonhttps://chromewebstore.google.com/detail/roearn-cashback-on-roblox/fooenmopnfaejehogdbmegaleanpdcea?utm_campaign=catalog
Clicking the added catalog button opens a Chrome Web Store listing instead of completing a Roblox purchase action directly.
- Roexport clothing buttonshttps://roexport.io/redirect
Clicking the added Save Template or Re-Upload controls opens a roexport redirect destination.
Browser navigation opened by the injected RoEarn catalog button; GET navigation has no request body.
Browser navigation opened by injected Save Template or Re-Upload controls; GET navigation has no request body.
Shipped content scripts that alter Roblox purchase flows
Manifest applies the scripts to Roblox pages
manifest.json"content_scripts": [ { "js": [ "content.js", "checkP.js", "gamepassP.js", "catalogP.js", "locale.js" ], "matches": [ "*://*.roblox.com/*" ] }, { "matches": [ "*://*.roblox.com/*" ], "js": [ "insertButtons.js" ], "run_at": "document_idle" }, { "js": [ "sidebar.js" ], "matches": [ "*://*.roblox.com/*" ], "run_at": "document_start" }]Catalog purchase area is removed from view and replaced with a RoEarn button
catalogP.jscssRules.textContent = ` .shopping-cart-buy-button.item-purchase-btns-container .btn-container { display: none !important; } .shopping-cart-buy-button.item-purchase-btns-container .btn-container[data-roearn-not-eligible="true"] { display: block !important; } .roearn-promo-button { width: 100%; height: 52px; border: none; color: white; font-weight: bold; display: flex; align-items: center; justify-content: center; cursor: pointer; }`;buttonContainer.setAttribute('data-roearn-added', 'true');const wrapper = document.createElement('div');wrapper.className = 'roearn-promo-container';const actionButton = document.createElement('button');actionButton.className = 'roearn-promo-button';actionButton.type = 'button';actionButton.textContent = 'Buy with RoEarn (Earn ';actionButton.addEventListener('click', (evt) => { evt.preventDefault(); evt.stopPropagation(); window.open('https://chromewebstore.google.com/detail/roearn-cashback-on-roblox/fooenmopnfaejehogdbmegaleanpdcea?utm_campaign=catalog', '_blank');});wrapper.appendChild(actionButton);buttonContainer.parentNode.insertBefore(wrapper, buttonContainer);Game-pass purchase buttons get a RoEarn button before the Roblox button
gamepassP.jsanimationCSS.textContent = ` .PurchaseButton.rbx-gear-passes-purchase { display: none !important; } .PurchaseButton.rbx-gear-passes-purchase[data-roearn-not-eligible="true"] { display: block !important; } .roearn-gamepass-promo-button { height: 50px; border: none; border-radius: 8px; color: white; font-weight: bold; display: flex; align-items: center; justify-content: center; cursor: pointer; }`;const allPurchaseBtns = document.querySelectorAll('#rbx-passes-container .PurchaseButton');allPurchaseBtns.forEach((buyButton) => { const footerElement = buyButton.closest('.store-card-footer'); if (footerElement.querySelector('.roearn-gamepass-promo-button')) return; const promoButton = document.createElement('button'); promoButton.className = 'btn-buy-md btn-full-width roearn-gamepass-promo-button'; promoButton.type = 'button'; promoButton.addEventListener('click', (clickEvent) => { clickEvent.preventDefault(); clickEvent.stopPropagation(); window.open('https://chromewebstore.google.com/detail/roearn-cashback-on-roblox/fooenmopnfaejehogdbmegaleanpdcea?utm_campaign=gamepass', '_blank'); }); footerElement.insertBefore(promoButton, buyButton);});Clothing catalog controls open roexport.io
insertButtons.jsconst REDIRECT = 'https://roexport.io/redirect';const CLOTHING = /\/(Shirt|Pants|Tshirt)\//;const CLOTHING_TYPES = new Set([2, 11, 12]);function goRedirect(e) { e.preventDefault(); e.stopPropagation(); window.open(REDIRECT, '_blank');}function injectCardButtons(card) { if (card.querySelector('.' + CLS_WRAP)) return; const img = card.querySelector('.thumbnail-2d-container img'); if (!img || !CLOTHING.test(img.src)) return; const anchor = card.querySelector('a.item-card-link[href]'); if (!anchor || !anchor.href.match(/\/catalog\/(\d+)/)) return; const uploadBtn = document.createElement('button'); uploadBtn.addEventListener('click', goRedirect); const saveBtn = document.createElement('button'); saveBtn.addEventListener('click', goRedirect);}function injectCatalogSection() { const match = window.location.pathname.match(/\/catalog\/(\d+)/); if (!match) return; fetch(`https://catalog.roblox.com/v1/catalog/items/${match[1]}/details?itemType=asset`, { credentials: 'include' }) .then(r => r.json()) .then(data => { if (!data || !CLOTHING_TYPES.has(data.assetType)) return; const uploadBtn = document.createElement('button'); uploadBtn.innerHTML = `${ICON_UPLOAD_LG}<span>${labelUpload}</span>`; uploadBtn.addEventListener('click', goRedirect); const saveBtn = document.createElement('button'); saveBtn.innerHTML = `${ICON_EXPORT_LG}<span>${labelSave}</span>`; saveBtn.addEventListener('click', goRedirect); }) .catch(() => {});}- chromewebstore.google.com
Receives the browser navigation opened by the RoEarn catalog, game-pass, and sidebar promotional controls.
- roexport.io
Receives the browser navigation opened by the Save Template and Re-Upload clothing controls.
- users.roblox.com
Roblox API endpoint used by the content scripts to check the current authenticated user before adding RoEarn purchase controls.
- catalog.roblox.com
Roblox API endpoint used by the scripts to look up catalog item details, prices, asset types, and clothing eligibility.
Where it sends data
Destinations our analysis observed Roblox Friend Remover Button 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.
- chromewebstore.google.com
Roblox Friend Remover Button sends data to chromewebstore.google.com. 2 other extensions we have analysed send data here.
- roexport.io
Roblox Friend Remover Button sends data to roexport.io. One other extension we have analysed sends data here.