bla-agents 1.1.0 → 1.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/blind-llm-agents/SKILL.md +20 -14
- package/DISCLAIMER.md +15 -7
- package/README.md +153 -198
- package/dist/bundler/index.d.ts +19 -2
- package/dist/bundler/index.d.ts.map +1 -1
- package/dist/bundler/index.js +47 -4
- package/dist/bundler/index.js.map +1 -1
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +123 -18
- package/dist/cli.js.map +1 -1
- package/dist/core/config.d.ts +54 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +160 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/coverage-contract.d.ts +97 -0
- package/dist/core/coverage-contract.d.ts.map +1 -0
- package/dist/core/coverage-contract.js +164 -0
- package/dist/core/coverage-contract.js.map +1 -0
- package/dist/core/debug-posture.d.ts +40 -0
- package/dist/core/debug-posture.d.ts.map +1 -0
- package/dist/core/debug-posture.js +197 -0
- package/dist/core/debug-posture.js.map +1 -0
- package/dist/core/detector.d.ts.map +1 -1
- package/dist/core/detector.js +58 -6
- package/dist/core/detector.js.map +1 -1
- package/dist/core/identifiers.d.ts +32 -0
- package/dist/core/identifiers.d.ts.map +1 -0
- package/dist/core/identifiers.js +263 -0
- package/dist/core/identifiers.js.map +1 -0
- package/dist/core/llm-directives.d.ts +12 -0
- package/dist/core/llm-directives.d.ts.map +1 -0
- package/dist/core/llm-directives.js +23 -0
- package/dist/core/llm-directives.js.map +1 -0
- package/dist/core/prng.d.ts +10 -1
- package/dist/core/prng.d.ts.map +1 -1
- package/dist/core/prng.js +27 -2
- package/dist/core/prng.js.map +1 -1
- package/dist/core/release-plan.d.ts +68 -0
- package/dist/core/release-plan.d.ts.map +1 -0
- package/dist/core/release-plan.js +235 -0
- package/dist/core/release-plan.js.map +1 -0
- package/dist/core/sarif.d.ts +53 -0
- package/dist/core/sarif.d.ts.map +1 -0
- package/dist/core/sarif.js +91 -0
- package/dist/core/sarif.js.map +1 -0
- package/dist/core/sqlite-runtime.d.ts +13 -0
- package/dist/core/sqlite-runtime.d.ts.map +1 -1
- package/dist/core/sqlite-runtime.js +38 -8
- package/dist/core/sqlite-runtime.js.map +1 -1
- package/dist/core/types.d.ts +7 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/engine/auditor.d.ts.map +1 -1
- package/dist/engine/auditor.js +251 -8
- package/dist/engine/auditor.js.map +1 -1
- package/dist/engine/benchmark.d.ts +1 -1
- package/dist/engine/benchmark.d.ts.map +1 -1
- package/dist/engine/benchmark.js +121 -41
- package/dist/engine/benchmark.js.map +1 -1
- package/dist/engine/defender.d.ts +1 -0
- package/dist/engine/defender.d.ts.map +1 -1
- package/dist/engine/defender.js +7 -1
- package/dist/engine/defender.js.map +1 -1
- package/dist/engine/harden.d.ts +61 -0
- package/dist/engine/harden.d.ts.map +1 -0
- package/dist/engine/harden.js +292 -0
- package/dist/engine/harden.js.map +1 -0
- package/dist/engine/protector.d.ts.map +1 -1
- package/dist/engine/protector.js +162 -21
- package/dist/engine/protector.js.map +1 -1
- package/dist/identity.d.ts +112 -2
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +112 -2
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +26 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -9
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +59 -152
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +466 -50
- package/dist/mcp/server.js.map +1 -1
- package/dist/setup/clients.d.ts +49 -1
- package/dist/setup/clients.d.ts.map +1 -1
- package/dist/setup/clients.js +1193 -20
- package/dist/setup/clients.js.map +1 -1
- package/dist/setup/doctor.d.ts +58 -14
- package/dist/setup/doctor.d.ts.map +1 -1
- package/dist/setup/doctor.js +316 -22
- package/dist/setup/doctor.js.map +1 -1
- package/dist/setup/setup.d.ts +77 -7
- package/dist/setup/setup.d.ts.map +1 -1
- package/dist/setup/setup.js +591 -62
- package/dist/setup/setup.js.map +1 -1
- package/dist/shields/chaff/chaff-generator.d.ts.map +1 -1
- package/dist/shields/chaff/chaff-generator.js +12 -3
- package/dist/shields/chaff/chaff-generator.js.map +1 -1
- package/dist/shields/deception/architecture-mirage.js +1 -1
- package/dist/shields/deception/architecture-mirage.js.map +1 -1
- package/dist/shields/deception/canary-honeypot.d.ts +33 -0
- package/dist/shields/deception/canary-honeypot.d.ts.map +1 -0
- package/dist/shields/deception/canary-honeypot.js +95 -0
- package/dist/shields/deception/canary-honeypot.js.map +1 -0
- package/dist/shields/deception/cognitive-armor-trigger.d.ts +43 -0
- package/dist/shields/deception/cognitive-armor-trigger.d.ts.map +1 -0
- package/dist/shields/deception/cognitive-armor-trigger.js +204 -0
- package/dist/shields/deception/cognitive-armor-trigger.js.map +1 -0
- package/dist/shields/deception/crash-trace-decoy.js +1 -1
- package/dist/shields/deception/crash-trace-decoy.js.map +1 -1
- package/dist/shields/deception/decompiler-illusion.js +1 -1
- package/dist/shields/deception/decompiler-illusion.js.map +1 -1
- package/dist/shields/deception/diff-noise-injector.js +1 -1
- package/dist/shields/deception/diff-noise-injector.js.map +1 -1
- package/dist/shields/deception/evidence-contract-poison.js +1 -1
- package/dist/shields/deception/evidence-contract-poison.js.map +1 -1
- package/dist/shields/deception/format-payloads.d.ts +21 -0
- package/dist/shields/deception/format-payloads.d.ts.map +1 -0
- package/dist/shields/deception/format-payloads.js +24 -0
- package/dist/shields/deception/format-payloads.js.map +1 -0
- package/dist/shields/deception/index.d.ts +10 -2
- package/dist/shields/deception/index.d.ts.map +1 -1
- package/dist/shields/deception/index.js +20 -3
- package/dist/shields/deception/index.js.map +1 -1
- package/dist/shields/deception/prompt-completion-poison.d.ts +3 -2
- package/dist/shields/deception/prompt-completion-poison.d.ts.map +1 -1
- package/dist/shields/deception/prompt-completion-poison.js +6 -3
- package/dist/shields/deception/prompt-completion-poison.js.map +1 -1
- package/dist/shields/deception/shadow-business-logic.js +4 -4
- package/dist/shields/deception/shadow-business-logic.js.map +1 -1
- package/dist/shields/deception/system-diagnostic-decoy.d.ts +36 -0
- package/dist/shields/deception/system-diagnostic-decoy.d.ts.map +1 -0
- package/dist/shields/deception/system-diagnostic-decoy.js +101 -0
- package/dist/shields/deception/system-diagnostic-decoy.js.map +1 -0
- package/dist/shields/exhaustion/asar-header-amplifier.d.ts +12 -3
- package/dist/shields/exhaustion/asar-header-amplifier.d.ts.map +1 -1
- package/dist/shields/exhaustion/asar-header-amplifier.js +30 -8
- package/dist/shields/exhaustion/asar-header-amplifier.js.map +1 -1
- package/dist/shields/exhaustion/bpe-token-amplifier.js +2 -2
- package/dist/shields/exhaustion/bpe-token-amplifier.js.map +1 -1
- package/dist/shields/exhaustion/callgraph-labyrinth.js +2 -2
- package/dist/shields/exhaustion/callgraph-labyrinth.js.map +1 -1
- package/dist/shields/exhaustion/cdp-shape-budget-breaker.js +1 -1
- package/dist/shields/exhaustion/cdp-shape-budget-breaker.js.map +1 -1
- package/dist/shields/exhaustion/frida-capture-saturation.d.ts +10 -5
- package/dist/shields/exhaustion/frida-capture-saturation.d.ts.map +1 -1
- package/dist/shields/exhaustion/frida-capture-saturation.js +21 -8
- package/dist/shields/exhaustion/frida-capture-saturation.js.map +1 -1
- package/dist/shields/exhaustion/index.d.ts +2 -2
- package/dist/shields/exhaustion/index.d.ts.map +1 -1
- package/dist/shields/exhaustion/index.js +2 -2
- package/dist/shields/exhaustion/index.js.map +1 -1
- package/dist/shields/exhaustion/obligation-flooder.d.ts +17 -5
- package/dist/shields/exhaustion/obligation-flooder.d.ts.map +1 -1
- package/dist/shields/exhaustion/obligation-flooder.js +20 -8
- package/dist/shields/exhaustion/obligation-flooder.js.map +1 -1
- package/dist/shields/exhaustion/rea-budget-matrix.d.ts +8 -2
- package/dist/shields/exhaustion/rea-budget-matrix.d.ts.map +1 -1
- package/dist/shields/exhaustion/rea-budget-matrix.js +139 -16
- package/dist/shields/exhaustion/rea-budget-matrix.js.map +1 -1
- package/dist/shields/exhaustion/regex-worker-tarpit.d.ts.map +1 -1
- package/dist/shields/exhaustion/regex-worker-tarpit.js +2 -1
- package/dist/shields/exhaustion/regex-worker-tarpit.js.map +1 -1
- package/dist/shields/exhaustion/wasm-interface-exhaustion.d.ts +7 -4
- package/dist/shields/exhaustion/wasm-interface-exhaustion.d.ts.map +1 -1
- package/dist/shields/exhaustion/wasm-interface-exhaustion.js +16 -7
- package/dist/shields/exhaustion/wasm-interface-exhaustion.js.map +1 -1
- package/dist/shields/formats/android-dex-xref.d.ts +19 -0
- package/dist/shields/formats/android-dex-xref.d.ts.map +1 -0
- package/dist/shields/formats/android-dex-xref.js +427 -0
- package/dist/shields/formats/android-dex-xref.js.map +1 -0
- package/dist/shields/formats/android-manifest.d.ts +44 -0
- package/dist/shields/formats/android-manifest.d.ts.map +1 -0
- package/dist/shields/formats/android-manifest.js +240 -0
- package/dist/shields/formats/android-manifest.js.map +1 -0
- package/dist/shields/formats/android-r8.d.ts +44 -0
- package/dist/shields/formats/android-r8.d.ts.map +1 -0
- package/dist/shields/formats/android-r8.js +246 -0
- package/dist/shields/formats/android-r8.js.map +1 -0
- package/dist/shields/formats/apple-plist.d.ts +15 -0
- package/dist/shields/formats/apple-plist.d.ts.map +1 -1
- package/dist/shields/formats/apple-plist.js +59 -1
- package/dist/shields/formats/apple-plist.js.map +1 -1
- package/dist/shields/formats/archive.d.ts +27 -6
- package/dist/shields/formats/archive.d.ts.map +1 -1
- package/dist/shields/formats/archive.js +247 -45
- package/dist/shields/formats/archive.js.map +1 -1
- package/dist/shields/formats/asar.d.ts +50 -10
- package/dist/shields/formats/asar.d.ts.map +1 -1
- package/dist/shields/formats/asar.js +265 -39
- package/dist/shields/formats/asar.js.map +1 -1
- package/dist/shields/formats/bun-standalone.d.ts +78 -0
- package/dist/shields/formats/bun-standalone.d.ts.map +1 -0
- package/dist/shields/formats/bun-standalone.js +272 -0
- package/dist/shields/formats/bun-standalone.js.map +1 -0
- package/dist/shields/formats/dotnet-managed.d.ts +9 -0
- package/dist/shields/formats/dotnet-managed.d.ts.map +1 -1
- package/dist/shields/formats/dotnet-managed.js +26 -1
- package/dist/shields/formats/dotnet-managed.js.map +1 -1
- package/dist/shields/formats/electron-fuses.d.ts +63 -8
- package/dist/shields/formats/electron-fuses.d.ts.map +1 -1
- package/dist/shields/formats/electron-fuses.js +297 -65
- package/dist/shields/formats/electron-fuses.js.map +1 -1
- package/dist/shields/formats/erlang-beam.d.ts +34 -0
- package/dist/shields/formats/erlang-beam.d.ts.map +1 -0
- package/dist/shields/formats/erlang-beam.js +319 -0
- package/dist/shields/formats/erlang-beam.js.map +1 -0
- package/dist/shields/formats/evm-bytecode.d.ts +28 -0
- package/dist/shields/formats/evm-bytecode.d.ts.map +1 -0
- package/dist/shields/formats/evm-bytecode.js +124 -0
- package/dist/shields/formats/evm-bytecode.js.map +1 -0
- package/dist/shields/formats/go-flutter-exhaustion.d.ts +55 -0
- package/dist/shields/formats/go-flutter-exhaustion.d.ts.map +1 -0
- package/dist/shields/formats/go-flutter-exhaustion.js +346 -0
- package/dist/shields/formats/go-flutter-exhaustion.js.map +1 -0
- package/dist/shields/formats/gpu-ptx.d.ts +40 -0
- package/dist/shields/formats/gpu-ptx.d.ts.map +1 -0
- package/dist/shields/formats/gpu-ptx.js +62 -0
- package/dist/shields/formats/gpu-ptx.js.map +1 -0
- package/dist/shields/formats/headers.d.ts.map +1 -1
- package/dist/shields/formats/headers.js +54 -14
- package/dist/shields/formats/headers.js.map +1 -1
- package/dist/shields/formats/jvm-bytecode.d.ts +20 -0
- package/dist/shields/formats/jvm-bytecode.d.ts.map +1 -0
- package/dist/shields/formats/jvm-bytecode.js +134 -0
- package/dist/shields/formats/jvm-bytecode.js.map +1 -0
- package/dist/shields/formats/mobile-game.d.ts +4 -0
- package/dist/shields/formats/mobile-game.d.ts.map +1 -1
- package/dist/shields/formats/mobile-game.js +16 -0
- package/dist/shields/formats/mobile-game.js.map +1 -1
- package/dist/shields/formats/model.d.ts +22 -8
- package/dist/shields/formats/model.d.ts.map +1 -1
- package/dist/shields/formats/model.js +231 -59
- package/dist/shields/formats/model.js.map +1 -1
- package/dist/shields/formats/native.d.ts +65 -11
- package/dist/shields/formats/native.d.ts.map +1 -1
- package/dist/shields/formats/native.js +413 -108
- package/dist/shields/formats/native.js.map +1 -1
- package/dist/shields/formats/pcap-capture.d.ts +27 -0
- package/dist/shields/formats/pcap-capture.d.ts.map +1 -0
- package/dist/shields/formats/pcap-capture.js +201 -0
- package/dist/shields/formats/pcap-capture.js.map +1 -0
- package/dist/shields/formats/python.d.ts +22 -1
- package/dist/shields/formats/python.d.ts.map +1 -1
- package/dist/shields/formats/python.js +568 -27
- package/dist/shields/formats/python.js.map +1 -1
- package/dist/shields/formats/sourcemap.d.ts.map +1 -1
- package/dist/shields/formats/sourcemap.js +2 -0
- package/dist/shields/formats/sourcemap.js.map +1 -1
- package/dist/shields/formats/sqlite.d.ts +87 -15
- package/dist/shields/formats/sqlite.d.ts.map +1 -1
- package/dist/shields/formats/sqlite.js +377 -42
- package/dist/shields/formats/sqlite.js.map +1 -1
- package/dist/shields/formats/wasm.d.ts +6 -0
- package/dist/shields/formats/wasm.d.ts.map +1 -1
- package/dist/shields/formats/wasm.js +118 -3
- package/dist/shields/formats/wasm.js.map +1 -1
- package/dist/shields/javascript/ast-shield.d.ts +25 -5
- package/dist/shields/javascript/ast-shield.d.ts.map +1 -1
- package/dist/shields/javascript/ast-shield.js +428 -58
- package/dist/shields/javascript/ast-shield.js.map +1 -1
- package/dist/shields/runtime/memory-diff-shield.d.ts +56 -0
- package/dist/shields/runtime/memory-diff-shield.d.ts.map +1 -0
- package/dist/shields/runtime/memory-diff-shield.js +170 -0
- package/dist/shields/runtime/memory-diff-shield.js.map +1 -0
- package/dist/shields/runtime/runtime-shield.d.ts +12 -16
- package/dist/shields/runtime/runtime-shield.d.ts.map +1 -1
- package/dist/shields/runtime/runtime-shield.js +30 -24
- package/dist/shields/runtime/runtime-shield.js.map +1 -1
- package/dist/shields/tarpit/opaque-predicates.d.ts.map +1 -1
- package/dist/shields/tarpit/opaque-predicates.js +3 -3
- package/dist/shields/tarpit/opaque-predicates.js.map +1 -1
- package/dist/shields/tarpit/tarpit-generator.d.ts +9 -4
- package/dist/shields/tarpit/tarpit-generator.d.ts.map +1 -1
- package/dist/shields/tarpit/tarpit-generator.js +30 -23
- package/dist/shields/tarpit/tarpit-generator.js.map +1 -1
- package/package.json +13 -6
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { REA_INTERNAL_LIMITS } from "../../identity.js";
|
|
2
|
+
import { SeededPrng } from "../../core/prng.js";
|
|
3
|
+
import { buildCanaryAndDiagnosticPayloads } from "../deception/format-payloads.js";
|
|
4
|
+
const FOR1 = Buffer.from("FOR1", "latin1");
|
|
5
|
+
const BEAM = Buffer.from("BEAM", "latin1");
|
|
6
|
+
function u32be(value) {
|
|
7
|
+
const b = Buffer.alloc(4);
|
|
8
|
+
b.writeUInt32BE(value >>> 0);
|
|
9
|
+
return b;
|
|
10
|
+
}
|
|
11
|
+
function pad4(bytes) {
|
|
12
|
+
const pad = (4 - (bytes.length % 4)) % 4;
|
|
13
|
+
return pad === 0 ? bytes : Buffer.concat([bytes, Buffer.alloc(pad)]);
|
|
14
|
+
}
|
|
15
|
+
function encodeChunk(name, payload) {
|
|
16
|
+
if (name.length !== 4)
|
|
17
|
+
throw new Error(`BEAM chunk name must be 4 chars: ${name}`);
|
|
18
|
+
return Buffer.concat([
|
|
19
|
+
Buffer.from(name, "latin1"),
|
|
20
|
+
u32be(payload.length),
|
|
21
|
+
pad4(payload),
|
|
22
|
+
]);
|
|
23
|
+
}
|
|
24
|
+
/** Non-compact AtU8 atom table (positive count, 1-byte lengths). */
|
|
25
|
+
function encodeAtU8(names) {
|
|
26
|
+
const parts = [u32be(names.length)];
|
|
27
|
+
for (const name of names) {
|
|
28
|
+
const encoded = Buffer.from(name, "utf8");
|
|
29
|
+
if (encoded.length > 255) {
|
|
30
|
+
throw new Error(`BEAM atom name too long for non-compact encoding: ${name}`);
|
|
31
|
+
}
|
|
32
|
+
parts.push(Buffer.from([encoded.length]), encoded);
|
|
33
|
+
}
|
|
34
|
+
return encodeChunk("AtU8", Buffer.concat(parts));
|
|
35
|
+
}
|
|
36
|
+
function parseBeamChunks(bytes) {
|
|
37
|
+
if (bytes.length < 12 ||
|
|
38
|
+
bytes.subarray(0, 4).toString("latin1") !== "FOR1" ||
|
|
39
|
+
bytes.subarray(8, 12).toString("latin1") !== "BEAM") {
|
|
40
|
+
return { valid: false, formSize: 0, chunks: [] };
|
|
41
|
+
}
|
|
42
|
+
const formSize = bytes.readUInt32BE(4);
|
|
43
|
+
const formEnd = 8 + formSize;
|
|
44
|
+
if (formEnd > bytes.length)
|
|
45
|
+
return { valid: false, formSize, chunks: [] };
|
|
46
|
+
const chunks = [];
|
|
47
|
+
let at = 12;
|
|
48
|
+
while (at + 8 <= formEnd) {
|
|
49
|
+
const name = bytes.subarray(at, at + 4).toString("latin1");
|
|
50
|
+
const size = bytes.readUInt32BE(at + 4);
|
|
51
|
+
const payloadOffset = at + 8;
|
|
52
|
+
const padded = payloadOffset + size + ((4 - (size % 4)) % 4);
|
|
53
|
+
if (padded > formEnd || payloadOffset + size > bytes.length)
|
|
54
|
+
break;
|
|
55
|
+
chunks.push({
|
|
56
|
+
name,
|
|
57
|
+
payload: Buffer.from(bytes.subarray(payloadOffset, payloadOffset + size)),
|
|
58
|
+
});
|
|
59
|
+
at = padded;
|
|
60
|
+
}
|
|
61
|
+
return { valid: true, formSize, chunks };
|
|
62
|
+
}
|
|
63
|
+
/** OTP 28+ compact unsigned `u` tag encoder (mirrors REA BeamParser). */
|
|
64
|
+
function encodeCompactU(value) {
|
|
65
|
+
if (!Number.isInteger(value) || value < 0) {
|
|
66
|
+
throw new Error(`compact u value must be a non-negative integer: ${value}`);
|
|
67
|
+
}
|
|
68
|
+
if (value < 16)
|
|
69
|
+
return Buffer.from([(value << 4) & 0xff]);
|
|
70
|
+
if (value < 0x800) {
|
|
71
|
+
return Buffer.from([0x08 | (((value >> 8) & 0x07) << 5), value & 0xff]);
|
|
72
|
+
}
|
|
73
|
+
if (value <= 0xffff) {
|
|
74
|
+
return Buffer.from([0x18, (value >> 8) & 0xff, value & 0xff]);
|
|
75
|
+
}
|
|
76
|
+
if (value <= 0xffffff) {
|
|
77
|
+
return Buffer.from([
|
|
78
|
+
0x38,
|
|
79
|
+
(value >> 16) & 0xff,
|
|
80
|
+
(value >> 8) & 0xff,
|
|
81
|
+
value & 0xff,
|
|
82
|
+
]);
|
|
83
|
+
}
|
|
84
|
+
throw new Error(`compact u value too large for atom length: ${value}`);
|
|
85
|
+
}
|
|
86
|
+
function decodeCompactU(payload, at) {
|
|
87
|
+
if (at >= payload.length)
|
|
88
|
+
return null;
|
|
89
|
+
const first = payload[at];
|
|
90
|
+
if ((first & 0x07) !== 0)
|
|
91
|
+
return null;
|
|
92
|
+
if ((first & 0x08) === 0) {
|
|
93
|
+
return { value: first >> 4, next: at + 1 };
|
|
94
|
+
}
|
|
95
|
+
if ((first & 0x10) === 0) {
|
|
96
|
+
if (at + 1 >= payload.length)
|
|
97
|
+
return null;
|
|
98
|
+
return {
|
|
99
|
+
value: ((first >> 5) << 8) | payload[at + 1],
|
|
100
|
+
next: at + 2,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const byteCountCode = first >> 5;
|
|
104
|
+
if (byteCountCode === 7)
|
|
105
|
+
return null;
|
|
106
|
+
const byteCount = byteCountCode + 2;
|
|
107
|
+
const start = at + 1;
|
|
108
|
+
if (start + byteCount > payload.length)
|
|
109
|
+
return null;
|
|
110
|
+
let value = 0;
|
|
111
|
+
for (let i = 0; i < byteCount; i++) {
|
|
112
|
+
value = (value << 8) | payload[start + i];
|
|
113
|
+
}
|
|
114
|
+
return { value, next: start + byteCount };
|
|
115
|
+
}
|
|
116
|
+
function decodeAtU8Table(payload) {
|
|
117
|
+
if (payload.length < 4)
|
|
118
|
+
return { names: [], compact: false };
|
|
119
|
+
const declared = payload.readInt32BE(0);
|
|
120
|
+
const compact = declared < 0;
|
|
121
|
+
const count = Math.abs(declared);
|
|
122
|
+
if (count === 0)
|
|
123
|
+
return { names: [], compact };
|
|
124
|
+
const names = [];
|
|
125
|
+
let at = 4;
|
|
126
|
+
for (let i = 0; i < count; i++) {
|
|
127
|
+
if (at >= payload.length)
|
|
128
|
+
break;
|
|
129
|
+
let length;
|
|
130
|
+
let next;
|
|
131
|
+
if (compact) {
|
|
132
|
+
const decoded = decodeCompactU(payload, at);
|
|
133
|
+
if (decoded === null)
|
|
134
|
+
break;
|
|
135
|
+
length = decoded.value;
|
|
136
|
+
next = decoded.next;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
length = payload[at];
|
|
140
|
+
next = at + 1;
|
|
141
|
+
}
|
|
142
|
+
at = next;
|
|
143
|
+
if (at + length > payload.length)
|
|
144
|
+
break;
|
|
145
|
+
names.push(payload.subarray(at, at + length).toString("utf8"));
|
|
146
|
+
at += length;
|
|
147
|
+
}
|
|
148
|
+
return { names, compact };
|
|
149
|
+
}
|
|
150
|
+
/** Encode AtU8 body (not wrapped in IFF chunk) in compact or classic form. */
|
|
151
|
+
function encodeAtU8Body(names, compact) {
|
|
152
|
+
if (compact) {
|
|
153
|
+
const parts = [Buffer.alloc(4)];
|
|
154
|
+
parts[0].writeInt32BE(-names.length);
|
|
155
|
+
for (const name of names) {
|
|
156
|
+
const enc = Buffer.from(name, "utf8");
|
|
157
|
+
parts.push(encodeCompactU(enc.length), enc);
|
|
158
|
+
}
|
|
159
|
+
return Buffer.concat(parts);
|
|
160
|
+
}
|
|
161
|
+
const parts = [u32be(names.length)];
|
|
162
|
+
for (const name of names) {
|
|
163
|
+
const enc = Buffer.from(name, "utf8");
|
|
164
|
+
if (enc.length > 255)
|
|
165
|
+
continue;
|
|
166
|
+
parts.push(Buffer.from([enc.length]), enc);
|
|
167
|
+
}
|
|
168
|
+
return Buffer.concat(parts);
|
|
169
|
+
}
|
|
170
|
+
export function inspectErlangBeam(bytes) {
|
|
171
|
+
const parsed = parseBeamChunks(bytes);
|
|
172
|
+
let atomCount = 0;
|
|
173
|
+
for (const chunk of parsed.chunks) {
|
|
174
|
+
if (chunk.name === "AtU8" || chunk.name === "Atom") {
|
|
175
|
+
if (chunk.payload.length >= 4) {
|
|
176
|
+
atomCount = Math.abs(chunk.payload.readInt32BE(0));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
const text = bytes.toString("latin1");
|
|
181
|
+
return {
|
|
182
|
+
validMagic: parsed.valid,
|
|
183
|
+
formSize: parsed.formSize,
|
|
184
|
+
chunkCount: parsed.chunks.length,
|
|
185
|
+
chunkNames: parsed.chunks.map((c) => c.name),
|
|
186
|
+
atomCount,
|
|
187
|
+
blaProtected: text.includes("[BLA-BEAM-SHIELD]") ||
|
|
188
|
+
parsed.chunks.some((c) => c.name.startsWith("Bla")),
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function rebuildBeam(chunks) {
|
|
192
|
+
const body = Buffer.concat([
|
|
193
|
+
BEAM,
|
|
194
|
+
...chunks.map((c) => encodeChunk(c.name, c.payload)),
|
|
195
|
+
]);
|
|
196
|
+
return Buffer.concat([FOR1, u32be(body.length), body]);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Protects an Erlang BEAM IFF container:
|
|
200
|
+
* - Preserves original chunk order and non-AtU8 payloads (Code/ExpT/ImpT stay intact).
|
|
201
|
+
* - Appends canary atoms onto AtU8 tables (classic or OTP28+ compact), preserving
|
|
202
|
+
* original atom indices and compact/classic encoding style.
|
|
203
|
+
* - Appends decoy IFF chunks past REA's default `max_chunks` (64) budget.
|
|
204
|
+
*/
|
|
205
|
+
export function protectErlangBeamBuffer(input, options = {}) {
|
|
206
|
+
const intensity = options.intensity ?? "balanced";
|
|
207
|
+
const prng = new SeededPrng(options.seed ?? "bla-beam-shield");
|
|
208
|
+
const deception = buildCanaryAndDiagnosticPayloads(prng, intensity);
|
|
209
|
+
const parsed = parseBeamChunks(input);
|
|
210
|
+
const baseChunks = parsed.valid
|
|
211
|
+
? parsed.chunks.map((c) => ({ name: c.name, payload: Buffer.from(c.payload) }))
|
|
212
|
+
: [
|
|
213
|
+
{
|
|
214
|
+
name: "AtU8",
|
|
215
|
+
payload: (() => {
|
|
216
|
+
// Minimal valid module atoms so ExpT can reference indices.
|
|
217
|
+
const names = ["bla_beam_module", "module_info", "start"];
|
|
218
|
+
const parts = [u32be(names.length)];
|
|
219
|
+
for (const name of names) {
|
|
220
|
+
const enc = Buffer.from(name, "utf8");
|
|
221
|
+
parts.push(Buffer.from([enc.length]), enc);
|
|
222
|
+
}
|
|
223
|
+
return Buffer.concat(parts);
|
|
224
|
+
})(),
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
name: "Code",
|
|
228
|
+
payload: Buffer.concat([
|
|
229
|
+
u32be(16),
|
|
230
|
+
u32be(0),
|
|
231
|
+
u32be(169),
|
|
232
|
+
u32be(4),
|
|
233
|
+
u32be(2),
|
|
234
|
+
Buffer.from("code"),
|
|
235
|
+
]),
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
name: "ExpT",
|
|
239
|
+
payload: Buffer.concat([u32be(1), u32be(2), u32be(0), u32be(1)]),
|
|
240
|
+
},
|
|
241
|
+
];
|
|
242
|
+
// Expand non-compact AtU8 in place (keep original atom indices).
|
|
243
|
+
let atomsInjected = 0;
|
|
244
|
+
let exceedsDefaultAtomBudget = false;
|
|
245
|
+
const atomExtraTarget = intensity === "bankrupt" || intensity === "maximum"
|
|
246
|
+
? REA_INTERNAL_LIMITS.BEAM_DEFAULT_MAX_ATOMS + 64
|
|
247
|
+
: 48;
|
|
248
|
+
for (let i = 0; i < baseChunks.length; i++) {
|
|
249
|
+
const chunk = baseChunks[i];
|
|
250
|
+
if (chunk.name !== "AtU8")
|
|
251
|
+
continue;
|
|
252
|
+
const table = decodeAtU8Table(chunk.payload);
|
|
253
|
+
if (table.names.length === 0 && chunk.payload.length >= 4) {
|
|
254
|
+
// Empty or undecodable — skip atom mutation; decoy chunks still apply.
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
const existing = table.names;
|
|
258
|
+
const extras = [
|
|
259
|
+
"bla_beam_canary",
|
|
260
|
+
`[BLA-BEAM-SHIELD]`,
|
|
261
|
+
...deception.textRecords
|
|
262
|
+
.map((r) => r.replace(/[^\w.:/=+-]/g, "_").slice(0, 200))
|
|
263
|
+
.filter((r) => r.length > 0)
|
|
264
|
+
.slice(0, 16),
|
|
265
|
+
];
|
|
266
|
+
while (existing.length + extras.length < atomExtraTarget) {
|
|
267
|
+
extras.push(`bla_tarpit_atom_${extras.length}_${prng.hex(4)}`);
|
|
268
|
+
}
|
|
269
|
+
const merged = [...existing, ...extras];
|
|
270
|
+
atomsInjected = extras.length;
|
|
271
|
+
exceedsDefaultAtomBudget =
|
|
272
|
+
merged.length > REA_INTERNAL_LIMITS.BEAM_DEFAULT_MAX_ATOMS;
|
|
273
|
+
baseChunks[i] = {
|
|
274
|
+
name: "AtU8",
|
|
275
|
+
payload: encodeAtU8Body(merged, table.compact),
|
|
276
|
+
};
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
// Decoy chunks: push past default max_chunks (64); bankrupt approaches hard 256.
|
|
280
|
+
const targetChunks = intensity === "bankrupt"
|
|
281
|
+
? REA_INTERNAL_LIMITS.BEAM_MAX_CHUNKS + 4
|
|
282
|
+
: intensity === "maximum"
|
|
283
|
+
? REA_INTERNAL_LIMITS.BEAM_DEFAULT_MAX_CHUNKS + 32
|
|
284
|
+
: REA_INTERNAL_LIMITS.BEAM_DEFAULT_MAX_CHUNKS + 8;
|
|
285
|
+
const decoyPayload = Buffer.from([
|
|
286
|
+
"[BLA-BEAM-SHIELD]",
|
|
287
|
+
...deception.textRecords.slice(0, 8),
|
|
288
|
+
`BLA_BEAM_CANARY=${prng.hex(16)}`,
|
|
289
|
+
].join("\0") + "\0", "utf8");
|
|
290
|
+
let chunksInjected = 0;
|
|
291
|
+
while (baseChunks.length < targetChunks) {
|
|
292
|
+
const idx = chunksInjected;
|
|
293
|
+
// 4-char IFF names; "Bla0".."Bla9" then "Bl10"+ via hex
|
|
294
|
+
const name = idx < 10
|
|
295
|
+
? `Bla${idx}`
|
|
296
|
+
: idx < 36
|
|
297
|
+
? `Bl${idx.toString(36).padStart(2, "0")}`.slice(0, 4)
|
|
298
|
+
: `B${idx.toString(36).padStart(3, "0")}`.slice(0, 4);
|
|
299
|
+
baseChunks.push({
|
|
300
|
+
name: name.padEnd(4, "x").slice(0, 4),
|
|
301
|
+
payload: Buffer.concat([
|
|
302
|
+
decoyPayload,
|
|
303
|
+
Buffer.from(`\nchunk=${idx}\n`, "utf8"),
|
|
304
|
+
]),
|
|
305
|
+
});
|
|
306
|
+
chunksInjected++;
|
|
307
|
+
}
|
|
308
|
+
const buffer = rebuildBeam(baseChunks);
|
|
309
|
+
return {
|
|
310
|
+
buffer,
|
|
311
|
+
chunksInjected,
|
|
312
|
+
atomsInjected,
|
|
313
|
+
canaryTokensEmbedded: deception.canary.syntheticCanaryTokens.length,
|
|
314
|
+
diagnosticsEmbedded: deception.diagnostics.diagnosticsInjected.length,
|
|
315
|
+
exceedsDefaultChunkBudget: baseChunks.length > REA_INTERNAL_LIMITS.BEAM_DEFAULT_MAX_CHUNKS,
|
|
316
|
+
exceedsDefaultAtomBudget,
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=erlang-beam.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"erlang-beam.js","sourceRoot":"","sources":["../../../src/shields/formats/erlang-beam.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ProtectionIntensity } from "../../core/types.js";
|
|
2
|
+
/** Build Solidity terminal metadata CBOR + 2-byte big-endian length trailer. */
|
|
3
|
+
export declare function buildSolidityMetadataTrailer(entries: readonly (readonly [string, string | Buffer])[]): Buffer;
|
|
4
|
+
export interface EvmBytecodeInspection {
|
|
5
|
+
readonly byteLength: number;
|
|
6
|
+
readonly hasSolidityMetadata: boolean;
|
|
7
|
+
readonly metadataBytes: number;
|
|
8
|
+
readonly blaProtected: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function inspectEvmBytecode(bytes: Buffer): EvmBytecodeInspection;
|
|
11
|
+
/**
|
|
12
|
+
* Protects EVM contract bytecode by appending Solidity-compatible terminal
|
|
13
|
+
* CBOR metadata packed with canary/diagnostic strings. Optional bankrupt
|
|
14
|
+
* padding inserts JUMPDEST filler before the metadata (runtime-equivalent for
|
|
15
|
+
* contracts that never fall through into the padding).
|
|
16
|
+
*/
|
|
17
|
+
export declare function protectEvmBytecodeBuffer(input: Buffer, options?: {
|
|
18
|
+
readonly intensity?: ProtectionIntensity;
|
|
19
|
+
readonly seed?: string;
|
|
20
|
+
}): {
|
|
21
|
+
readonly buffer: Buffer;
|
|
22
|
+
readonly metadataBytes: number;
|
|
23
|
+
readonly canaryTokensEmbedded: number;
|
|
24
|
+
readonly diagnosticsEmbedded: number;
|
|
25
|
+
readonly paddingBytes: number;
|
|
26
|
+
readonly approachesInputBudget: boolean;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=evm-bytecode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm-bytecode.d.ts","sourceRoot":"","sources":["../../../src/shields/formats/evm-bytecode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAkC/D,gFAAgF;AAChF,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,EAAE,GACvD,MAAM,CAaR;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAmBvE;AAgBD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IACP,QAAQ,CAAC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACnB,GACL;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;CACzC,CA2CA"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { REA_INTERNAL_LIMITS } from "../../identity.js";
|
|
2
|
+
import { SeededPrng } from "../../core/prng.js";
|
|
3
|
+
import { buildCanaryAndDiagnosticPayloads } from "../deception/format-payloads.js";
|
|
4
|
+
function cborHeader(major, length) {
|
|
5
|
+
if (length < 24)
|
|
6
|
+
return Buffer.from([(major << 5) | length]);
|
|
7
|
+
if (length < 256)
|
|
8
|
+
return Buffer.from([(major << 5) | 24, length]);
|
|
9
|
+
if (length < 65536) {
|
|
10
|
+
const b = Buffer.alloc(3);
|
|
11
|
+
b[0] = (major << 5) | 25;
|
|
12
|
+
b.writeUInt16BE(length, 1);
|
|
13
|
+
return b;
|
|
14
|
+
}
|
|
15
|
+
const b = Buffer.alloc(5);
|
|
16
|
+
b[0] = (major << 5) | 26;
|
|
17
|
+
b.writeUInt32BE(length, 1);
|
|
18
|
+
return b;
|
|
19
|
+
}
|
|
20
|
+
function cborText(value) {
|
|
21
|
+
const body = Buffer.from(value, "utf8");
|
|
22
|
+
return Buffer.concat([cborHeader(3, body.length), body]);
|
|
23
|
+
}
|
|
24
|
+
function cborBytes(value) {
|
|
25
|
+
return Buffer.concat([cborHeader(2, value.length), value]);
|
|
26
|
+
}
|
|
27
|
+
function cborMap(entries) {
|
|
28
|
+
return Buffer.concat([
|
|
29
|
+
cborHeader(5, entries.length),
|
|
30
|
+
...entries.flatMap(([k, v]) => [k, v]),
|
|
31
|
+
]);
|
|
32
|
+
}
|
|
33
|
+
/** Build Solidity terminal metadata CBOR + 2-byte big-endian length trailer. */
|
|
34
|
+
export function buildSolidityMetadataTrailer(entries) {
|
|
35
|
+
const encoded = cborMap(entries.map(([key, value]) => [
|
|
36
|
+
cborText(key),
|
|
37
|
+
typeof value === "string" ? cborText(value) : cborBytes(value),
|
|
38
|
+
]));
|
|
39
|
+
if (encoded.length > 0xffff) {
|
|
40
|
+
throw new Error("Solidity metadata CBOR exceeds uint16 length");
|
|
41
|
+
}
|
|
42
|
+
const len = Buffer.alloc(2);
|
|
43
|
+
len.writeUInt16BE(encoded.length);
|
|
44
|
+
return Buffer.concat([encoded, len]);
|
|
45
|
+
}
|
|
46
|
+
export function inspectEvmBytecode(bytes) {
|
|
47
|
+
let hasSolidityMetadata = false;
|
|
48
|
+
let metadataBytes = 0;
|
|
49
|
+
if (bytes.length >= 3) {
|
|
50
|
+
const length = bytes[bytes.length - 2] * 256 + bytes[bytes.length - 1];
|
|
51
|
+
const offset = bytes.length - 2 - length;
|
|
52
|
+
if (length > 0 && offset >= 0 && bytes[offset] >> 5 === 5) {
|
|
53
|
+
hasSolidityMetadata = true;
|
|
54
|
+
metadataBytes = length;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const text = bytes.toString("utf8");
|
|
58
|
+
return {
|
|
59
|
+
byteLength: bytes.length,
|
|
60
|
+
hasSolidityMetadata,
|
|
61
|
+
metadataBytes,
|
|
62
|
+
blaProtected: text.includes("[BLA-EVM-SHIELD]") || text.includes("bla_evm_canary"),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Strips a prior terminal Solidity metadata CBOR (if present) so a fresh
|
|
67
|
+
* adversarial trailer can be appended without nesting length suffixes.
|
|
68
|
+
*/
|
|
69
|
+
function stripTerminalMetadata(bytes) {
|
|
70
|
+
if (bytes.length < 3)
|
|
71
|
+
return bytes;
|
|
72
|
+
const length = bytes[bytes.length - 2] * 256 + bytes[bytes.length - 1];
|
|
73
|
+
const offset = bytes.length - 2 - length;
|
|
74
|
+
if (length > 0 && offset >= 0 && bytes[offset] >> 5 === 5) {
|
|
75
|
+
return bytes.subarray(0, offset);
|
|
76
|
+
}
|
|
77
|
+
return bytes;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Protects EVM contract bytecode by appending Solidity-compatible terminal
|
|
81
|
+
* CBOR metadata packed with canary/diagnostic strings. Optional bankrupt
|
|
82
|
+
* padding inserts JUMPDEST filler before the metadata (runtime-equivalent for
|
|
83
|
+
* contracts that never fall through into the padding).
|
|
84
|
+
*/
|
|
85
|
+
export function protectEvmBytecodeBuffer(input, options = {}) {
|
|
86
|
+
const intensity = options.intensity ?? "balanced";
|
|
87
|
+
const prng = new SeededPrng(options.seed ?? "bla-evm-shield");
|
|
88
|
+
const deception = buildCanaryAndDiagnosticPayloads(prng, intensity);
|
|
89
|
+
const base = stripTerminalMetadata(input.length > 0 ? input : Buffer.from([0x00]));
|
|
90
|
+
const metaEntries = [
|
|
91
|
+
["solc", Buffer.from([0x00, 0x08, 0x1e])], // 0.8.30
|
|
92
|
+
["bla", "[BLA-EVM-SHIELD]"],
|
|
93
|
+
["bla_evm_canary", prng.hex(16)],
|
|
94
|
+
];
|
|
95
|
+
for (const rec of deception.textRecords.slice(0, 12)) {
|
|
96
|
+
const key = `bla_${metaEntries.length}`;
|
|
97
|
+
metaEntries.push([key, rec.slice(0, 200)]);
|
|
98
|
+
}
|
|
99
|
+
const metadata = buildSolidityMetadataTrailer(metaEntries);
|
|
100
|
+
let padding = Buffer.alloc(0);
|
|
101
|
+
if (intensity === "bankrupt") {
|
|
102
|
+
// Full approach of REA's 4 MiB `inputBytes` budget (leave a small slack
|
|
103
|
+
// so the artifact still fits under the hard ceiling after metadata).
|
|
104
|
+
const target = REA_INTERNAL_LIMITS.EVM_INPUT_BYTES - 4096;
|
|
105
|
+
const need = Math.max(0, target - base.length - metadata.length);
|
|
106
|
+
// 0x5b = JUMPDEST; inert when never jumped to (runtime-equivalent).
|
|
107
|
+
padding = Buffer.alloc(need, 0x5b);
|
|
108
|
+
}
|
|
109
|
+
else if (intensity === "maximum") {
|
|
110
|
+
const need = 64 * 1024;
|
|
111
|
+
padding = Buffer.alloc(need, 0x5b);
|
|
112
|
+
}
|
|
113
|
+
// balanced stays lean: metadata only, no JUMPDEST padding.
|
|
114
|
+
const buffer = Buffer.concat([base, padding, metadata]);
|
|
115
|
+
return {
|
|
116
|
+
buffer,
|
|
117
|
+
metadataBytes: metadata.length - 2,
|
|
118
|
+
canaryTokensEmbedded: deception.canary.syntheticCanaryTokens.length,
|
|
119
|
+
diagnosticsEmbedded: deception.diagnostics.diagnosticsInjected.length,
|
|
120
|
+
paddingBytes: padding.length,
|
|
121
|
+
approachesInputBudget: buffer.length >= REA_INTERNAL_LIMITS.EVM_INPUT_BYTES - 8192,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=evm-bytecode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm-bytecode.js","sourceRoot":"","sources":["../../../src/shields/formats/evm-bytecode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { SeededPrng } from "../../core/prng.js";
|
|
2
|
+
import type { ProtectionIntensity } from "../../core/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Framed Go buildinfo (magic `\xff Go buildinf:` + inline encoding) with
|
|
5
|
+
* MODULE_START/END wrapping, plus `.gopclntab` / `runtime.moduledata` bait.
|
|
6
|
+
* Bankrupt/maximum pad the module past `MAX_BUILD_INFO_BYTES` (1 MiB).
|
|
7
|
+
*
|
|
8
|
+
* Trailer placement poisons whole-file scanners. Prefer
|
|
9
|
+
* {@link buildMappedGoBuildInfoPlant} inside a real `.go.buildinfo` section /
|
|
10
|
+
* writable PT_LOAD so REA's mapped parser (`GoBuildInfoSearch`) trips.
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildGoBuildInfoExhaustionPayload(prng: SeededPrng, intensity?: ProtectionIntensity): {
|
|
13
|
+
readonly buffer: Buffer;
|
|
14
|
+
readonly exceedsMaxBuildInfoBytes: boolean;
|
|
15
|
+
readonly moduleBytes: number;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Compact plant for a real mapped `.go.buildinfo` / writable PT_LOAD region.
|
|
19
|
+
* Bankrupt claims an inline version length past `MAX_BUILD_INFO_BYTES` so REA's
|
|
20
|
+
* mapped parser resource-fails without needing a 1 MiB section. Balanced writes
|
|
21
|
+
* a valid small framed module. Capacity is respected (never overflows the section).
|
|
22
|
+
*/
|
|
23
|
+
export declare function buildMappedGoBuildInfoPlant(intensity: ProtectionIntensity, capacity: number): {
|
|
24
|
+
readonly buffer: Buffer;
|
|
25
|
+
readonly tripsMaxBuildInfoBytes: boolean;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Dense NUL-terminated package:/dart:/class-like pool sized to fit `capacity`,
|
|
29
|
+
* for planting inside a real Dart isolate snapshot data region.
|
|
30
|
+
*/
|
|
31
|
+
export declare function buildMappedFlutterIsolatePoolPlant(capacity: number, prng: SeededPrng, options?: {
|
|
32
|
+
readonly includeSnapshotHeader?: boolean;
|
|
33
|
+
}): {
|
|
34
|
+
readonly buffer: Buffer;
|
|
35
|
+
readonly packageAndDartUris: number;
|
|
36
|
+
readonly classLikeTokens: number;
|
|
37
|
+
readonly snapshotHeaderBytes: number;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Dart snapshot-hash overflow (>64) plus string-pool URI/token flood past
|
|
41
|
+
* `MAX_POOL_URIS` (500) and `MAX_POOL_TOKENS` (2000).
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildFlutterPoolExhaustionPayload(prng: SeededPrng): {
|
|
44
|
+
readonly buffer: Buffer;
|
|
45
|
+
readonly snapshotHashes: number;
|
|
46
|
+
readonly packageAndDartUris: number;
|
|
47
|
+
readonly classLikeTokens: number;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Synthetic ELF64 with a mapped `.go.buildinfo` section and an isolate-data
|
|
51
|
+
* region (plus dynsym for `_kDartIsolateSnapshotData`) so REA's real Go /
|
|
52
|
+
* Flutter parsers can be exercised in tests and the benchmark.
|
|
53
|
+
*/
|
|
54
|
+
export declare function buildMappedGoFlutterElfFixture(): Buffer;
|
|
55
|
+
//# sourceMappingURL=go-flutter-exhaustion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go-flutter-exhaustion.d.ts","sourceRoot":"","sources":["../../../src/shields/formats/go-flutter-exhaustion.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAiB/D;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,UAAU,EAChB,SAAS,GAAE,mBAAgC,GAC1C;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,wBAAwB,EAAE,OAAO,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CA4DA;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,mBAAmB,EAC9B,QAAQ,EAAE,MAAM,GACf;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;CAC1C,CAsCA;AAED;;;GAGG;AACH,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,OAAO,GAAE;IAAE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAO,GACzD;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC,CA2EA;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,UAAU,GAAG;IACnE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC,CAgDA;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,IAAI,MAAM,CAgHvD"}
|