Files
workinf_Blender_Wasm/tools/web/check-malicious-blends.mjs
2026-08-12 04:47:48 -04:00

38 lines
1.8 KiB
JavaScript

import assert from "node:assert/strict";
import fs from "node:fs";
import factory from "../../web/app/src/vendor/blender/web_engine.js";
const wasmBinary = fs.readFileSync(new URL("../../web/app/src/vendor/blender/web_engine.wasm", import.meta.url));
const valid = fs.readFileSync(new URL("../../tests/files/web/basic_scene.blend", import.meta.url));
const encoder = new TextEncoder();
const cases = [
{ name: "empty", bytes: new Uint8Array(0) },
{ name: "random", bytes: Uint8Array.from({ length: 4096 }, (_, index) => (index * 73 + 19) & 0xff) },
{ name: "truncated-header", bytes: valid.subarray(0, 11) },
{ name: "truncated-dna", bytes: valid.subarray(0, Math.min(8192, valid.length - 1)) },
{ name: "forged-block-size", bytes: (() => { const data = new Uint8Array(64); data.set(encoder.encode("BLENDER-v520")); data.set(encoder.encode("TEST"), 12); data.set([0xff, 0xff, 0xff, 0x7f], 16); return data; })() },
];
for (const fixture of cases) {
const engine = await factory({ wasmBinary });
const handle = engine._web_engine_create();
assert.ok(handle > 0);
try {
let pointer = 0;
if (fixture.bytes.byteLength > 0) {
pointer = engine._malloc(fixture.bytes.byteLength);
engine.HEAPU8.set(fixture.bytes, pointer);
}
const result = engine._web_engine_open_blend(handle, pointer, fixture.bytes.byteLength);
if (pointer) engine._free(pointer);
assert.notEqual(result, 0, `${fixture.name} malicious blend was accepted`);
const message = engine.UTF8ToString(engine._web_engine_last_error_message());
assert.ok(message.length > 0 && message.length < 1024, `${fixture.name} did not return a bounded structured error`);
}
finally {
engine._web_engine_destroy(handle);
}
}
process.stdout.write(`malicious-blends-ok rejected=${cases.length}\n`);