Mantente protegido

Las extensiones tienen acceso a privilegios especiales dentro del navegador, lo que las convierte en un objetivo atractivo para de los atacantes. Si una extensión está comprometida, todos los usuarios de esa extensión se vuelven vulnerables a de intrusiones maliciosas y no deseadas. Protege una extensión y a sus usuarios con la incorporación de estas prácticas.

Protege las cuentas de desarrollador

El código de extensión se sube y se actualiza mediante Cuentas de Google. Si los desarrolladores las cuentas están vulnerado, un atacante podría enviar el código malicioso directamente a todos los usuarios. Protege estas cuentas de la siguiente manera: crear cuentas de desarrollador específicas y habilitar la autenticación de dos factores , de preferencia con una llave de seguridad .

Mantén los grupos selectivos

Si usas la publicación de grupos, mantén el grupo limitado a desarrolladores de confianza. No aceptar solicitudes de membresía de personas desconocidas.

Nunca usar HTTP

Cuando solicites o envíes datos, evita una conexión HTTP. Supongamos que cualquier conexión HTTP tener espías o contener modificaciones. Siempre se debe preferir HTTPS, ya que cuenta con y evitan la mayoría de los ataques de intermediarios.

Cómo solicitar permisos mínimos

El navegador Chrome limita el acceso de una extensión a los privilegios que se solicitaron explícitamente en el manifiesto. Las extensiones deben minimizar sus permisos registrando únicamente APIs y los sitios web de los que dependen. El código arbitrario debe reducirse al mínimo.

Limitar los privilegios de una extensión limita lo que un atacante potencial puede explotar.

XMLHttpRequest de origen cruzado

Una extensión solo puede usar XMLHttpRequest para obtener recursos de sí misma y de dominios. especificadas en los permisos.

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "permissions": [
    "/*",
    "https://*.google.com/"
  ],
  "manifest_version": 2
}

Esta extensión solicita acceso a cualquier contenido de developer.chrome.com y a los subdominios de Google y se enumeran "/*" y "https://*google.com/" en los permisos. Si el botón si la extensión se ve comprometida, solo tendría permiso para interactuar con sitios web el patrón de coincidencia. El atacante no podría acceder a "https://user_bank_info.com" ni interactuar con "https://malicious_website.com".

Limita los campos del manifiesto

La inclusión de registros innecesarios en el manifiesto crea vulnerabilidades y hace que una extensión sea más visible. Limita los campos de manifiesto a aquellos en los que se basa la extensión y proporciona campos específicos de registro.

Se puede conectar de forma externa

Usa el campo externally_connectable para declarar a qué extensiones y páginas web externas se y la extensión intercambiará información. Restringir los usuarios con los que la extensión puede conectarse externamente fuentes confiables.

{
  "name": "Super Safe Extension",
  "externally_connectable": {
    "ids": [
      "iamafriendlyextensionhereisdatas"
    ],
    "matches": [
      "/*",
      "https://*google.com/"
    ],
    "accepts_tls_channel_id": false
  },
  ...
}

Recursos accesibles a través de la Web

Hacer que los recursos sean accesibles a través de la Web, en web_accessible_resources, hará que se extensión detectada por sitios web y atacantes.

{
  ...
  "web_accessible_resources": [
    "images/*.png",
    "style/secure_extension.css",
    "script/secure_extension.js"
  ],
  ...
}

Cuantos más recursos accesibles en la Web haya, más oportunidades de aprovechar un posible agresor. Conservar estos archivos al mínimo.

Incluye una política de seguridad de contenido explícito

Incluir una política de seguridad de contenido para la extensión en el manifiesto a fin de evitar la conexión entre sitios de secuencias de comandos. Si la extensión solo carga recursos desde ella misma, registra lo siguiente:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "content_security_policy": "default-src 'self'"
  "manifest_version": 2
}

Si la extensión necesita incluir secuencias de comandos de hosts específicos, se pueden incluir:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "content_security_policy": "default-src 'self' https://extension.resource.com"
  "manifest_version": 2
}

Evita las APIs ejecutables

Las APIs que ejecutan código deben reemplazarse por alternativas más seguras.

internalHTML y document.write()

Si bien puede ser más sencillo crear elementos HTML de forma dinámica con document.write() y innerHTML, abandona la extensión y las páginas web de las que depende la extensión, abiertas a los atacantes que inserten de comandos maliciosas. En su lugar, crea nodos del DOM manualmente y usa innerText para insertar contenido dinámico.

function constructDOM() {
  let newTitle = document.createElement('h1');
  newTitle.innerText = host;
  document.appendChild(newTitle);
}

eval()

Evita usar eval() siempre que sea posible para evitar ataques, ya que eval() ejecutará cualquier código que se pase. que pueden ser maliciosos.

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // WARNING! Might be evaluating an evil script!
    var resp = eval("(" + xhr.responseText + ")");
    ...
  }
}
xhr.send();

En cambio, prefieres métodos más seguros y rápidos, como JSON.parse()

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // JSON.parse does not evaluate the attacker's scripts.
    var resp = JSON.parse(xhr.responseText);
  }
}
xhr.send();

Usa cuidadosamente los guiones de contenido.

Si bien los scripts de contenido se encuentran en un mundo aislado, no son inmunes a los ataques:

  • Las secuencias de comandos de contenido son la única parte de una extensión que interactúa directamente con la página web. Por ello, las páginas web hostiles podrían manipular partes del DOM de las que depende la secuencia de comandos del contenido. o explotar comportamientos estándar de la Web sorprendentes, como los elementos con nombre.
  • Para interactuar con el DOM de las páginas web, las secuencias de comandos de contenido deben ejecutarse en el mismo proceso de renderizado que la página web. Esto hace que las secuencias de comandos de contenido sean vulnerables a la filtración de datos a través de ataques de canales secundarios (p.ej., Spectre), así como a que un atacante se haga cargo si se vulnera una página web maliciosa. el proceso del renderizador.

El trabajo sensible se debe realizar en un proceso dedicado, como el segundo plano de la extensión secuencia de comandos. Evita exponer por accidente los privilegios de una extensión a las secuencias de comandos del contenido:

  • Supongamos que es posible que un atacante haya creado los mensajes de una secuencia de comandos de contenido (p.ej., valida y limpia todas las entradas y protege tus secuencias de comandos de las secuencias de comandos entre sitios).
  • Supongamos que todos los datos que se envían a la secuencia de comandos de contenido pueden filtrarse en la página web. No envíes datos sensibles (p.ej., secretos de la extensión, datos de otros orígenes web, historial de navegación) hasta el contenido secuencias de comandos.
  • Limita el alcance de las acciones con privilegios que pueden activarse mediante las secuencias de comandos de contenido. No permitir secuencias de comandos de contenido para activar solicitudes a URLs arbitrarias o pasar argumentos arbitrarios a de extensión (p.ej., no permitir que se pasen URLs arbitrarias a fetch ni chrome.tabs.create).

Registra y limpia las entradas

Protege una extensión de secuencias de comandos maliciosas limitando los objetos de escucha a solo lo que es la extensión esperar, validar a los remitentes de los datos entrantes y limpiar todas las entradas.

Una extensión solo debe registrarse para runtime.onRequestExternal, si se espera. la comunicación desde una extensión o un sitio web externo. Siempre verifica que el remitente coincida con un fuente confiable.

// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";

chrome.runtime.onMessageExternal.addListener(
  function(request, sender, sendResponse) {
    if (sender.id === kFriendlyExtensionId)
      doSomething();
});

Incluso los mensajes mediante el evento runtime.onMessage de la propia extensión deben ser objeto de análisis asegúrate de que MessageSender no provenga de una secuencia de comandos de contenido comprometida.

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.allowedAction)
    console.log("This is an allowed action.");
});

Evita que una extensión ejecute la secuencia de comandos de un atacante desinfectando las entradas del usuario y las entradas datos, incluso de la extensión y de las fuentes aprobadas. Evita las APIs ejecutables.

function sanitizeInput(input) {
    return input.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;');
}