Enhancing Local Storage Security in Chrome Extensions

  • Storages In Browser
  • Same-Origin Policy
  • Malicious Extension

In modern web development, there are several storage options available in browsers

base on browser implementation

LocalStorage

  • Persistence: Data persists even after the browser is closed and reopened.
  • Capacity: Typically around 5MB.
  • Accessibility: Same-origin policy applies (only accessible by pages from the same domain).
  • Use Case: Storing user preferences or saving state across sessions.

SessionStorage

  • Persistence: Data is cleared when the page session ends (i.e., when the tab or browser is closed).
  • Capacity: Similar to LocalStorage, around 5MB.
  • Accessibility: Same-origin policy applies, and data is only available in the window/tab where it was set.
  • Use Case: Storing data needed for the current session, like form data in a multi-step process.

Cookies

  • Persistence: Configurable expiration date; can persist across browser sessions.
  • Capacity: Very limited (about 4KB).
  • Accessibility: Can be configured to be accessible by multiple pages or across subdomains.
  • Use Case: Tracking sessions, storing small pieces of user data, and can be used for server-side read/write.

accessToken/sessionToken

In Server, it is a common pratice to protect sensetive data

    ctx.setCookie('token', token, {
      httpOnly: true,
      secure: true,
      path: '/',
      sameSite: envs.NODE_ENV === 'production' ? true : 'none',
    });
    

HTTP Response Header

IndexedDB

  • Persistence: Persistent storage, survives browser restarts.
  • Capacity: Significantly larger than LocalStorage (no fixed limit, but browser may prompt the user for permission if the limit is exceeded).
  • Accessibility: Same-origin policy applies.
  • Use Case: Storing large amounts of structured data, offline storage, and for applications that require more complex database-like capabilities.

Wrap up

localStorage/sessionStorage

cookies

non sensitive data (user config)

sensitive data (token)

WHAT IF......

Same Origin Policy

There's still a line of defense left

Source URL Compared URL Same Origin? Reason
http://example.com http://subdomain.example.com No Different subdomains
https://example.com http://example.com No Different protocols (https vs http)
http://example.com:80 http://example.com:8080 No Different ports (80 vs 8080)
http://subdomain.example.com http://another.example.com No Different subdomains
http://example.com/abc http://example.com/bcd Yes Same protocol, subdomain, and port

Malicious Extension

Web extensions

content script

background script

execute in individual tabs

execute in background

Chrome API is powerful!

// content script
const allLocalStorage = {};
for (let i = 0; i < localStorage.length; i++) {
    const key = localStorage.key(i);
    allLocalStorage[key] = localStorage.getItem(key);
}

const domain = new URL(window.location.href).hostname;

chrome.storage.local.set({ [domain]: allLocalStorage }, function() {
    console.log(`LocalStorage for ${domain} is saved to chrome.storage.local`);
});

Access your localStorage and save it somewhere for easy retrieval and future use

Even we can hijack web API

((win) => {
    const nativeLocalStorage = win.localStorage;
    win.nativeLocalStorage = nativeLocalStorage; // keep the original usage

    class MyLocalStorage extends Storage {
        setItem(key, value) {
            const secret = encrypt(value, passphrase);
            nativeLocalStorage.setItem(key, secret);
        }

        getItem(key) {
            const secret = nativeLocalStorage.getItem(key);
            return secret ? decrypt(secret, passphrase) : null;
        }
    }

    const myLocalStorage = new MyLocalStorage();
    // Assign the newly created instance to localStorage
    Object.defineProperty(win, 'localStorage', {
      value: myLocalStorage,
      writable: true,
    });
    win.localStorage = myLocalStorage;
    console.log("window.localStorage", win.localStorage)
})(window);
  • Encryption Sensitive Data
  • Extension Management

Avoidance Strategy

localStorage

Web API

developer console

File(leveldb)

Access Methods

localStorage

Web API

 

developer console

File(leveldb)

Access Methods

encryption data

encryption data

getItem method

Extension Management

{
  "name": "Permissions Extension",
  ...
  "permissions": [
    "activeTab",
    "contextMenus",
    "storage"
  ],
  "optional_permissions": [
    "topSites",
  ],
  "host_permissions": [
    "https://www.developer.chrome.com/*"
  ],
  "optional_host_permissions":[
    "https://*/*",
    "http://*/*"
  ],
  ...
  "manifest_version": 3
}

Research on Enhancing Local Storage Security in Chrome Extensions

By Jay Chou

Research on Enhancing Local Storage Security in Chrome Extensions

  • 65