Vm2: TypeError: 'get' on proxy: property 'constants' es una propiedad de datos de solo lectura y no configurable en el destino del proxy, pero el proxy no devolvió su valor real

Creado en 7 mar. 2017  ·  15Comentarios  ·  Fuente: patriksimek/vm2

Noté esto al intentar requerir una dependencia en una máquina virtual. Algún código para reproducir:

const { NodeVM } = require("vm2");

const vm = new NodeVM({
  console: "redirect",
  sandbox: {},
  require: {
    builtin: ["fs"]
  },
  wrapper: "none"
});

vm.run("const fs = require('fs'); fs.constants");

Seguimiento de pila completa:

node_modules/vm2/lib/main.js:327
            throw this._internal.Decontextify.value(e);
            ^
TypeError: 'get' on proxy: property 'constants' is a read-only and non-configurable data property on the proxy target but the proxy did not return its actual value (expected '[object Object]' but got '[object Object]')
    at Object.<anonymous> (vm.js:1:91)
    at NodeVM.run (node_modules/vm2/lib/main.js:325:27)
    at Object.<anonymous> (script.js:12:4)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)
    at Module.runMain (module.js:590:10)
    at run (bootstrap_node.js:394:7)

¡Avísame si hay alguna otra información que pueda darte para ser útil!

bug confirmed help wanted

Comentario más útil

Me encontré con este error cuando exporté una _clase_ ES6 en el script que solía ejecutarse. estuvo bien después de que lo traduje a
ES5.

Todos 15 comentarios

También tengo bastantes problemas con los proxies, específicamente con la herencia. No estoy seguro de si estos problemas se deben a la implementación o una limitación de los Proxies, pero vale la pena investigar un poco.

También encontré este error. No estoy lo suficientemente familiarizado con los proxies para entender por qué el patrón actual no está bien, pero pude hacer que el error desapareciera agregando una verificación adicional para propiedades de solo lectura no configurables en Contextify.object.get :

    object: function(object, traps, deepTraps, flags, mock) {
        const proxy = new host.Proxy(object, host.Object.assign({
            get: (target, key, receiver) => {
                if (key === 'vmProxyTarget' && DEBUG) return object;
                if (key === 'isVMProxy') return true;
                if (mock && key in mock) return mock[key];
                if (key === 'constructor') return Object;
                if (key === '__proto__') return Object.prototype;

                                // Added code
                const config = host.Object.getOwnPropertyDescriptor(object, key);
                if (config && config.configurable === false && config.writable === false) {
                    return object[key];
                }

Esto parece seguir el MDN invariante get describe :

El valor informado para una propiedad debe ser el mismo que el valor de la propiedad del objeto de destino correspondiente si la propiedad del objeto de destino es una propiedad de datos que no se puede escribir ni se puede configurar.

Pero me parece que rompería el sandboxing

Solo intervengo para notar que también hemos encontrado este problema localmente, con el cambio de código anterior que nos permite evitar el problema. También notando que esto sucedió mientras usaba el módulo de nodo de Google Sheets en una copia casi exacta de su guía de inicio rápido (https://developers.google.com/sheets/api/quickstart/nodejs).

¿Hay alguna actualización sobre este tema?

¿Esta solución tiene algún efecto sobre el problema conocido " No es posible definir una clase que amplíe la clase proxiada ?" ¿Qué quieres decir con que rompería el sandboxing?

Oye, ¿algún progreso en este tema?
Intenté usar bibliotecas como graceful-fs y obtuve el mismo error.

Me encontré con este error cuando exporté una _clase_ ES6 en el script que solía ejecutarse. estuvo bien después de que lo traduje a
ES5.

Desafortunadamente, la solución publicada por @mjbvz rompe la caja de arena. No creo que haya una manera de solucionar ese problema: si el Proxy para el objeto de solo lectura no puede devolver nada más que el valor original, entonces estamos jodidos y arrojar el error es la única forma de mantener la caja de arena segura .

Las ideas son bienvenidas.

¿Podemos conseguir un clon en esta situación?

Clonar no ayuda, un clon también es un valor distinto.

Me refiero a un clon de fs.constants , por lo que ya no es de solo lectura.

Eso permitiría que una caja de arena realice cambios en el objeto que podrían causar problemas dentro del alcance del host. Debe tener mucho cuidado con lo que envía a la caja de arena porque cada cambio en el objeto realizado por la caja de arena también es efectivo en el contexto del host.

Si es de solo lectura, ¿incluso necesita un proxy para verificar cosas?

¿Hay alguna actualización sobre este tema?
Tengo el mismo problema cuando uso el módulo de nodo de googleapi ...

@XmiliaH ¡ Gracias! realmente lo aprecio. Está funcionando con la última versión.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

keyosk picture keyosk  ·  64Comentarios

CapacitorSet picture CapacitorSet  ·  13Comentarios

patriksimek picture patriksimek  ·  15Comentarios

wintertime-inc picture wintertime-inc  ·  5Comentarios

vshymanskyy picture vshymanskyy  ·  8Comentarios