Percebi isso ao tentar exigir uma dependência em uma VM. Algum código para reproduzir:
const { NodeVM } = require("vm2");
const vm = new NodeVM({
console: "redirect",
sandbox: {},
require: {
builtin: ["fs"]
},
wrapper: "none"
});
vm.run("const fs = require('fs'); fs.constants");
Rastreamento de pilha completo:
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)
Avise-me se houver alguma outra informação que eu possa lhe dar para ser útil!
Também estou tendo alguns problemas com proxies, especificamente com herança. Não tenho certeza se esses problemas são devido à implementação ou a uma limitação dos Proxies, mas vale a pena investigar.
Também encontrou este erro. Não estou familiarizado o suficiente com proxies para entender por que o padrão atual não está bom, mas consegui eliminar o erro adicionando uma verificação extra para propriedades não configuráveis somente leitura em 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];
}
Isso parece seguir o get
invariante que o MDN descreve :
O valor relatado para uma propriedade deve ser igual ao valor da propriedade do objeto de destino correspondente se a propriedade do objeto de destino for uma propriedade de dados não gravável e não configurável.
Mas me parece que isso quebraria o sandboxing
Apenas entrando em contato para observar que também encontramos esse problema localmente, com a alteração do código acima nos permitindo contornar o problema. Observando também que isso aconteceu ao usar o módulo de nó do Planilhas Google em uma cópia quase exata do guia de início rápido (https://developers.google.com/sheets/api/quickstart/nodejs).
Há alguma atualização sobre esse problema?
Esta correção tem efeito sobre o problema conhecido " Não é possível definir uma classe que estende a classe com proxy ?" O que você quer dizer com isso quebraria o sandbox?
Ei, algum progresso neste assunto?
Tentei usar bibliotecas como graceful-fs
e obtive o mesmo erro.
Encontrei este erro quando exportei uma _class_ ES6 no script usado para executar. estava tudo bem depois que eu traduzi para
ES5.
Infelizmente, a solução postada por @mjbvz quebra a sandbox. Não acho que haja uma maneira de corrigir esse problema - se o proxy para objeto somente leitura não puder retornar nada além do valor original, estamos ferrados e lançar o erro é a única maneira de manter a sandbox segura .
As ideias são muito bem-vindas.
Podemos obter um clone nesta situação?
Clone não ajuda - um clone também é um valor distinto.
Eu quis dizer um clone de fs.constants
, então não é mais somente leitura.
Isso permitiria a uma sandbox fazer alterações no objeto que poderiam causar problemas dentro do escopo do host. Você precisa ter muito cuidado com o que enviar para a sandbox porque cada alteração no objeto feita pela sandbox também é eficaz no contexto do host.
Se for somente leitura, você precisa de um proxy para verificar as coisas?
Existe alguma atualização sobre este problema?
Estou tendo o mesmo problema ao usar o módulo de nó googleapi ...
Corrigido com https://github.com/patriksimek/vm2/pull/252.
@XmiliaH Obrigado! realmente aprecio isso. Ele está funcionando com a versão mais recente.
Comentários muito úteis
Encontrei este erro quando exportei uma _class_ ES6 no script usado para executar. estava tudo bem depois que eu traduzi para
ES5.