1
0
mirror of https://github.com/kkapsner/CanvasBlocker synced 2024-12-22 12:50:36 +01:00

Fix function tampering detection via prototype

For #619 and #685
This commit is contained in:
kkapsner 2024-04-08 00:05:50 +02:00
parent 7bb3f00b45
commit 54c625cd26
2 changed files with 53 additions and 6 deletions

View File

@ -167,25 +167,71 @@
type: "value", type: "value",
changed: alteredToString changed: alteredToString
}); });
const wrappedReflect = wrappedWindow.Reflect;
const originalReflectSetPrototypeOf = wrappedReflect.setPrototypeOf;
const alteredReflectSetPrototypeOf = scope.exportFunctionWithName(
function setPrototypeOf(target, prototype){
target = scope.getWrapped(target);
if (proxies.has(target)){
target = proxies.get(target).wrappedOriginal;
}
if (proxies.has(prototype)){
prototype = proxies.get(prototype).wrappedOriginal;
}
const grandPrototype = wrappedReflect.getPrototypeOf(prototype);
if (proxies.has(grandPrototype)){
const testPrototype = wrappedWindow.Object.create(proxies.get(grandPrototype).wrappedOriginal);
const value = originalReflectSetPrototypeOf.call(wrappedReflect, target, testPrototype);
if (!value){
return false;
}
}
const value = originalReflectSetPrototypeOf.call(wrappedReflect, target, scope.getWrapped(prototype));
return value;
}, window, "setPrototypeOf"
);
scope.changeProperty(window, "toString", {
object: wrappedWindow.Reflect,
name: "setPrototypeOf",
type: "value",
changed: alteredReflectSetPrototypeOf
});
} }
scope.createProxyFunction = function createProxyFunction(window, original, replacement){ scope.createProxyFunction = function createProxyFunction(window, original, replacement){
setupWindowForProxies(window); setupWindowForProxies(window);
const handler = scope.getWrapped(window).Object.create(null); const wrappedObject = scope.getWrapped(window).Object;
handler.apply = scope.exportFunctionWithName(function(target, thisArgs, args){ const handler = wrappedObject.create(null);
handler.apply = scope.exportFunctionWithName(function(target, thisArg, args){
try { try {
return args.length? return args.length?
replacement.call(thisArgs, ...args): replacement.call(thisArg, ...args):
replacement.call(thisArgs); replacement.call(thisArg);
} }
catch (error){ catch (error){
try { try {
return original.apply(thisArgs, args); return original.apply(thisArg, args);
} }
catch (error){ catch (error){
return target.apply(thisArgs, args); return target.apply(thisArg, args);
} }
} }
}, window, ""); }, window, "");
handler.setPrototypeOf = scope.exportFunctionWithName(function(target, prototype){
target = scope.getWrapped(target);
if (proxies.has(target)){
target = proxies.get(target).wrappedOriginal;
}
if (proxies.has(prototype)){
prototype = proxies.get(prototype).wrappedOriginal;
}
const grandPrototype = wrappedObject.getPrototypeOf(prototype);
if (proxies.has(grandPrototype)){
const testPrototype = wrappedObject.create(proxies.get(grandPrototype).wrappedOriginal);
wrappedObject.setPrototypeOf(target, testPrototype);
}
return wrappedObject.setPrototypeOf(target, scope.getWrapped(prototype));
}, window, "");
const proxy = new window.Proxy(original, handler); const proxy = new window.Proxy(original, handler);
const proxyData = { const proxyData = {
original: original, original: original,

View File

@ -7,6 +7,7 @@ Version 1.10.1:
fixes: fixes:
- lag and functionality loss on google sites - lag and functionality loss on google sites
- fix function tampering detection via prototype
- isPointInPath and isPointInStroke return undefined with persistent rng - isPointInPath and isPointInStroke return undefined with persistent rng
known issues: known issues: