bla-agents 1.1.0 → 1.6.0
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-exposure.d.ts.map +1 -1
- package/dist/core/release-exposure.js +13 -2
- package/dist/core/release-exposure.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 +244 -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 +95 -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 +380 -19
- 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 +294 -0
- package/dist/engine/harden.js.map +1 -0
- package/dist/engine/protector.d.ts.map +1 -1
- package/dist/engine/protector.js +242 -26
- 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 +5 -5
- 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 +23 -6
- package/dist/shields/exhaustion/obligation-flooder.d.ts.map +1 -1
- package/dist/shields/exhaustion/obligation-flooder.js +29 -12
- 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 +74 -11
- package/dist/shields/formats/native.d.ts.map +1 -1
- package/dist/shields/formats/native.js +557 -109
- 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 +26 -5
- package/dist/shields/javascript/ast-shield.d.ts.map +1 -1
- package/dist/shields/javascript/ast-shield.js +748 -104
- 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,346 @@
|
|
|
1
|
+
import { REA_INTERNAL_LIMITS } from "../../identity.js";
|
|
2
|
+
function writeGoUvarint(value) {
|
|
3
|
+
const out = [];
|
|
4
|
+
let n = value >>> 0;
|
|
5
|
+
while (n >= 0x80) {
|
|
6
|
+
out.push((n & 0x7f) | 0x80);
|
|
7
|
+
n >>>= 7;
|
|
8
|
+
}
|
|
9
|
+
out.push(n);
|
|
10
|
+
return Buffer.from(out);
|
|
11
|
+
}
|
|
12
|
+
const GO_MAGIC = Buffer.from("ff20476f206275696c64696e663a", "hex");
|
|
13
|
+
const MODULE_START = Buffer.from("3077af0c9274080241e1c107e6d618e6", "hex");
|
|
14
|
+
const MODULE_END = Buffer.from("f932433186182072008242104116d8f2", "hex");
|
|
15
|
+
/**
|
|
16
|
+
* Framed Go buildinfo (magic `\xff Go buildinf:` + inline encoding) with
|
|
17
|
+
* MODULE_START/END wrapping, plus `.gopclntab` / `runtime.moduledata` bait.
|
|
18
|
+
* Bankrupt/maximum pad the module past `MAX_BUILD_INFO_BYTES` (1 MiB).
|
|
19
|
+
*
|
|
20
|
+
* Trailer placement poisons whole-file scanners. Prefer
|
|
21
|
+
* {@link buildMappedGoBuildInfoPlant} inside a real `.go.buildinfo` section /
|
|
22
|
+
* writable PT_LOAD so REA's mapped parser (`GoBuildInfoSearch`) trips.
|
|
23
|
+
*/
|
|
24
|
+
export function buildGoBuildInfoExhaustionPayload(prng, intensity = "balanced") {
|
|
25
|
+
const padAlign = Buffer.alloc(16, 0);
|
|
26
|
+
const version = Buffer.from("go1.22.5", "utf8");
|
|
27
|
+
const canaryLines = [
|
|
28
|
+
"path\tgithub.com/tee-enclave/zero-trust-shim\n",
|
|
29
|
+
`mod\tgithub.com/tee-enclave/zero-trust-shim\tv4.2.0\th1:${prng.hex(32)}=\n`,
|
|
30
|
+
`dep\tgithub.com/intel-sgx/enclave-sdk-go\tv2.14.0\th1:${prng.hex(32)}=\n`,
|
|
31
|
+
`dep\tgithub.com/google/go-tpm-tools\tv0.4.4\th1:${prng.hex(32)}=\n`,
|
|
32
|
+
"build\t-compiler=gc\n",
|
|
33
|
+
"build\tCGO_ENABLED=1\n",
|
|
34
|
+
`build\tBLA_CANARY=${prng.hex(16)}\n`,
|
|
35
|
+
];
|
|
36
|
+
let moduleBody = Buffer.from(canaryLines.join(""), "utf8");
|
|
37
|
+
const target = intensity === "bankrupt" || intensity === "maximum"
|
|
38
|
+
? REA_INTERNAL_LIMITS.GO_MAX_BUILD_INFO_BYTES + 4096
|
|
39
|
+
: Math.min(24_000, REA_INTERNAL_LIMITS.GO_MAX_BUILD_INFO_BYTES >> 3);
|
|
40
|
+
if (version.length + moduleBody.length < target) {
|
|
41
|
+
const need = target - version.length - moduleBody.length;
|
|
42
|
+
const noise = Buffer.from(`\npath\tgithub.com/bla/tarpit/${prng.hex(8)}\n` +
|
|
43
|
+
"A".repeat(Math.max(0, need - 40)), "utf8");
|
|
44
|
+
moduleBody = Buffer.concat([moduleBody, noise]);
|
|
45
|
+
}
|
|
46
|
+
const moduleFramed = Buffer.concat([
|
|
47
|
+
MODULE_START,
|
|
48
|
+
moduleBody,
|
|
49
|
+
Buffer.from("\n", "utf8"),
|
|
50
|
+
MODULE_END,
|
|
51
|
+
]);
|
|
52
|
+
const exceeds = version.length + moduleFramed.length >
|
|
53
|
+
REA_INTERNAL_LIMITS.GO_MAX_BUILD_INFO_BYTES;
|
|
54
|
+
const header = Buffer.alloc(32, 0);
|
|
55
|
+
GO_MAGIC.copy(header, 0);
|
|
56
|
+
header[14] = 8; // ptrSize
|
|
57
|
+
header[15] = 2; // flags: bit1 => inline encoding
|
|
58
|
+
const pclntabBait = Buffer.from("\0[BLA-GO-BUILDINFO]\0.gopclntab\0runtime.moduledata\0__gopclntab\0runtime.pclntab\0\xfb\xff\xff\xff\x00\x00", "latin1");
|
|
59
|
+
return {
|
|
60
|
+
buffer: Buffer.concat([
|
|
61
|
+
padAlign,
|
|
62
|
+
header,
|
|
63
|
+
writeGoUvarint(version.length),
|
|
64
|
+
version,
|
|
65
|
+
writeGoUvarint(moduleFramed.length),
|
|
66
|
+
moduleFramed,
|
|
67
|
+
pclntabBait,
|
|
68
|
+
]),
|
|
69
|
+
exceedsMaxBuildInfoBytes: exceeds,
|
|
70
|
+
moduleBytes: moduleFramed.length,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Compact plant for a real mapped `.go.buildinfo` / writable PT_LOAD region.
|
|
75
|
+
* Bankrupt claims an inline version length past `MAX_BUILD_INFO_BYTES` so REA's
|
|
76
|
+
* mapped parser resource-fails without needing a 1 MiB section. Balanced writes
|
|
77
|
+
* a valid small framed module. Capacity is respected (never overflows the section).
|
|
78
|
+
*/
|
|
79
|
+
export function buildMappedGoBuildInfoPlant(intensity, capacity) {
|
|
80
|
+
if (capacity < 40) {
|
|
81
|
+
return { buffer: Buffer.alloc(0), tripsMaxBuildInfoBytes: false };
|
|
82
|
+
}
|
|
83
|
+
const header = Buffer.alloc(32, 0);
|
|
84
|
+
GO_MAGIC.copy(header, 0);
|
|
85
|
+
header[14] = 8;
|
|
86
|
+
header[15] = 2;
|
|
87
|
+
const marker = Buffer.from("\0[BLA-GO-MAPPED]\0", "latin1");
|
|
88
|
+
if (intensity === "bankrupt" || intensity === "maximum") {
|
|
89
|
+
const claim = writeGoUvarint(REA_INTERNAL_LIMITS.GO_MAX_BUILD_INFO_BYTES + 1);
|
|
90
|
+
const plant = Buffer.concat([header, claim, marker]);
|
|
91
|
+
return {
|
|
92
|
+
buffer: plant.subarray(0, Math.min(plant.length, capacity)),
|
|
93
|
+
tripsMaxBuildInfoBytes: true,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const version = Buffer.from("go1.22.5", "utf8");
|
|
97
|
+
const module = Buffer.from("path\tgithub.com/bla/mapped-buildinfo\nbuild\t-compiler=gc\n", "utf8");
|
|
98
|
+
const plant = Buffer.concat([
|
|
99
|
+
header,
|
|
100
|
+
writeGoUvarint(version.length),
|
|
101
|
+
version,
|
|
102
|
+
writeGoUvarint(module.length),
|
|
103
|
+
module,
|
|
104
|
+
marker,
|
|
105
|
+
]);
|
|
106
|
+
return {
|
|
107
|
+
buffer: plant.subarray(0, Math.min(plant.length, capacity)),
|
|
108
|
+
tripsMaxBuildInfoBytes: false,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Dense NUL-terminated package:/dart:/class-like pool sized to fit `capacity`,
|
|
113
|
+
* for planting inside a real Dart isolate snapshot data region.
|
|
114
|
+
*/
|
|
115
|
+
export function buildMappedFlutterIsolatePoolPlant(capacity, prng, options = {}) {
|
|
116
|
+
if (capacity <= 0) {
|
|
117
|
+
return {
|
|
118
|
+
buffer: Buffer.alloc(0),
|
|
119
|
+
packageAndDartUris: 0,
|
|
120
|
+
classLikeTokens: 0,
|
|
121
|
+
snapshotHeaderBytes: 0,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const parts = [];
|
|
125
|
+
let headerBytes = 0;
|
|
126
|
+
if (options.includeSnapshotHeader !== false && capacity >= 52) {
|
|
127
|
+
const rec = Buffer.alloc(52, 0);
|
|
128
|
+
rec[0] = 0xf5;
|
|
129
|
+
rec[1] = 0xf5;
|
|
130
|
+
rec[2] = 0xdc;
|
|
131
|
+
rec[3] = 0xdc;
|
|
132
|
+
rec.writeBigUInt64LE(64n, 4);
|
|
133
|
+
rec.writeBigUInt64LE(3n, 12);
|
|
134
|
+
rec.write(prng.hex(32), 20, "ascii");
|
|
135
|
+
parts.push(rec);
|
|
136
|
+
headerBytes = 52;
|
|
137
|
+
}
|
|
138
|
+
let used = headerBytes;
|
|
139
|
+
let uris = 0;
|
|
140
|
+
let tokens = 0;
|
|
141
|
+
const marker = Buffer.from("\0[BLA-FLUTTER-MAPPED]\0", "utf8");
|
|
142
|
+
if (used + marker.length <= capacity) {
|
|
143
|
+
parts.push(marker);
|
|
144
|
+
used += marker.length;
|
|
145
|
+
}
|
|
146
|
+
// REA caps package_uris and dart_uris independently at MAX_POOL_URIS (500).
|
|
147
|
+
// Plant each kind past the cap (not a combined budget).
|
|
148
|
+
const uriTarget = REA_INTERNAL_LIMITS.DART_MAX_POOL_URIS + 32;
|
|
149
|
+
let i = 0;
|
|
150
|
+
while (used < capacity && i < uriTarget) {
|
|
151
|
+
// Keep strings short so a mapped section can exceed REA pool caps.
|
|
152
|
+
const pkg = `package:m${i}/b.dart\0`;
|
|
153
|
+
const pkgBuf = Buffer.from(pkg, "utf8");
|
|
154
|
+
if (used + pkgBuf.length > capacity)
|
|
155
|
+
break;
|
|
156
|
+
parts.push(pkgBuf);
|
|
157
|
+
used += pkgBuf.length;
|
|
158
|
+
uris++;
|
|
159
|
+
i++;
|
|
160
|
+
}
|
|
161
|
+
i = 0;
|
|
162
|
+
while (used < capacity && i < uriTarget) {
|
|
163
|
+
const dart = `dart:d${i}\0`;
|
|
164
|
+
const dartBuf = Buffer.from(dart, "utf8");
|
|
165
|
+
if (used + dartBuf.length > capacity)
|
|
166
|
+
break;
|
|
167
|
+
parts.push(dartBuf);
|
|
168
|
+
used += dartBuf.length;
|
|
169
|
+
uris++;
|
|
170
|
+
i++;
|
|
171
|
+
}
|
|
172
|
+
let t = 0;
|
|
173
|
+
const tokenTarget = REA_INTERNAL_LIMITS.DART_MAX_POOL_TOKENS + 32;
|
|
174
|
+
while (used < capacity && tokens < tokenTarget) {
|
|
175
|
+
const tok = `Node_${t}_X\0`;
|
|
176
|
+
const tokBuf = Buffer.from(tok, "utf8");
|
|
177
|
+
if (used + tokBuf.length > capacity)
|
|
178
|
+
break;
|
|
179
|
+
parts.push(tokBuf);
|
|
180
|
+
used += tokBuf.length;
|
|
181
|
+
tokens++;
|
|
182
|
+
t++;
|
|
183
|
+
}
|
|
184
|
+
if (used < capacity) {
|
|
185
|
+
parts.push(Buffer.alloc(capacity - used, 0));
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
buffer: Buffer.concat(parts).subarray(0, capacity),
|
|
189
|
+
packageAndDartUris: uris,
|
|
190
|
+
classLikeTokens: tokens,
|
|
191
|
+
snapshotHeaderBytes: headerBytes,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Dart snapshot-hash overflow (>64) plus string-pool URI/token flood past
|
|
196
|
+
* `MAX_POOL_URIS` (500) and `MAX_POOL_TOKENS` (2000).
|
|
197
|
+
*/
|
|
198
|
+
export function buildFlutterPoolExhaustionPayload(prng) {
|
|
199
|
+
const records = [];
|
|
200
|
+
const snapshotCount = REA_INTERNAL_LIMITS.DART_MAX_SNAPSHOT_HASH_CANDIDATES + 2;
|
|
201
|
+
for (let i = 0; i < snapshotCount; i++) {
|
|
202
|
+
const rec = Buffer.alloc(52, 0);
|
|
203
|
+
rec[0] = 0xf5;
|
|
204
|
+
rec[1] = 0xf5;
|
|
205
|
+
rec[2] = 0xdc;
|
|
206
|
+
rec[3] = 0xdc;
|
|
207
|
+
rec.writeBigUInt64LE(64n, 4);
|
|
208
|
+
rec.writeBigUInt64LE(3n, 12);
|
|
209
|
+
const hash32 = i.toString(16).padStart(8, "0") + prng.hex(24);
|
|
210
|
+
rec.write(hash32, 20, "ascii");
|
|
211
|
+
records.push(rec);
|
|
212
|
+
}
|
|
213
|
+
const labeledLines = [
|
|
214
|
+
'\0Dart VM version: 3.5.0-enclave-tee-ring0 (stable) on "linux_x64"\0',
|
|
215
|
+
'Dart VM version: 3.6.2-sgx-isolated-bridge (stable) on "macos_arm64"\0',
|
|
216
|
+
"based on LLVM 17.0.6 (https://enclave.internal/llvm-tee-01)\0",
|
|
217
|
+
"based on LLVM 18.1.2 (https://enclave.internal/llvm-tee-02)\0",
|
|
218
|
+
"based on LLVM 18.1.8 (https://enclave.internal/llvm-tee-03)\0",
|
|
219
|
+
"based on LLVM 19.1.0 (https://enclave.internal/llvm-tee-04)\0",
|
|
220
|
+
"based on LLVM 19.1.4 (https://enclave.internal/llvm-tee-05)\0",
|
|
221
|
+
"based on LLVM 20.0.0 (https://enclave.internal/llvm-tee-06)\0",
|
|
222
|
+
].join("");
|
|
223
|
+
records.push(Buffer.from(labeledLines, "latin1"));
|
|
224
|
+
const uriCount = REA_INTERNAL_LIMITS.DART_MAX_POOL_URIS + 16;
|
|
225
|
+
const tokenCount = REA_INTERNAL_LIMITS.DART_MAX_POOL_TOKENS + 32;
|
|
226
|
+
const poolParts = ["\0[BLA-FLUTTER-POOL-EXHAUST]\0"];
|
|
227
|
+
for (let i = 0; i < uriCount; i++) {
|
|
228
|
+
poolParts.push(`package:enclave_tarpit_${i}/lib/bridge_${prng.hex(4)}.dart`);
|
|
229
|
+
poolParts.push(`dart:enclave_isolate_${i}`);
|
|
230
|
+
}
|
|
231
|
+
for (let i = 0; i < tokenCount; i++) {
|
|
232
|
+
poolParts.push(`EnclaveTarpitNode_${i}_${prng.hex(3)}`);
|
|
233
|
+
}
|
|
234
|
+
records.push(Buffer.from(poolParts.join("\0") + "\0", "utf8"));
|
|
235
|
+
return {
|
|
236
|
+
buffer: Buffer.concat(records),
|
|
237
|
+
snapshotHashes: snapshotCount,
|
|
238
|
+
packageAndDartUris: uriCount * 2,
|
|
239
|
+
classLikeTokens: tokenCount,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Synthetic ELF64 with a mapped `.go.buildinfo` section and an isolate-data
|
|
244
|
+
* region (plus dynsym for `_kDartIsolateSnapshotData`) so REA's real Go /
|
|
245
|
+
* Flutter parsers can be exercised in tests and the benchmark.
|
|
246
|
+
*/
|
|
247
|
+
export function buildMappedGoFlutterElfFixture() {
|
|
248
|
+
// Isolate must fit dense plants past MAX_POOL_URIS (500) / MAX_POOL_TOKENS
|
|
249
|
+
// (2000). Keep it compact (~48 KiB): a larger zero-filled baseline inflated
|
|
250
|
+
// the benchmark "before" token estimate and understated the native-ELF
|
|
251
|
+
// multiplier without changing real after-protection strength.
|
|
252
|
+
const ISO_SIZE = 48 * 1024;
|
|
253
|
+
const GO_SIZE = 512;
|
|
254
|
+
const goOff = 1024;
|
|
255
|
+
const isoOff = 2048;
|
|
256
|
+
const dynsymOff = isoOff + ISO_SIZE;
|
|
257
|
+
const dynsymSize = 48; // 2 entries × 24
|
|
258
|
+
const dynstrOff = dynsymOff + dynsymSize;
|
|
259
|
+
const dynstr = Buffer.from("\0_kDartIsolateSnapshotData\0", "utf8");
|
|
260
|
+
const FILE_SIZE = dynstrOff + dynstr.length + 64;
|
|
261
|
+
const bytes = Buffer.alloc(FILE_SIZE, 0);
|
|
262
|
+
// ELF64 LE header
|
|
263
|
+
bytes.set([0x7f, 0x45, 0x4c, 0x46, 2, 1, 1], 0);
|
|
264
|
+
bytes.writeUInt16LE(3, 16); // ET_DYN
|
|
265
|
+
bytes.writeUInt16LE(0x3e, 18); // EM_X86_64
|
|
266
|
+
bytes.writeUInt32LE(1, 20);
|
|
267
|
+
bytes.writeBigUInt64LE(0x400000n, 24); // e_entry
|
|
268
|
+
bytes.writeBigUInt64LE(64n, 32); // e_phoff
|
|
269
|
+
bytes.writeBigUInt64LE(128n, 40); // e_shoff
|
|
270
|
+
bytes.writeUInt16LE(64, 52);
|
|
271
|
+
bytes.writeUInt16LE(56, 54);
|
|
272
|
+
bytes.writeUInt16LE(1, 56); // e_phnum
|
|
273
|
+
bytes.writeUInt16LE(64, 58);
|
|
274
|
+
bytes.writeUInt16LE(6, 60); // e_shnum
|
|
275
|
+
bytes.writeUInt16LE(1, 62); // e_shstrndx
|
|
276
|
+
// PT_LOAD R|W covering whole file
|
|
277
|
+
bytes.writeUInt32LE(1, 64); // PT_LOAD
|
|
278
|
+
bytes.writeUInt32LE(6, 68); // PF_R|PF_W
|
|
279
|
+
bytes.writeBigUInt64LE(0n, 72);
|
|
280
|
+
bytes.writeBigUInt64LE(0x400000n, 80);
|
|
281
|
+
bytes.writeBigUInt64LE(0x400000n, 88);
|
|
282
|
+
bytes.writeBigUInt64LE(BigInt(FILE_SIZE), 96);
|
|
283
|
+
bytes.writeBigUInt64LE(BigInt(FILE_SIZE), 104);
|
|
284
|
+
bytes.writeBigUInt64LE(0x1000n, 112);
|
|
285
|
+
const names = Buffer.from("\0.shstrtab\0.go.buildinfo\0.isolate\0.dynsym\0.dynstr\0", "utf8");
|
|
286
|
+
const shstrOff = 512;
|
|
287
|
+
names.copy(bytes, shstrOff);
|
|
288
|
+
const goAddr = 0x400000n + BigInt(goOff); // 16-aligned
|
|
289
|
+
const isoAddr = 0x400000n + BigInt(isoOff);
|
|
290
|
+
dynstr.copy(bytes, dynstrOff);
|
|
291
|
+
const sym1 = dynsymOff + 24;
|
|
292
|
+
bytes.writeUInt32LE(1, sym1);
|
|
293
|
+
bytes[sym1 + 4] = (1 << 4) | 1; // STB_GLOBAL | STT_OBJECT
|
|
294
|
+
bytes.writeUInt16LE(3, sym1 + 6); // .isolate
|
|
295
|
+
bytes.writeBigUInt64LE(isoAddr, sym1 + 8);
|
|
296
|
+
bytes.writeBigUInt64LE(BigInt(ISO_SIZE), sym1 + 16);
|
|
297
|
+
// Seed isolate with a real snapshot header so protect appends pool after it
|
|
298
|
+
bytes[isoOff] = 0xf5;
|
|
299
|
+
bytes[isoOff + 1] = 0xf5;
|
|
300
|
+
bytes[isoOff + 2] = 0xdc;
|
|
301
|
+
bytes[isoOff + 3] = 0xdc;
|
|
302
|
+
bytes.writeBigUInt64LE(64n, isoOff + 4);
|
|
303
|
+
bytes.writeBigUInt64LE(3n, isoOff + 12);
|
|
304
|
+
bytes.write("0123456789abcdef0123456789abcdef", isoOff + 20, "ascii");
|
|
305
|
+
const sh1 = 128 + 64;
|
|
306
|
+
bytes.writeUInt32LE(1, sh1);
|
|
307
|
+
bytes.writeUInt32LE(3, sh1 + 4);
|
|
308
|
+
bytes.writeBigUInt64LE(BigInt(shstrOff), sh1 + 24);
|
|
309
|
+
bytes.writeBigUInt64LE(BigInt(names.length), sh1 + 32);
|
|
310
|
+
const sh2 = 128 + 128;
|
|
311
|
+
const goNameOff = names.indexOf(Buffer.from(".go.buildinfo\0"));
|
|
312
|
+
bytes.writeUInt32LE(goNameOff, sh2);
|
|
313
|
+
bytes.writeUInt32LE(1, sh2 + 4);
|
|
314
|
+
bytes.writeBigUInt64LE(3n, sh2 + 8);
|
|
315
|
+
bytes.writeBigUInt64LE(goAddr, sh2 + 16);
|
|
316
|
+
bytes.writeBigUInt64LE(BigInt(goOff), sh2 + 24);
|
|
317
|
+
bytes.writeBigUInt64LE(BigInt(GO_SIZE), sh2 + 32);
|
|
318
|
+
const sh3 = 128 + 192;
|
|
319
|
+
const isoNameOff = names.indexOf(Buffer.from(".isolate\0"));
|
|
320
|
+
bytes.writeUInt32LE(isoNameOff, sh3);
|
|
321
|
+
bytes.writeUInt32LE(1, sh3 + 4);
|
|
322
|
+
bytes.writeBigUInt64LE(3n, sh3 + 8);
|
|
323
|
+
bytes.writeBigUInt64LE(isoAddr, sh3 + 16);
|
|
324
|
+
bytes.writeBigUInt64LE(BigInt(isoOff), sh3 + 24);
|
|
325
|
+
bytes.writeBigUInt64LE(BigInt(ISO_SIZE), sh3 + 32);
|
|
326
|
+
const sh4 = 128 + 256;
|
|
327
|
+
const dynsymNameOff = names.indexOf(Buffer.from(".dynsym\0"));
|
|
328
|
+
bytes.writeUInt32LE(dynsymNameOff, sh4);
|
|
329
|
+
bytes.writeUInt32LE(11, sh4 + 4);
|
|
330
|
+
bytes.writeBigUInt64LE(2n, sh4 + 8);
|
|
331
|
+
bytes.writeBigUInt64LE(0x400000n + BigInt(dynsymOff), sh4 + 16);
|
|
332
|
+
bytes.writeBigUInt64LE(BigInt(dynsymOff), sh4 + 24);
|
|
333
|
+
bytes.writeBigUInt64LE(BigInt(dynsymSize), sh4 + 32);
|
|
334
|
+
bytes.writeUInt32LE(5, sh4 + 40);
|
|
335
|
+
bytes.writeBigUInt64LE(24n, sh4 + 48);
|
|
336
|
+
const sh5 = 128 + 320;
|
|
337
|
+
const dynstrNameOff = names.indexOf(Buffer.from(".dynstr\0"));
|
|
338
|
+
bytes.writeUInt32LE(dynstrNameOff, sh5);
|
|
339
|
+
bytes.writeUInt32LE(3, sh5 + 4);
|
|
340
|
+
bytes.writeBigUInt64LE(2n, sh5 + 8);
|
|
341
|
+
bytes.writeBigUInt64LE(0x400000n + BigInt(dynstrOff), sh5 + 16);
|
|
342
|
+
bytes.writeBigUInt64LE(BigInt(dynstrOff), sh5 + 24);
|
|
343
|
+
bytes.writeBigUInt64LE(BigInt(dynstr.length), sh5 + 32);
|
|
344
|
+
return bytes;
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=go-flutter-exhaustion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go-flutter-exhaustion.js","sourceRoot":"","sources":["../../../src/shields/formats/go-flutter-exhaustion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ProtectionIntensity } from "../../core/types.js";
|
|
2
|
+
export interface GpuPtxInspection {
|
|
3
|
+
readonly looksLikePtx: boolean;
|
|
4
|
+
readonly entryCount: number;
|
|
5
|
+
readonly blaProtected: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function inspectGpuPtx(text: string): GpuPtxInspection;
|
|
8
|
+
/**
|
|
9
|
+
* Protects NVIDIA PTX text modules by appending decoy `.entry` kernels and
|
|
10
|
+
* canary/diagnostic comments. Preserves the original module body verbatim so
|
|
11
|
+
* existing kernels stay byte-identical (runtime-equivalent).
|
|
12
|
+
*
|
|
13
|
+
* SPIR-V / fatbinary / CUDA object mutation is intentionally NOT attempted —
|
|
14
|
+
* those containers have brittle structural hashes; corrupting them would violate
|
|
15
|
+
* the red line. Firmware images are likewise skipped (see module doc below).
|
|
16
|
+
*/
|
|
17
|
+
export declare function protectGpuPtxText(input: string, options?: {
|
|
18
|
+
readonly intensity?: ProtectionIntensity;
|
|
19
|
+
readonly seed?: string;
|
|
20
|
+
}): {
|
|
21
|
+
readonly text: string;
|
|
22
|
+
readonly entriesInjected: number;
|
|
23
|
+
readonly canaryTokensEmbedded: number;
|
|
24
|
+
readonly diagnosticsEmbedded: number;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Firmware images (raw flash dumps, U-Boot ITB, Android boot.img, etc.) are
|
|
28
|
+
* NOT hardened by BLA: generic mutation cannot preserve boot signatures,
|
|
29
|
+
* CRC/header integrity, or device-specific layouts without a per-vendor
|
|
30
|
+
* parser. Prefer leaving firmware untouched rather than risking bricking.
|
|
31
|
+
*/
|
|
32
|
+
export declare const FIRMWARE_HARDENING_SKIP_REASON = "Firmware images are skipped: safe generic mutation would break boot signatures, CRCs, or vendor headers. No BLA firmware shield is offered.";
|
|
33
|
+
/**
|
|
34
|
+
* SPIR-V modules, CUDA fatbinaries, and AMD GPU code objects are skipped:
|
|
35
|
+
* their containers carry structural hashes / embedded ELF slices where a
|
|
36
|
+
* generic trailer would break loader validation. PTX text remains the only
|
|
37
|
+
* safely append-only GPU surface BLA hardens.
|
|
38
|
+
*/
|
|
39
|
+
export declare const GPU_OBJECT_HARDENING_SKIP_REASON = "SPIR-V / CUDA fatbinary / AMD GPU objects are skipped: brittle structural hashes and embedded ELF slices make generic mutation unsafe. Only PTX text is hardened.";
|
|
40
|
+
//# sourceMappingURL=gpu-ptx.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpu-ptx.d.ts","sourceRoot":"","sources":["../../../src/shields/formats/gpu-ptx.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAU5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,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,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC,CAuCA;AAED;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,gJACoG,CAAC;AAEhJ;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,sKACwH,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { SeededPrng } from "../../core/prng.js";
|
|
2
|
+
import { buildCanaryAndDiagnosticPayloads } from "../deception/format-payloads.js";
|
|
3
|
+
export function inspectGpuPtx(text) {
|
|
4
|
+
const looksLikePtx = /\.version\s+\d/.test(text) &&
|
|
5
|
+
(/\.entry\s+\w/.test(text) || /\.target\s+sm_/.test(text));
|
|
6
|
+
const entryCount = (text.match(/\.entry\s+/g) ?? []).length;
|
|
7
|
+
return {
|
|
8
|
+
looksLikePtx,
|
|
9
|
+
entryCount,
|
|
10
|
+
blaProtected: text.includes("[BLA-PTX-SHIELD]"),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Protects NVIDIA PTX text modules by appending decoy `.entry` kernels and
|
|
15
|
+
* canary/diagnostic comments. Preserves the original module body verbatim so
|
|
16
|
+
* existing kernels stay byte-identical (runtime-equivalent).
|
|
17
|
+
*
|
|
18
|
+
* SPIR-V / fatbinary / CUDA object mutation is intentionally NOT attempted —
|
|
19
|
+
* those containers have brittle structural hashes; corrupting them would violate
|
|
20
|
+
* the red line. Firmware images are likewise skipped (see module doc below).
|
|
21
|
+
*/
|
|
22
|
+
export function protectGpuPtxText(input, options = {}) {
|
|
23
|
+
const intensity = options.intensity ?? "balanced";
|
|
24
|
+
const prng = new SeededPrng(options.seed ?? "bla-ptx-shield");
|
|
25
|
+
const deception = buildCanaryAndDiagnosticPayloads(prng, intensity);
|
|
26
|
+
const base = input.trim().length > 0
|
|
27
|
+
? input.replace(/\s*$/, "\n")
|
|
28
|
+
: `.version 7.5\n.target sm_70\n.address_size 64\n\n`;
|
|
29
|
+
const entryTarget = intensity === "bankrupt" ? 128 : intensity === "maximum" ? 48 : 16;
|
|
30
|
+
const parts = [
|
|
31
|
+
base,
|
|
32
|
+
`\n// [BLA-PTX-SHIELD] Counter-REA GPU exhaustion trailer\n`,
|
|
33
|
+
];
|
|
34
|
+
for (const rec of deception.textRecords.slice(0, 8)) {
|
|
35
|
+
parts.push(`// DIAG: ${rec.replace(/\n/g, " ")}\n`);
|
|
36
|
+
}
|
|
37
|
+
for (let i = 0; i < entryTarget; i++) {
|
|
38
|
+
const name = `bla_tarpit_kernel_${i}_${prng.hex(4)}`;
|
|
39
|
+
parts.push(`.visible .entry ${name}(.param .u64 ${name}_param_0)\n`, `{\n`, ` .reg .b64 %rd<2>;\n`, ` ld.param.u64 %rd1, [${name}_param_0];\n`, ` // canary=${prng.hex(8)}\n`, ` ret;\n`, `}\n\n`);
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
text: parts.join(""),
|
|
43
|
+
entriesInjected: entryTarget,
|
|
44
|
+
canaryTokensEmbedded: deception.canary.syntheticCanaryTokens.length,
|
|
45
|
+
diagnosticsEmbedded: deception.diagnostics.diagnosticsInjected.length,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Firmware images (raw flash dumps, U-Boot ITB, Android boot.img, etc.) are
|
|
50
|
+
* NOT hardened by BLA: generic mutation cannot preserve boot signatures,
|
|
51
|
+
* CRC/header integrity, or device-specific layouts without a per-vendor
|
|
52
|
+
* parser. Prefer leaving firmware untouched rather than risking bricking.
|
|
53
|
+
*/
|
|
54
|
+
export const FIRMWARE_HARDENING_SKIP_REASON = "Firmware images are skipped: safe generic mutation would break boot signatures, CRCs, or vendor headers. No BLA firmware shield is offered.";
|
|
55
|
+
/**
|
|
56
|
+
* SPIR-V modules, CUDA fatbinaries, and AMD GPU code objects are skipped:
|
|
57
|
+
* their containers carry structural hashes / embedded ELF slices where a
|
|
58
|
+
* generic trailer would break loader validation. PTX text remains the only
|
|
59
|
+
* safely append-only GPU surface BLA hardens.
|
|
60
|
+
*/
|
|
61
|
+
export const GPU_OBJECT_HARDENING_SKIP_REASON = "SPIR-V / CUDA fatbinary / AMD GPU objects are skipped: brittle structural hashes and embedded ELF slices make generic mutation unsafe. Only PTX text is hardened.";
|
|
62
|
+
//# sourceMappingURL=gpu-ptx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpu-ptx.js","sourceRoot":"","sources":["../../../src/shields/formats/gpu-ptx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AAQnF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,YAAY,GAChB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3B,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC5D,OAAO;QACL,YAAY;QACZ,UAAU;QACV,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KAChD,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,UAGI,EAAE;IAON,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,UAAU,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,gCAAgC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAEpE,MAAM,IAAI,GACR,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACrB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;QAC7B,CAAC,CAAC,mDAAmD,CAAC;IAE1D,MAAM,WAAW,GACf,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAErE,MAAM,KAAK,GAAa;QACtB,IAAI;QACJ,4DAA4D;KAC7D,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CACR,mBAAmB,IAAI,gBAAgB,IAAI,aAAa,EACxD,KAAK,EACL,uBAAuB,EACvB,yBAAyB,IAAI,cAAc,EAC3C,eAAe,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAC9B,UAAU,EACV,OAAO,CACR,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,eAAe,EAAE,WAAW;QAC5B,oBAAoB,EAAE,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM;QACnE,mBAAmB,EAAE,SAAS,CAAC,WAAW,CAAC,mBAAmB,CAAC,MAAM;KACtE,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,8BAA8B,GACzC,6IAA6I,CAAC;AAEhJ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAC3C,mKAAmK,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../../src/shields/formats/headers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,MAAM,MAAM,oBAAoB,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,GAAE;IACP,QAAQ,CAAC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B,GACL,mBAAmB,
|
|
1
|
+
{"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../../src/shields/formats/headers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,MAAM,MAAM,oBAAoB,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,GAAE;IACP,QAAQ,CAAC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B,GACL,mBAAmB,CAsNrB"}
|
|
@@ -14,9 +14,14 @@ export function emitCompileTimeNativeHeader(language, options = {}) {
|
|
|
14
14
|
const chaffPayloads = generateChaffPayloads(prng, intensity);
|
|
15
15
|
const decoyCount = intensity === "stealth" ? 6 : intensity === "balanced" ? 12 : 20;
|
|
16
16
|
if (language === "c") {
|
|
17
|
+
const rustcAnchorStem = "rustc_path_anchor";
|
|
18
|
+
const shadowHeapName = "shadow_heap_slots";
|
|
19
|
+
const tarpitStem = "enclave_tarpit_fn";
|
|
20
|
+
const dataTableCount = chaffPayloads.length * 2 + 1;
|
|
17
21
|
const lines = [
|
|
18
22
|
"/* ==========================================================================",
|
|
19
23
|
" * BLA-SHIELD: Adversarial Defense Header for C/C++ Native Binaries",
|
|
24
|
+
" * Compatible with GCC (__GNUC__), Clang (__clang__), and MSVC (_MSC_VER / cl.exe)",
|
|
20
25
|
" * Counter-REA Native Decompilation Tarpit & Read-Only Section Shield",
|
|
21
26
|
" * ========================================================================== */",
|
|
22
27
|
"#ifndef BLA_SHIELD_H",
|
|
@@ -24,42 +29,73 @@ export function emitCompileTimeNativeHeader(language, options = {}) {
|
|
|
24
29
|
"#include <stdint.h>",
|
|
25
30
|
"#include <stddef.h>",
|
|
26
31
|
"",
|
|
27
|
-
"#
|
|
28
|
-
"
|
|
32
|
+
"#ifdef __cplusplus",
|
|
33
|
+
'extern "C" {',
|
|
34
|
+
"#endif",
|
|
35
|
+
"",
|
|
36
|
+
"#if defined(_MSC_VER) && !defined(__clang__)",
|
|
37
|
+
"#pragma warning(push)",
|
|
38
|
+
"#pragma warning(disable: 4100 4127 4189 4505)",
|
|
39
|
+
"#define BLA_USED",
|
|
40
|
+
"#define BLA_NOINLINE __declspec(noinline)",
|
|
41
|
+
"#elif defined(__GNUC__) || defined(__clang__)",
|
|
42
|
+
"#define BLA_USED __attribute__((used))",
|
|
43
|
+
"#define BLA_NOINLINE __attribute__((used, noinline))",
|
|
29
44
|
"#else",
|
|
30
45
|
"#define BLA_USED",
|
|
46
|
+
"#define BLA_NOINLINE",
|
|
31
47
|
"#endif",
|
|
32
48
|
"",
|
|
33
49
|
"/* Architectural Chaff & Enclave Delegation Manifests */",
|
|
34
50
|
];
|
|
51
|
+
const dataTableEntries = [];
|
|
35
52
|
chaffPayloads.forEach((p, idx) => {
|
|
36
53
|
lines.push(`static const char ${p.symbolName}[] BLA_USED = ${JSON.stringify(p.rawText)};`);
|
|
54
|
+
dataTableEntries.push(`(const void*)${p.symbolName}`);
|
|
37
55
|
const hash = idx.toString(16).padStart(8, "0") + prng.hex(32);
|
|
38
|
-
lines.push(`static const char
|
|
56
|
+
lines.push(`static const char ${rustcAnchorStem}_${idx}[] BLA_USED = "/rustc/${hash}/library/core/src/enclave.rs";`);
|
|
57
|
+
dataTableEntries.push(`(const void*)${rustcAnchorStem}_${idx}`);
|
|
39
58
|
});
|
|
59
|
+
// Mutable .data shadow heap slots to defeat GDB/Rizin/Frida/WinDbg before/after memory diffing
|
|
60
|
+
const slotInit = Array.from({ length: 32 }, () => `0x${prng.hex(8)}u`).join(", ");
|
|
61
|
+
lines.push(`static volatile uint32_t ${shadowHeapName}[32] BLA_USED = { ${slotInit} };`);
|
|
62
|
+
dataTableEntries.push(`(const void*)${shadowHeapName}`);
|
|
63
|
+
lines.push("");
|
|
40
64
|
// Forward declarations for mutual cross-references (Fake XRefs in Ghidra/IDA)
|
|
41
65
|
for (let i = 0; i < decoyCount; i++) {
|
|
42
|
-
lines.push(`
|
|
66
|
+
lines.push(`BLA_NOINLINE static uint32_t ${tarpitStem}_${i}(uint32_t seed, int depth);`);
|
|
43
67
|
}
|
|
44
68
|
lines.push("");
|
|
69
|
+
// Keep-tables prevent MSVC (/O2 /GL + link.exe /OPT:REF), Clang, and GCC from stripping static symbols
|
|
70
|
+
lines.push(`typedef uint32_t (*enclave_tarpit_fn_t)(uint32_t, int);`);
|
|
71
|
+
lines.push(`static const void* const enclave_keep_data_table[${dataTableCount}] BLA_USED = { ${dataTableEntries.join(", ")} };`);
|
|
72
|
+
const fnTableEntries = Array.from({ length: decoyCount }, (_, i) => `&${tarpitStem}_${i}`).join(", ");
|
|
73
|
+
lines.push(`static const enclave_tarpit_fn_t enclave_keep_fn_table[${decoyCount}] BLA_USED = { ${fnTableEntries} };`);
|
|
74
|
+
lines.push("");
|
|
45
75
|
for (let i = 0; i < decoyCount; i++) {
|
|
46
76
|
const next1 = (i + 1) % decoyCount;
|
|
47
77
|
const next2 = (i + 3) % decoyCount;
|
|
48
78
|
const k = prng.nextInt(0x1000, 0xffff);
|
|
49
79
|
const chaffSym = chaffPayloads[i % chaffPayloads.length].symbolName;
|
|
50
|
-
lines.push(`
|
|
51
|
-
lines.push(`
|
|
80
|
+
lines.push(`BLA_NOINLINE static uint32_t ${tarpitStem}_${i}(uint32_t seed, int depth) {`);
|
|
81
|
+
lines.push(` const char* _anchor_str = (const char*)enclave_keep_data_table[(seed + ${i}u) % ${dataTableCount}u];`);
|
|
82
|
+
lines.push(` uint32_t acc = seed ^ 0x${k.toString(16)}u ^ (uint32_t)(unsigned char)${chaffSym}[0] ^ (uint32_t)(unsigned char)_anchor_str[0];`);
|
|
52
83
|
lines.push(` for (int r = 0; r < 4; ++r) {`);
|
|
53
84
|
lines.push(` acc = (acc * 0x9E3779B9u) ^ (acc >> 13) ^ (uint32_t)r;`);
|
|
85
|
+
lines.push(` ${shadowHeapName}[(${i} * 4 + r) & 31] ^= acc;`);
|
|
54
86
|
lines.push(` }`);
|
|
55
87
|
lines.push(` if (depth > 0 && ((7u * (seed | 3u) * (seed | 3u) - 1u) == (seed ^ 5u) * (seed ^ 5u))) {`);
|
|
56
|
-
lines.push(`
|
|
88
|
+
lines.push(` enclave_tarpit_fn_t _fn_ptr = enclave_keep_fn_table[(seed ^ (uint32_t)depth) % ${decoyCount}u];`);
|
|
89
|
+
lines.push(` return ${tarpitStem}_${next1}(acc, depth - 1) ^ ${tarpitStem}_${next2}(acc ^ 0x5Au, depth - 1) ^ _fn_ptr(acc, depth - 1);`);
|
|
57
90
|
lines.push(` }`);
|
|
58
91
|
lines.push(` return acc;`);
|
|
59
92
|
lines.push(`}`);
|
|
60
93
|
}
|
|
61
94
|
lines.push("");
|
|
62
|
-
lines.push(`#define BLA_SHIELD_ANCHOR(x) (
|
|
95
|
+
lines.push(`#define BLA_SHIELD_ANCHOR(x) (${tarpitStem}_0((uint32_t)(x), 0))`);
|
|
96
|
+
lines.push("");
|
|
97
|
+
lines.push("#if defined(_MSC_VER) && !defined(__clang__)", "#pragma warning(pop)", "#endif");
|
|
98
|
+
lines.push("#ifdef __cplusplus", "}", "#endif");
|
|
63
99
|
lines.push("#endif /* BLA_SHIELD_H */");
|
|
64
100
|
return {
|
|
65
101
|
language: "c",
|
|
@@ -95,13 +131,13 @@ export function emitCompileTimeNativeHeader(language, options = {}) {
|
|
|
95
131
|
const next2 = (i + 2) % decoyCount;
|
|
96
132
|
const k = prng.nextInt(0x1000, 0xffff);
|
|
97
133
|
lines.push(`#[inline(never)]`);
|
|
98
|
-
lines.push(`pub fn
|
|
134
|
+
lines.push(`pub fn enclave_tarpit_${i}(seed: u32, depth: u32) -> u32 {`);
|
|
99
135
|
lines.push(` let mut acc = seed ^ 0x${k.toString(16)};`);
|
|
100
136
|
lines.push(` for r in 0..4u32 {`);
|
|
101
137
|
lines.push(` acc = acc.wrapping_mul(0x9E37_79B9) ^ (acc >> 13) ^ r;`);
|
|
102
138
|
lines.push(` }`);
|
|
103
139
|
lines.push(` if depth > 0 && ((seed | 1).wrapping_mul(seed | 2) & 1) == 1 {`);
|
|
104
|
-
lines.push(` return
|
|
140
|
+
lines.push(` return enclave_tarpit_${next1}(acc, depth - 1) ^ enclave_tarpit_${next2}(acc ^ 0x5A, depth - 1);`);
|
|
105
141
|
lines.push(` }`);
|
|
106
142
|
lines.push(` std::hint::black_box(acc)`);
|
|
107
143
|
lines.push(`}`);
|
|
@@ -115,11 +151,14 @@ export function emitCompileTimeNativeHeader(language, options = {}) {
|
|
|
115
151
|
};
|
|
116
152
|
}
|
|
117
153
|
// Go (`bla_shield.go`)
|
|
154
|
+
const goSlots = Array.from({ length: 16 }, () => `0x${prng.hex(8)}`).join(", ");
|
|
118
155
|
const lines = [
|
|
119
156
|
"// Code generated by BLA-SHIELD. DO NOT EDIT.",
|
|
120
157
|
"package main",
|
|
121
158
|
"",
|
|
122
|
-
|
|
159
|
+
`var ShadowHeapSlots = [16]uint32{${goSlots}}`,
|
|
160
|
+
"",
|
|
161
|
+
"var EnclaveManifests = []string{",
|
|
123
162
|
];
|
|
124
163
|
for (const p of chaffPayloads) {
|
|
125
164
|
lines.push(`\t${JSON.stringify(p.rawText)},`);
|
|
@@ -131,13 +170,14 @@ export function emitCompileTimeNativeHeader(language, options = {}) {
|
|
|
131
170
|
const next2 = (i + 2) % decoyCount;
|
|
132
171
|
const k = prng.nextInt(0x1000, 0xffff);
|
|
133
172
|
lines.push(`//go:noinline`);
|
|
134
|
-
lines.push(`func
|
|
135
|
-
lines.push(`\tacc := seed ^ 0x${k.toString(16)} ^ uint32(len(
|
|
173
|
+
lines.push(`func EnclaveTarpit${i}(seed uint32, depth int) uint32 {`);
|
|
174
|
+
lines.push(`\tacc := seed ^ 0x${k.toString(16)} ^ uint32(len(EnclaveManifests[0]))`);
|
|
136
175
|
lines.push(`\tfor r := uint32(0); r < 4; r++ {`);
|
|
137
176
|
lines.push(`\t\tacc = (acc * 0x9E3779B9) ^ (acc >> 13) ^ r`);
|
|
177
|
+
lines.push(`\t\tShadowHeapSlots[(${i}*4+int(r))&15] ^= acc`);
|
|
138
178
|
lines.push(`\t}`);
|
|
139
179
|
lines.push(`\tif depth > 0 && (((seed|1)*((seed|1)+1))&1) == 1 {`);
|
|
140
|
-
lines.push(`\t\treturn
|
|
180
|
+
lines.push(`\t\treturn EnclaveTarpit${next1}(acc, depth-1) ^ EnclaveTarpit${next2}(acc^0x5A, depth-1)`);
|
|
141
181
|
lines.push(`\t}`);
|
|
142
182
|
lines.push(`\treturn acc`);
|
|
143
183
|
lines.push(`}`);
|