Is WA - Send Message without saving contact safe?
WA - Send Message without saving contact writes WhatsApp message details and the active tab URL to Firebase.
When it opens or sends WhatsApp messages, the extension reads the recipient number, message text, sender contact, UID, event source, and active URL. It writes those values to Firestore documents in the Firebase project getstormyapp, including telemetry and user message records.
Who publishes itDictation Daddy Technologies - 1 other listing from the same operator, none carrying a finding
Dictation Daddy Technologies - 1 other listing from the same operator, none 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, 1k+ users between them, none of them carrying a finding.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
WhatsApp message details written to Firebase
When you send or open a WhatsApp message via WA - Send Message without saving contact, the extension writes a Firestore record to Firebase project getstormyapp: phone number, message text, contact, UID, source, timestamp, page URL.
- Severity
- High unwanted
- Type
- Unexpected
- CWE
- CWE-359
- Source
- Dynamic sandbox
You use the extension to send or open a WhatsApp message.
The popup, context menu, Facebook icon, and auto-send paths all route message data into the service worker.
The extension writes a Firebase record containing the recipient, message text, sender contact, UID, event source, and active URL.
Behavioral verification observed Firestore traffic for Firebase project getstormyapp, and the shipped code shows the exact fields written.
- Message textHi, are you available today? (illustrative)
This is the WhatsApp message body you ask the extension to send.
- Recipient phone number+14155550123 (illustrative)
This identifies who you are contacting through WhatsApp.
- Saved sender contact14155550987 (illustrative)
This can connect multiple send events back to the same WhatsApp account or browser profile.
- Extension UIDA7kP9xLmQ2 (illustrative)
This lets repeated events from the same installed extension profile be grouped together.
- Event sourcePOPUP (illustrative)
This describes which extension feature triggered the send flow.
- Active page URLhttps://web.whatsapp.com/ (illustrative)
This adds browsing context to the message event, such as the page that was active when the extension acted.
Firestore write stream for Firebase project getstormyapp.
The shipped code that saves the WhatsApp contact and writes Firestore records
Readable equivalent of the WhatsApp contact capture
assets/detect.57ac1cdc.jsconst rawWid = window.localStorage.getItem("last-wid-md");const parseContact = (value) => value ? value.split(":")[0].trim() : "";const params = Object.fromEntries(new URLSearchParams(window.location.search).entries());const installedFlow = Object.prototype.hasOwnProperty.call(params, "status") && params.status === "installed";if (installedFlow) { chrome.runtime.sendMessage({ action: "installed", userContact: parseContact(rawWid) });}chrome.storage.sync.set({ userContact: parseContact(rawWid) });chrome.runtime.sendMessage({ action: "updateUninstallUrl" });Readable equivalent of the Firebase setup
assets/background.ts.3d7f49cc.jsconst firebaseConfig = { apiKey: "AIzaSyCu7T1zIxH8Dn8I44hPJWEIY_eMMDqdWjY", authDomain: "getstormyapp.firebaseapp.com", projectId: "getstormyapp", storageBucket: "getstormyapp.appspot.com", messagingSenderId: "309351253553", appId: "1:309351253553:web:41c53322bf44dd461e7710", measurementId: "G-10V351TG35"};const firebaseApp = initializeApp(firebaseConfig);const firestore = getFirestore(firebaseApp);Readable equivalent of Im and Ol
assets/background.ts.3d7f49cc.jsconst openOrSendMessage = (phoneNumber, messageText, source) => { try { chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { writeMessageTelemetry(phoneNumber, messageText, source, tabs[0]?.url || "none"); }); } catch (error) { console.log("Failed to send Telemetry", error); } try { chrome.tabs.query({ url: "https://web.whatsapp.com/*" }, (tabs) => { for (const tab of tabs) { if (tab && tab.favIconUrl && !tab.favIconUrl.includes("error")) { focusTab(tab); chrome.tabs.sendMessage(tab.id, { data: { message: messageText, phoneNumbers: [phoneNumber] }, type: SEND_MESSAGES_ON_WHATSAPP_WEB }); return; } } chrome.tabs.create({ url: "https://api.whatsapp.com/send/?phone=" + phoneNumber + "&text=" + encodeURI(messageText) }); }); } catch {}};const writeMessageTelemetry = (phoneNumber, messageText, eventSource, activeUrl) => { chrome.storage.sync.get(["userContact", "uid", "email", "id"], async (stored) => { setUninstallUrl(stored.userContact, stored.email, stored.id, stored.uid); const telemetryDocumentId = (new Date("12-12-2222").getTime() - new Date().getTime()).toString(); const telemetryDocument = doc(firestore, "telemetry2.0", telemetryDocumentId); setDoc(telemetryDocument, { phoneNumber, text: messageText, userContact: stored.userContact || "unknown", time: new Date(), event: eventSource, uid: stored.uid || "unknown", activeUrl }); const userDocument = doc(firestore, "users", stored.userContact || stored.uid); setDoc(userDocument, { userContact: stored.userContact, uid: stored.uid, messages: arrayUnion({ no: phoneNumber, txt: messageText, ul: activeUrl, et: eventSource, t: new Date() }) }, { merge: true }); });};Readable equivalent of the SEND_MESSAGES and Da path
assets/background.ts.3d7f49cc.jschrome.runtime.onMessage.addListener((message) => { if (message.type === "SEND_MESSAGES") { const { source, countryCode, numbers, message: messageText, enableSmartCode } = message.data; sendMessages(countryCode, numbers, messageText, enableSmartCode, source); }});const sendMessages = (countryCode, numbers, messageText, enableSmartCode, source) => { const parsedNumbers = []; for (const number of numbers) { parsedNumbers.push(parsePhoneNumber(number, countryCode, enableSmartCode)); } chrome.tabs.query({ active: true, url: "https://web.whatsapp.com/*" }, (tabs) => { if (tabs.length === 0) { openOrSendMessage(parsedNumbers[0], messageText || "", source); return; } getMessageLimit(parsedNumbers.length).then(({ count, isPremium }) => { if (count <= dailyLimit || isPremium) { chrome.tabs.sendMessage(tabs[0].id, { type: SEND_MESSAGES_ON_WHATSAPP_WEB, data: { phoneNumbers: parsedNumbers, message: messageText, source } }); writeMessageTelemetry(parsedNumbers, messageText, source, "https://web.whatsapp.com"); } else { chrome.tabs.create({ url: "https://orso.app/pricing" }); } }).catch((error) => { chrome.tabs.create({ url: "https://orso.app/pricing" }); console.log("You have reached your message limit", error); }); });};- firestore.googleapis.com
Google Firestore endpoint used by Firebase project getstormyapp to receive telemetry2.0 and users document writes.
- getstormyapp.firebaseapp.com
Firebase application hostname configured in the bundled Firebase project settings.
- api.whatsapp.com
WhatsApp send URL opened by the extension when no active WhatsApp Web tab is available.
- us-central1-getstormyapp.cloudfunctions.net
Cloud Functions host used by the extension's uninstall URL path with stored contact and UID parameters.
What it can do
Permissions this extension asks for, as declared in version 1.67. Asking for a permission is not a finding on its own - it is what the extension can do if it chooses to.
Add items to the right-click menu
contextMenus
Store data in your browser
storage
See the address and title of every tab you have open
tabs
Where it sends data
Destinations our analysis observed WA - Send Message without saving contact 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.
- firestore.googleapis.com
WA - Send Message without saving contact sends data to firestore.googleapis.com. 16 other extensions we have analysed send data here.