Chrome is putting things on your computer you never agreed to
Back to Tutorials
techTutorialintermediate

Chrome is putting things on your computer you never agreed to

June 29, 202629 views5 min read

Learn how to create a Chrome extension that monitors and inspects other extensions to detect unauthorized installations and potential security threats.

Introduction

Chrome extensions are powerful tools that can enhance your browsing experience, but they also present security risks when installed without your knowledge or consent. This tutorial will teach you how to inspect and manage Chrome extensions programmatically using the Chrome Extension API, helping you detect and prevent unauthorized installations.

Understanding how Chrome extensions work is crucial for maintaining browser security. In recent news, it was revealed that Chrome can silently install extensions without user consent, making it important to monitor your extension environment.

Prerequisites

  • Basic understanding of JavaScript and web development
  • Chrome browser installed on your system
  • Node.js installed for running local development server
  • Basic knowledge of Chrome Extension development

Step-by-Step Instructions

1. Create a Chrome Extension Manifest File

The manifest file is the core configuration file for any Chrome extension. It defines permissions, scripts, and other extension properties.

{
  "manifest_version": 3,
  "name": "Extension Inspector",
  "version": "1.0",
  "description": "Inspect and monitor Chrome extensions",
  "permissions": [
    "management",
    "activeTab"
  ],
  "background": {
    "service_worker": "background.js"
  },
  "action": {
    "default_popup": "popup.html",
    "default_title": "Inspect Extensions"
  }
}

Why: The manifest file defines what permissions your extension needs. The 'management' permission is crucial as it allows us to inspect other extensions on the user's machine.

2. Create the Background Script

The background script runs continuously in the background and can monitor extension changes.

// background.js
chrome.runtime.onInstalled.addListener(() => {
  console.log('Extension Inspector installed');
  // Check for extensions on installation
  checkExtensions();
});

function checkExtensions() {
  chrome.management.getAll((extensions) => {
    console.log('Current extensions:', extensions);
    // Filter for potentially problematic extensions
    const suspiciousExtensions = extensions.filter(ext => {
      return !ext.enabled && ext.installType === 'normal';
    });
    
    if (suspiciousExtensions.length > 0) {
      console.warn('Suspicious extensions found:', suspiciousExtensions);
      // Send warning to popup
      chrome.runtime.sendMessage({
        type: 'SUSPICIOUS_EXTENSIONS',
        data: suspiciousExtensions
      });
    }
  });
}

// Monitor extension changes
chrome.management.onInstalled.addListener(() => {
  checkExtensions();
});

chrome.management.onUninstalled.addListener(() => {
  checkExtensions();
});

Why: This script listens for extension installation and uninstallation events, allowing us to monitor changes in the extension environment.

3. Create the Popup Interface

The popup will display extension information and warnings to the user.

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <style>
    body { width: 400px; padding: 10px; }
    .warning { color: red; font-weight: bold; }
    .extension-item { margin: 5px 0; padding: 5px; border: 1px solid #ccc; }
  </style>
</head>
<body>
  <h2>Extension Inspector</h2>
  <div id="status">Checking extensions...</div>
  <div id="extensions-list"></div>
  <script src="popup.js"></script>
</body>
</html>

Why: The popup provides a user-friendly interface to view extension information and warnings without requiring a full browser window.

4. Implement the Popup Script

This script handles the popup's functionality, displaying extension information and warnings.

// popup.js
function displayExtensions() {
  chrome.management.getAll((extensions) => {
    const extensionsList = document.getElementById('extensions-list');
    const status = document.getElementById('status');
    
    if (extensions.length === 0) {
      status.textContent = 'No extensions found';
      return;
    }
    
    // Clear previous content
    extensionsList.innerHTML = '';
    
    // Filter and display extensions
    const sortedExtensions = extensions.sort((a, b) => {
      return (b.enabled === a.enabled) ? 0 : b.enabled ? -1 : 1;
    });
    
    sortedExtensions.forEach(ext => {
      const item = document.createElement('div');
      item.className = 'extension-item';
      
      // Check for suspicious indicators
      const isSuspicious = !ext.enabled && ext.installType === 'normal';
      
      item.innerHTML = `
        <div><strong>${ext.name}</strong></div>
        <div>Version: ${ext.version}</div>
        <div>Enabled: ${ext.enabled ? 'Yes' : 'No'}</div>
        <div>Install Type: ${ext.installType}</div>
        ${isSuspicious ? '<div class="warning">Potential Security Risk!</div>' : ''}
      `;
      
      extensionsList.appendChild(item);
    });
    
    status.textContent = `Found ${extensions.length} extensions`;
  });
}

// Listen for messages from background script
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  if (message.type === 'SUSPICIOUS_EXTENSIONS') {
    console.warn('Suspicious extensions detected:', message.data);
    // Update UI to show warnings
    displayExtensions();
  }
});

// Initial load
window.onload = displayExtensions;

Why: This script fetches extension data and displays it in a user-friendly format, highlighting potentially suspicious extensions.

5. Install and Test the Extension

Follow these steps to install and test your extension:

  1. Open Chrome and navigate to chrome://extensions
  2. Enable "Developer mode" in the top right corner
  3. Click "Load unpacked" and select your extension folder
  4. Click the extension icon in the toolbar to open the popup
  5. Observe the list of installed extensions

Why: This process allows you to test your extension in a real Chrome environment and verify it correctly inspects extensions.

6. Monitor for Suspicious Activity

Enhance your extension to actively monitor for suspicious installations:

// Enhanced background.js with monitoring
function monitorSuspiciousActivity() {
  chrome.management.getAll((extensions) => {
    const now = new Date().toISOString();
    
    extensions.forEach(ext => {
      // Check for extensions installed without user knowledge
      if (ext.installType === 'normal' && !ext.enabled) {
        console.warn(`Suspicious extension detected: ${ext.name}`, {
          id: ext.id,
          installTime: now,
          type: ext.installType,
          enabled: ext.enabled
        });
        
        // Optionally, disable the extension
        chrome.management.setEnabled(ext.id, false);
      }
      
      // Check for extensions with unusual permissions
      if (ext.permissions && ext.permissions.includes('declarativeNetRequest')) {
        console.log('Extension with advanced permissions:', ext.name);
      }
    });
  });
}

// Run monitoring every 5 minutes
setInterval(monitorSuspiciousActivity, 300000);

Why: Continuous monitoring helps detect suspicious installations in real-time, providing proactive security rather than reactive fixes.

Summary

This tutorial demonstrated how to create a Chrome extension that monitors and inspects other extensions on your system. By using the Chrome Management API, you can detect potentially malicious installations that occur without user consent. The extension provides a user interface to view extension information and highlights suspicious installations that might indicate security threats.

Remember that this type of monitoring should only be used with user consent and for legitimate security purposes. Always ensure your extension follows Chrome's policies and respects user privacy. Regular monitoring of extensions helps maintain browser security and protects against unauthorized installations that could compromise your system.

Source: TNW Neural

Related Articles