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. Para proteger estas cuentas, crea cuentas de desarrollador específicas y habilita la autenticación de dos factores, preferiblemente con una llave de seguridad.

Cómo mantener la selectividad de los grupos

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

Nunca uses HTTP

Cuando solicites o envíes datos, evita una conexión HTTP. Supongamos que cualquier conexión HTTP tendrá escuchas o contendrá modificaciones. Siempre se debe preferir HTTPS, ya que tiene seguridad integrada que elude 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, ya que solo deben registrar las 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 posible atacante puede aprovechar.

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 con qué extensiones y páginas web externas intercambiará información la extensió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 a la Web haya disponibles, más posibilidades tendrá un atacante potencial de aprovecharse de ellos. Mantén estos archivos al mínimo.

Incluye una política de seguridad del contenido explícita

Incluye una política de seguridad del contenido para la extensión en el manifiesto para evitar ataques de secuencias de comandos entre sitios. 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 de la siguiente manera:

{
  "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 le pase, lo que puede ser malicioso.

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 su lugar, prefiere 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 las secuencias de comandos de contenido viven en un mundo aislado, no están exentas de 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 canal lateral (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 accidentalmente los privilegios de la extensión a las secuencias de comandos de contenido:

  • Supongamos que un atacante pudo haber creado mensajes de una secuencia de comandos de contenido (p. ej., valida y limpia todas las entradas y protege tus secuencias de comandos de la secuencia de comandos entre sitios).
  • Supongamos que los datos que se envían a la secuencia de comandos de contenido podrían filtrarse a 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) a las secuencias de comandos de contenido.
  • 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 API de extensión (p.ej., no permite pasar URLs arbitrarias a fetch ni chrome.tabs.create).

Registra y limpia las entradas

Para proteger una extensión de secuencias de comandos maliciosas, limita los objetos de escucha solo a lo que espera la extensión, valida a los remitentes de los datos entrantes y limpia 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 valida que el remitente coincida con una 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 a través del evento runtime.onMessage de la extensión deben analizarse para garantizar 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;');
}