@nodesecure/js-x-ray
Version:
JavaScript AST XRay analysis
68 lines • 2.36 kB
JavaScript
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