eval_villain
                                
                                
                                
                                    eval_villain copied to clipboard
                            
                            
                            
                        Direct vs indirect eval
This is more of an fyi since I have no suggested fix.
applyEvalVillain("eval") turns direct eval into indirect eval
https://github.com/swoops/eval_villain/blob/8c49852dee59d2541dcb4a5cede68b76c0878caf/src/js/switcheroo.js#L385
Since eval !== %eval%, all eval becomes direct eval.
You can see the difference in
const x = 'indirect';
(() => {
  const x = 'direct';
  console.log(`eval(x) => ${ eval('x') }`);  // -> indirect
  console.log(`(0, eval)(x) => ${ (0, eval)('x') }`);  // -> direct
})();
This happens because of step 6.a in 12.3.4.1
- If Type(ref) is Reference and IsPropertyReference(ref) is false and GetReferencedName(ref) is "eval", then a. If SameValue(func, %eval%) is true, then
 
when evaluating function calls where the function is the identifier eval.
I was unaware of this behavior.
This could lead to false positives/negatives or breaking sites. It could also be used to identify when Eval Villain is hooking eval in the page.
Thanks
It could also be used to identify when Eval Villain is hooking eval in the page.
Yeah.
function isEvalHooked() {
  var Object = 0;  // Mask the global.
  return eval('typeof Object') !== 'number';
}
console.log(isEvalHooked());  // -> false
eval = new Proxy(eval, {});
console.log(isEvalHooked());  // -> true