UNPKG

@nodesecure/js-x-ray

Version:
68 lines 2.36 kB
import { generateWarning } from "../warnings.js"; import { CALL_EXPRESSION_DATA } from "../contants.js"; import { VariableTracer } from "../VariableTracer.js"; // CONSTANTS const kRunInContextTracedFunctions = Symbol("runInContextTracedFunctions"); function validateNode(node, ctx) { if (node.type !== "CallExpression") { return [false]; } const { tracer } = ctx.sourceFile; if (!tracer.importedModules.has("vm")) { return [false]; } const identifierOrMemberExpr = ctx.context[CALL_EXPRESSION_DATA]?.identifierOrMemberExpr; if (ctx.context[kRunInContextTracedFunctions]?.has(identifierOrMemberExpr)) { ctx.setEntryPoint("script"); return [true]; } return [identifierOrMemberExpr === "vm.runInNewContext"]; } function initialize(ctx) { const { tracer } = ctx.sourceFile; const runInContextTracedFunctions = new Set(); ctx.context[kRunInContextTracedFunctions] = runInContextTracedFunctions; tracer.trace("vm.runInNewContext", { followConsecutiveAssignment: true, moduleName: "vm" }); tracer.trace("vm.Script", { followReturnValueAssignement: true, followConsecutiveAssignment: true, moduleName: "vm" }); tracer.on(VariableTracer.ReturnValueEvent, (payload) => { if (payload.name === "vm.Script") { const runInContractTracedFunction = `${payload.id}.runInContext`; runInContextTracedFunctions.add(runInContractTracedFunction); tracer.trace(runInContractTracedFunction, { followConsecutiveAssignment: true }); } }); } function runInNewContextHandler(node, ctx) { ctx.sourceFile.warnings.push(generateWarning("unsafe-vm-context", { value: "vm.runInNewContext", location: node.loc })); } function scriptRunInContextHandler(node, ctx) { ctx.sourceFile.warnings.push(generateWarning("unsafe-vm-context", { value: "(new vm.Script(code, options)).runInContext", location: node.loc })); } export default { name: "unsafe-vm-context", nodeTypes: ["CallExpression"], validateNode, main: { default: runInNewContextHandler, script: scriptRunInContextHandler }, initialize, breakOnMatch: false, context: {} }; //# sourceMappingURL=unsafe-vm-context.js.map