@node9/proxy 2.38.0 → 2.40.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/dist/cli.js +1122 -972
- package/dist/cli.mjs +1121 -971
- package/dist/dashboard.mjs +166 -16
- package/dist/index.js +190 -47
- package/dist/index.mjs +190 -47
- package/dist/scan-ink.mjs +32 -4
- package/package.json +1 -1
package/dist/dashboard.mjs
CHANGED
|
@@ -415,6 +415,28 @@ function classifySsrf(host2) {
|
|
|
415
415
|
return null;
|
|
416
416
|
}
|
|
417
417
|
}
|
|
418
|
+
function isModeValue(v) {
|
|
419
|
+
return typeof v === "string" && MODE_VALUES.includes(v);
|
|
420
|
+
}
|
|
421
|
+
function levelOf(mode) {
|
|
422
|
+
if (mode === "observe") return "audit";
|
|
423
|
+
return LEVELS.includes(mode ?? "") ? mode : "standard";
|
|
424
|
+
}
|
|
425
|
+
function isRecordOnly(mode) {
|
|
426
|
+
return levelOf(mode) === "audit";
|
|
427
|
+
}
|
|
428
|
+
function isBlockAll(mode) {
|
|
429
|
+
return levelOf(mode) === "block-all";
|
|
430
|
+
}
|
|
431
|
+
function levelCheckValue(mode, id) {
|
|
432
|
+
return LEVEL_CHECKS[levelOf(mode)][id];
|
|
433
|
+
}
|
|
434
|
+
function levelChecks(mode) {
|
|
435
|
+
return LEVEL_CHECKS[levelOf(mode)];
|
|
436
|
+
}
|
|
437
|
+
function levelPackageSignals(mode) {
|
|
438
|
+
return levelOf(mode) === "soft" ? { newPackage: "off", installScript: "off" } : void 0;
|
|
439
|
+
}
|
|
418
440
|
function isVerdict(v) {
|
|
419
441
|
return v === "off" || v === "log" || v === "review" || v === "block";
|
|
420
442
|
}
|
|
@@ -488,19 +510,21 @@ function resolveCheck(settings, id) {
|
|
|
488
510
|
if (!def) return void 0;
|
|
489
511
|
if (isLockedCheck(def)) return { id, value: "block", source: "locked" };
|
|
490
512
|
const floor = def.floor ? CHECK_VERDICT_RANK[def.floor] : 0;
|
|
513
|
+
const levelDefault = levelCheckValue(settings.mode, id) ?? def.defaultValue;
|
|
514
|
+
const sourceOf = (value2) => value2 === levelDefault ? "default" : "configured";
|
|
491
515
|
const explicit = settings.checks?.[id];
|
|
492
516
|
if (isVerdict(explicit)) {
|
|
493
517
|
const value2 = CHECK_VERDICT_RANK[explicit] < floor ? def.floor : explicit;
|
|
494
|
-
return { id, value: value2, source: value2
|
|
518
|
+
return { id, value: value2, source: sourceOf(value2) };
|
|
495
519
|
}
|
|
496
520
|
if (def.pack) {
|
|
497
521
|
const on = settings.appliedShields?.includes(def.pack) ?? false;
|
|
498
522
|
return { id, value: on ? def.defaultValue : "off", source: "default" };
|
|
499
523
|
}
|
|
500
524
|
const read = LEGACY_READERS[id]?.(settings);
|
|
501
|
-
if (read === void 0) return { id, value:
|
|
525
|
+
if (read === void 0) return { id, value: levelDefault, source: "default" };
|
|
502
526
|
const value = CHECK_VERDICT_RANK[read] < floor ? def.floor : read;
|
|
503
|
-
return { id, value, source: value
|
|
527
|
+
return { id, value, source: sourceOf(value) };
|
|
504
528
|
}
|
|
505
529
|
function checkValue(settings, id) {
|
|
506
530
|
return resolveCheck(settings, id)?.value ?? "off";
|
|
@@ -2432,6 +2456,20 @@ function scanArgs(args, depth = 0, fieldPath = "args") {
|
|
|
2432
2456
|
}
|
|
2433
2457
|
return null;
|
|
2434
2458
|
}
|
|
2459
|
+
function tuningFromLegacyPolicy(policy) {
|
|
2460
|
+
const out = {};
|
|
2461
|
+
const p = policy;
|
|
2462
|
+
if (policy.packageCheck?.registrySignals === false) {
|
|
2463
|
+
out["loading.malicious-package"] = { newPackage: "off", installScript: "off" };
|
|
2464
|
+
}
|
|
2465
|
+
for (const f of TUNING_FIELDS) {
|
|
2466
|
+
const [block, key] = f.legacy;
|
|
2467
|
+
const value = p[block]?.[key];
|
|
2468
|
+
if (value === void 0) continue;
|
|
2469
|
+
(out[f.checkId] ??= {})[f.name] = value;
|
|
2470
|
+
}
|
|
2471
|
+
return out;
|
|
2472
|
+
}
|
|
2435
2473
|
function tuningToLegacyPolicy(policy, tuning) {
|
|
2436
2474
|
const unknown = [];
|
|
2437
2475
|
for (const [id, fields] of Object.entries(tuning)) {
|
|
@@ -2546,6 +2584,25 @@ function checkToLegacyPolicy(policy, id, v) {
|
|
|
2546
2584
|
return false;
|
|
2547
2585
|
}
|
|
2548
2586
|
}
|
|
2587
|
+
function knobStatedChecks(policy) {
|
|
2588
|
+
const out = /* @__PURE__ */ new Set();
|
|
2589
|
+
const has2 = (o, key) => !!o && typeof o === "object" && o[key] !== void 0;
|
|
2590
|
+
const { dlp, egress, loopDetection, injectionScan, skillPinning, packageCheck } = policy;
|
|
2591
|
+
const uc = policy.untrustedContent;
|
|
2592
|
+
if (has2(dlp, "enabled")) out.add("data.secrets");
|
|
2593
|
+
if (has2(dlp, "reviewAction") || dlp?.enabled === false) out.add("data.secrets-weak");
|
|
2594
|
+
if (has2(dlp, "pii")) out.add("data.pii");
|
|
2595
|
+
if (has2(egress, "enabled") || has2(egress, "mode")) out.add("network.unknown-host");
|
|
2596
|
+
if (has2(egress, "ssrfStrict")) out.add("network.internal-addresses");
|
|
2597
|
+
if (has2(loopDetection, "enabled")) out.add("behavior.loops");
|
|
2598
|
+
if (has2(injectionScan, "enabled")) out.add("behavior.prompt-injection");
|
|
2599
|
+
if (has2(skillPinning, "enabled") || has2(skillPinning, "mode")) out.add("loading.skill-tamper");
|
|
2600
|
+
if (has2(packageCheck, "enabled") || has2(packageCheck, "onMalicious"))
|
|
2601
|
+
out.add("loading.malicious-package");
|
|
2602
|
+
if (uc && typeof uc === "object" && (uc.enabled === false || has2(uc, "afterExposure")))
|
|
2603
|
+
out.add("behavior.untrusted-content");
|
|
2604
|
+
return out;
|
|
2605
|
+
}
|
|
2549
2606
|
function isKnobGoverned(id) {
|
|
2550
2607
|
return id in KNOB_GOVERNED;
|
|
2551
2608
|
}
|
|
@@ -2804,7 +2861,7 @@ function matchCanaryArgs(args, values) {
|
|
|
2804
2861
|
return null;
|
|
2805
2862
|
}
|
|
2806
2863
|
}
|
|
2807
|
-
var MAX_REGEX_LENGTH, REGEX_CACHE_MAX, regexCache, aws_default, bash_safe_default, docker_default, filesystem_default, github_default, k8s_default, mongodb_default, postgres_default, project_jail_default, redis_default, finance_default, identity_default, publishing_default, ACTION_TEMPLATES, ACTION_CHECKS, GAP, prog, httpTo, httpWrite, HTTP_WRITE, HTTP_WRITE_ANY, NOT_STRIPE_TEST, postTo, STRIPE_OBJECTS, APP_SHIELD_SPECS, APP_SHIELDS, APP_SHIELD_NAMES, APP_SERVER_GLOB, GENERAL_ACTION_RULES, BUILTIN_SHIELDS, SSRF_MAX_HOST, METADATA_ADDRESSES, METADATA_HOSTNAMES, v4Octets, CHECK_TEXT, VERDICTS, CHECK_VERDICT_RANK, ALL, BUILTIN_DANGEROUS_WORDS, PRODUCT_CHECKS, SHIELD_RULE_NAME, SHIELD_RULES_FOLDED_INTO_PRODUCT, CHECKS, CHECK_BY_ID, LEGACY_TO_ID, LEGACY_READERS, INVISIBLE_RE, INVISIBLE_ONE, HOMOGLYPHS, HOMOGLYPH_RE, SYSTEM_DIRS, UPLOAD_SYSTEM_DIRS, LEGACY_SYSTEM_PATH_RE, MAX_INLINE_CODE, OUTSIDE, pyImport, either, PYTHON, NODE, PERL, RUBY, PHP, syntax, sharedParser, MESSAGE_FLAGS, SHELL_INTERPRETERS, DOWNLOAD_CMDS, NORMALIZE_CACHE_MAX, normalizeCache, AST_CACHE_MAX, astCache, PARSE_FAIL, INTERPRETER_LINE, PROGRAM_DIR, ACCESS_VIEW_CACHE_MAX, accessViewCache, MAX_READING_PAYLOADS, defaultExpansionOps, VARIABLE_READERS, FS_READ_TOOLS, GREP_SHAPE, PATTERN_VERBS, PATTERN_VERB_NAMES, GREP_FILE_OPERANDS, READER_VALUE_LETTERS, FILE_OPERAND_FLAGS, SCP_VALUE_FLAGS, CURL_SOURCE_FLAGS, CURL_VALUE_LETTERS, WGET_VALUE_LETTERS, TAR_VALUE_LETTERS, ZIP_VALUE_LETTERS, RSYNC_VALUE_LETTERS, RSYNC_SKIP, CP_VALUE_LETTERS, INSTALL_VALUE_LETTERS, COPY_VERBS, TAR_MODE_WORD, COPY_VERB_HEADS, FS_OP_PRESCREEN_RE, HOME_CACHE_ALLOWLIST, SENSITIVE_PATH_RULES, AST_FS_REGEX_RULES, COMMAND_WRAPPERS, INLINE_INTERPRETER, RUNNER_WRAPPERS, _listOps, WRAPPER_TAKES_TARGET, FIND_EXEC_FLAGS, FS_MUTATION_TOOLS, HOME_VARIABLES, assignmentTable, currentStmtOffset, PAYLOAD_BUDGET, payloadBudget, seenPayloads, UNANALYSABLE_NESTING, ASSIGNMENT_HEADS, AND_OP, OR_OP, AND_OR_OPS, MAX_CALL_DEPTH, MAX_CALL_WALKS, callDepth, callWalks, FS_OP_CACHE_MAX, fsOpCache, REDIR_TRUNCATE_OPS, REDIR_FILE_IN_OPS, REDIR_HEREDOC_OPS, FIND_OPTIONS, COPY_RULE_OF, isReaderWord, positionalAfter, NONE, UNKNOWN, FORBIDDEN_PATH_SEGMENTS, BASH_TOOL_NAMES, MCP_EXECUTORS, BUILTIN_FIELDS, ARGV_FIELDS, BARE_WORD, MAX_ARGV_CHARACTERS, syntax2, WRITES, READS, DUP_OUT, HERE_STRING, AND, OR, DEFAULT_OPS, BIP39_ENGLISH, indices, IBAN_LENGTH, IBAN_BBAN_SHAPE, B58, B58_INDEX, XPRV_VERSIONS, B62, CRC32_TABLE, GITHUB_TOKEN_RE, B64URL, B64URL_INDEX, CASK_TWO_ZERO_SUFFIX, CASK_FOUR_ZERO_SUFFIX, CF_ODD, CF_EVEN, ASSIGNMENT_CONTEXT_RE, DLP_STOPWORDS, REFERENCE_VALUE_RE, IDENTIFIER_VALUE_RE, PATH_VALUE_RE, DOTTED_REFERENCE_RE, CONCATENATION_RE, EMAIL_VALUE_RE, FIXTURE_NAME_RE, DERIVATIVE_NAME_RE, QUERY_CREDENTIAL_VALUE_RE, OTP_SECRET_RE, OTP_DOC_SECRETS, ASSIGNED_SECRET_VALUE_RE, ASSIGNED_SECRET_NAME_RE, NAME_KEYWORD_RE, ARN_CONTEXT_RE, CIPHER_KEY_NAME_RE, CIPHER_NAME_PARTS, CIPHER_KEY_VALUE_RE, LARAVEL_KEY_VALUE_RE, SQL_PASSWORD_VALUE_RE, GRAFANA_KEY_VALUE_RE, BASIC_VALUE_RE, BASIC_PAIR_RE, OTP_CAPTURE_RE, DB_URL_PASSWORD_RE, DLP_PATTERNS, DLP_PATTERNS_GLOBAL, SENSITIVE_PATH_PATTERNS, SENSITIVE_PATH_REGEXES, MAX_DEPTH2, MAX_STRING_BYTES, MAX_JSON_PARSE_BYTES, syntax3, EDITOR_HEADS, MANAGER_HEADS, TUNING_FIELDS, MAP_GOVERNED, KNOB_GOVERNED, CONFIGURABLE_CHECK_IDS, SOURCE_COMMANDS, MAX_DESTINATIONS, MAX_SCAN_CHARS, EMAIL_RE, URL_RE, IBAN_RE, RECIPIENT_KEYS, MASKED_KINDS, ENTRY_RE, syntax4, PUBLISH, OWN_HEADS, TERMINAL_ESCAPE_RE, CANARY_MIN_LENGTH, MAX_TEXT, MAX_DEPTH4, MAX_JSON_PARSE, URL_DEPTH, B64_DEPTH, MIN_SEGMENT, SEPARATORS, stripSeparators, looksText, CANARY_DECODERS, VIEWS, LONG_OUTPUT_THRESHOLD_BYTES;
|
|
2864
|
+
var MAX_REGEX_LENGTH, REGEX_CACHE_MAX, regexCache, aws_default, bash_safe_default, docker_default, filesystem_default, github_default, k8s_default, mongodb_default, postgres_default, project_jail_default, redis_default, finance_default, identity_default, publishing_default, ACTION_TEMPLATES, ACTION_CHECKS, GAP, prog, httpTo, httpWrite, HTTP_WRITE, HTTP_WRITE_ANY, NOT_STRIPE_TEST, postTo, STRIPE_OBJECTS, APP_SHIELD_SPECS, APP_SHIELDS, APP_SHIELD_NAMES, APP_SERVER_GLOB, GENERAL_ACTION_RULES, BUILTIN_SHIELDS, SSRF_MAX_HOST, METADATA_ADDRESSES, METADATA_HOSTNAMES, v4Octets, CHECK_TEXT, LEVELS, MODE_VALUES, SOFT, STRICT, BLOCK_ALL, LEVEL_CHECKS, VERDICTS, CHECK_VERDICT_RANK, ALL, BUILTIN_DANGEROUS_WORDS, PRODUCT_CHECKS, SHIELD_RULE_NAME, SHIELD_RULES_FOLDED_INTO_PRODUCT, CHECKS, CHECK_BY_ID, LEGACY_TO_ID, LEGACY_READERS, INVISIBLE_RE, INVISIBLE_ONE, HOMOGLYPHS, HOMOGLYPH_RE, SYSTEM_DIRS, UPLOAD_SYSTEM_DIRS, LEGACY_SYSTEM_PATH_RE, MAX_INLINE_CODE, OUTSIDE, pyImport, either, PYTHON, NODE, PERL, RUBY, PHP, syntax, sharedParser, MESSAGE_FLAGS, SHELL_INTERPRETERS, DOWNLOAD_CMDS, NORMALIZE_CACHE_MAX, normalizeCache, AST_CACHE_MAX, astCache, PARSE_FAIL, INTERPRETER_LINE, PROGRAM_DIR, ACCESS_VIEW_CACHE_MAX, accessViewCache, MAX_READING_PAYLOADS, defaultExpansionOps, VARIABLE_READERS, FS_READ_TOOLS, GREP_SHAPE, PATTERN_VERBS, PATTERN_VERB_NAMES, GREP_FILE_OPERANDS, READER_VALUE_LETTERS, FILE_OPERAND_FLAGS, SCP_VALUE_FLAGS, CURL_SOURCE_FLAGS, CURL_VALUE_LETTERS, WGET_VALUE_LETTERS, TAR_VALUE_LETTERS, ZIP_VALUE_LETTERS, RSYNC_VALUE_LETTERS, RSYNC_SKIP, CP_VALUE_LETTERS, INSTALL_VALUE_LETTERS, COPY_VERBS, TAR_MODE_WORD, COPY_VERB_HEADS, FS_OP_PRESCREEN_RE, HOME_CACHE_ALLOWLIST, SENSITIVE_PATH_RULES, AST_FS_REGEX_RULES, COMMAND_WRAPPERS, INLINE_INTERPRETER, RUNNER_WRAPPERS, _listOps, WRAPPER_TAKES_TARGET, FIND_EXEC_FLAGS, FS_MUTATION_TOOLS, HOME_VARIABLES, assignmentTable, currentStmtOffset, PAYLOAD_BUDGET, payloadBudget, seenPayloads, UNANALYSABLE_NESTING, ASSIGNMENT_HEADS, AND_OP, OR_OP, AND_OR_OPS, MAX_CALL_DEPTH, MAX_CALL_WALKS, callDepth, callWalks, FS_OP_CACHE_MAX, fsOpCache, REDIR_TRUNCATE_OPS, REDIR_FILE_IN_OPS, REDIR_HEREDOC_OPS, FIND_OPTIONS, COPY_RULE_OF, isReaderWord, positionalAfter, NONE, UNKNOWN, FORBIDDEN_PATH_SEGMENTS, BASH_TOOL_NAMES, MCP_EXECUTORS, BUILTIN_FIELDS, ARGV_FIELDS, BARE_WORD, MAX_ARGV_CHARACTERS, syntax2, WRITES, READS, DUP_OUT, HERE_STRING, AND, OR, DEFAULT_OPS, BIP39_ENGLISH, indices, IBAN_LENGTH, IBAN_BBAN_SHAPE, B58, B58_INDEX, XPRV_VERSIONS, B62, CRC32_TABLE, GITHUB_TOKEN_RE, B64URL, B64URL_INDEX, CASK_TWO_ZERO_SUFFIX, CASK_FOUR_ZERO_SUFFIX, CF_ODD, CF_EVEN, ASSIGNMENT_CONTEXT_RE, DLP_STOPWORDS, REFERENCE_VALUE_RE, IDENTIFIER_VALUE_RE, PATH_VALUE_RE, DOTTED_REFERENCE_RE, CONCATENATION_RE, EMAIL_VALUE_RE, FIXTURE_NAME_RE, DERIVATIVE_NAME_RE, QUERY_CREDENTIAL_VALUE_RE, OTP_SECRET_RE, OTP_DOC_SECRETS, ASSIGNED_SECRET_VALUE_RE, ASSIGNED_SECRET_NAME_RE, NAME_KEYWORD_RE, ARN_CONTEXT_RE, CIPHER_KEY_NAME_RE, CIPHER_NAME_PARTS, CIPHER_KEY_VALUE_RE, LARAVEL_KEY_VALUE_RE, SQL_PASSWORD_VALUE_RE, GRAFANA_KEY_VALUE_RE, BASIC_VALUE_RE, BASIC_PAIR_RE, OTP_CAPTURE_RE, DB_URL_PASSWORD_RE, DLP_PATTERNS, DLP_PATTERNS_GLOBAL, SENSITIVE_PATH_PATTERNS, SENSITIVE_PATH_REGEXES, MAX_DEPTH2, MAX_STRING_BYTES, MAX_JSON_PARSE_BYTES, syntax3, EDITOR_HEADS, MANAGER_HEADS, TUNING_FIELDS, MAP_GOVERNED, KNOB_GOVERNED, CONFIGURABLE_CHECK_IDS, SOURCE_COMMANDS, MAX_DESTINATIONS, MAX_SCAN_CHARS, EMAIL_RE, URL_RE, IBAN_RE, RECIPIENT_KEYS, MASKED_KINDS, ENTRY_RE, syntax4, PUBLISH, OWN_HEADS, TERMINAL_ESCAPE_RE, CANARY_MIN_LENGTH, MAX_TEXT, MAX_DEPTH4, MAX_JSON_PARSE, URL_DEPTH, B64_DEPTH, MIN_SEGMENT, SEPARATORS, stripSeparators, looksText, CANARY_DECODERS, VIEWS, LONG_OUTPUT_THRESHOLD_BYTES;
|
|
2808
2865
|
var init_dist = __esm({
|
|
2809
2866
|
"packages/policy-engine/dist/index.mjs"() {
|
|
2810
2867
|
"use strict";
|
|
@@ -4426,7 +4483,7 @@ var init_dist = __esm({
|
|
|
4426
4483
|
"actions.money": {
|
|
4427
4484
|
plain: "The agent moves money (a refund, a payout, a transfer, a charge) through an app node9 has no protection for, such as an internal billing server.",
|
|
4428
4485
|
example: "refund_order on a server called acme-billing",
|
|
4429
|
-
advice: "
|
|
4486
|
+
advice: "Standard records these and Strict asks. Set Review to be asked before every money move at any level. When the app is Stripe or PayPal, turn on its own protection instead: it covers the CLI, the API and scripts too, and a call from it no longer comes here."
|
|
4430
4487
|
},
|
|
4431
4488
|
"actions.access": {
|
|
4432
4489
|
plain: "The agent changes a password, a key, a role or who belongs to a team, through an app node9 has no protection for.",
|
|
@@ -4603,6 +4660,54 @@ var init_dist = __esm({
|
|
|
4603
4660
|
advice: "Keep Block for known-malicious packages; brand-new packages already stop for Review."
|
|
4604
4661
|
}
|
|
4605
4662
|
};
|
|
4663
|
+
LEVELS = ["audit", "soft", "standard", "strict", "block-all"];
|
|
4664
|
+
MODE_VALUES = ["observe", ...LEVELS];
|
|
4665
|
+
SOFT = {
|
|
4666
|
+
"commands.inline-exec": "log",
|
|
4667
|
+
"commands.eval-dynamic": "log",
|
|
4668
|
+
"commands.rm": "log",
|
|
4669
|
+
"commands.chmod": "log",
|
|
4670
|
+
"commands.sudo": "log",
|
|
4671
|
+
"commands.git-destructive": "log",
|
|
4672
|
+
"commands.sql-ddl": "log",
|
|
4673
|
+
"commands.sql-no-where": "log",
|
|
4674
|
+
"commands.temp-binary": "log",
|
|
4675
|
+
"commands.disk-destroy": "log",
|
|
4676
|
+
"commands.dangerous-word": "log",
|
|
4677
|
+
"files.system-dirs": "log",
|
|
4678
|
+
"files.shell-startup": "log",
|
|
4679
|
+
"files.password-hashes": "log",
|
|
4680
|
+
"data.pipe-chain": "log",
|
|
4681
|
+
"behavior.untrusted-content": "log"
|
|
4682
|
+
};
|
|
4683
|
+
STRICT = {
|
|
4684
|
+
"commands.sql-ddl": "block",
|
|
4685
|
+
"commands.disk-destroy": "block",
|
|
4686
|
+
"commands.node9-disarm": "block",
|
|
4687
|
+
"files.system-dirs": "block",
|
|
4688
|
+
"files.shell-startup": "block",
|
|
4689
|
+
"files.password-hashes": "block",
|
|
4690
|
+
"data.secrets-weak": "block",
|
|
4691
|
+
"data.pipe-chain": "block",
|
|
4692
|
+
"network.unknown-host": "review",
|
|
4693
|
+
"network.internal-addresses": "block",
|
|
4694
|
+
"behavior.prompt-injection": "log",
|
|
4695
|
+
"loading.skill-tamper": "block",
|
|
4696
|
+
// Standard records money moves (catalog default log); Strict asks.
|
|
4697
|
+
"actions.money": "review"
|
|
4698
|
+
};
|
|
4699
|
+
BLOCK_ALL = {
|
|
4700
|
+
...STRICT,
|
|
4701
|
+
"commands.unknown": "review",
|
|
4702
|
+
"commands.temp-binary": "block"
|
|
4703
|
+
};
|
|
4704
|
+
LEVEL_CHECKS = {
|
|
4705
|
+
audit: {},
|
|
4706
|
+
soft: SOFT,
|
|
4707
|
+
standard: {},
|
|
4708
|
+
strict: STRICT,
|
|
4709
|
+
"block-all": BLOCK_ALL
|
|
4710
|
+
};
|
|
4606
4711
|
VERDICTS = ["off", "log", "review", "block"];
|
|
4607
4712
|
CHECK_VERDICT_RANK = { off: 0, log: 1, review: 2, block: 3 };
|
|
4608
4713
|
ALL = VERDICTS;
|
|
@@ -5019,7 +5124,10 @@ var init_dist = __esm({
|
|
|
5019
5124
|
title: "Money moves",
|
|
5020
5125
|
catches: "a refund, payout, transfer, charge or withdrawal through an app with no protection of its own",
|
|
5021
5126
|
values: ALL,
|
|
5022
|
-
|
|
5127
|
+
// Founder decision 2026-10-25: a transfer the user asked for is ordinary
|
|
5128
|
+
// work. Standard records it; Strict asks (levels.ts); a user who wants to
|
|
5129
|
+
// be asked states review.
|
|
5130
|
+
defaultValue: "log",
|
|
5023
5131
|
legacy: generalActionRuleNames("finance")
|
|
5024
5132
|
},
|
|
5025
5133
|
{
|
|
@@ -5056,7 +5164,7 @@ var init_dist = __esm({
|
|
|
5056
5164
|
"commands.rm": (s) => knob(s.commandChecks?.rmAdvisory),
|
|
5057
5165
|
"commands.chmod": (s) => knob(s.commandChecks?.chmod),
|
|
5058
5166
|
"commands.sql-ddl": (s) => knob(s.commandChecks?.sqlDdl),
|
|
5059
|
-
"commands.unknown": (s) => s.mode === void 0 ? void 0 : s.mode
|
|
5167
|
+
"commands.unknown": (s) => s.mode === void 0 ? void 0 : isBlockAll(s.mode) ? "review" : "off",
|
|
5060
5168
|
"data.secrets": (s) => enabledOr(s.dlp?.enabled, "block"),
|
|
5061
5169
|
"data.secrets-weak": (s) => {
|
|
5062
5170
|
if (s.dlp?.enabled === false) return "off";
|
|
@@ -10066,7 +10174,8 @@ var init_config_schema = __esm({
|
|
|
10066
10174
|
ConfigFileSchema = z.object({
|
|
10067
10175
|
version: z.string().optional(),
|
|
10068
10176
|
settings: z.object({
|
|
10069
|
-
|
|
10177
|
+
// The protection level (levels.ts in the engine); `observe` is Audit's older name.
|
|
10178
|
+
mode: z.enum(["observe", "audit", "soft", "standard", "strict", "block-all"]).optional(),
|
|
10070
10179
|
autoStartDaemon: z.boolean().optional(),
|
|
10071
10180
|
// enableUndo / policy.snapshot: removed with the undo feature. The
|
|
10072
10181
|
// schema strips undeclared keys silently (plain zod object — no
|
|
@@ -10472,7 +10581,7 @@ var MODE_ORDER, EGRESS_MODE_ORDER, DLP_PII_ORDER, DLP_REVIEW_ACTION_ORDER, COMMA
|
|
|
10472
10581
|
var init_managed = __esm({
|
|
10473
10582
|
"src/config/managed.ts"() {
|
|
10474
10583
|
"use strict";
|
|
10475
|
-
MODE_ORDER = ["observe", "audit", "standard", "strict"];
|
|
10584
|
+
MODE_ORDER = ["observe", "audit", "soft", "standard", "strict", "block-all"];
|
|
10476
10585
|
EGRESS_MODE_ORDER = ["off", "review", "block"];
|
|
10477
10586
|
DLP_PII_ORDER = ["off", "block"];
|
|
10478
10587
|
DLP_REVIEW_ACTION_ORDER = ["review", "block"];
|
|
@@ -10562,7 +10671,7 @@ function v2ToLegacy(raw, options = {}) {
|
|
|
10562
10671
|
continue;
|
|
10563
10672
|
}
|
|
10564
10673
|
if (id === "commands.unknown") {
|
|
10565
|
-
warnings.push(`checks.${id}: set "mode": "
|
|
10674
|
+
warnings.push(`checks.${id}: set "mode": "block-all" instead`);
|
|
10566
10675
|
continue;
|
|
10567
10676
|
}
|
|
10568
10677
|
const allowed = configurableValues(id);
|
|
@@ -10795,6 +10904,11 @@ function logCacheReadIssue(cacheFile, kind) {
|
|
|
10795
10904
|
} catch {
|
|
10796
10905
|
}
|
|
10797
10906
|
}
|
|
10907
|
+
function statedSignalFields(policy) {
|
|
10908
|
+
return Object.keys(tuningFromLegacyPolicy(policy)["loading.malicious-package"] ?? {}).filter(
|
|
10909
|
+
(k) => k === "newPackage" || k === "installScript"
|
|
10910
|
+
);
|
|
10911
|
+
}
|
|
10798
10912
|
function catalogSettingsFrom(settings, policy) {
|
|
10799
10913
|
return catalogSettingsFromConfig(settings, policy);
|
|
10800
10914
|
}
|
|
@@ -10862,6 +10976,8 @@ function getConfig(cwd) {
|
|
|
10862
10976
|
const keyed = !!pr2Creds?.apiKey && pr2Creds.localOnly !== true;
|
|
10863
10977
|
let ssrfStrictSource = "default";
|
|
10864
10978
|
const workspaceChecks = {};
|
|
10979
|
+
const managedStatedChecks = /* @__PURE__ */ new Set();
|
|
10980
|
+
const managedStatedSignals = /* @__PURE__ */ new Set();
|
|
10865
10981
|
const applyLayer = (source, isProject = false, isCloud = false) => {
|
|
10866
10982
|
if (!source) return;
|
|
10867
10983
|
const s = source.settings || {};
|
|
@@ -11069,9 +11185,11 @@ function getConfig(cwd) {
|
|
|
11069
11185
|
if (raw.managedConfig && typeof raw.managedConfig === "object") {
|
|
11070
11186
|
const mc = raw.managedConfig;
|
|
11071
11187
|
const locked = Array.isArray(mc.locked) ? mc.locked.filter((f) => typeof f === "string") : [];
|
|
11188
|
+
for (const id of knobStatedChecks(mc)) managedStatedChecks.add(id);
|
|
11189
|
+
for (const k of statedSignalFields(mc)) managedStatedSignals.add(k);
|
|
11072
11190
|
if (typeof mc.mode === "string") {
|
|
11073
11191
|
if (keyed) {
|
|
11074
|
-
if (
|
|
11192
|
+
if (isModeValue(mc.mode)) {
|
|
11075
11193
|
mergedSettings.mode = mc.mode;
|
|
11076
11194
|
}
|
|
11077
11195
|
} else {
|
|
@@ -11353,14 +11471,15 @@ function getConfig(cwd) {
|
|
|
11353
11471
|
const envMode = process.env.NODE9_MODE;
|
|
11354
11472
|
if (envMode && !modeCloudControlled && // PR-2: one listening point includes the env var — a keyed machine's
|
|
11355
11473
|
// mode comes from the workspace (or the shipped default), never the shell.
|
|
11356
|
-
!keyed &&
|
|
11474
|
+
!keyed && isModeValue(envMode)) {
|
|
11357
11475
|
mergedSettings.mode = envMode;
|
|
11358
11476
|
}
|
|
11359
|
-
if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && (mergedSettings.mode
|
|
11477
|
+
if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && isRecordOnly(mergedSettings.mode)) {
|
|
11360
11478
|
mergedSettings.mode = "standard";
|
|
11361
11479
|
}
|
|
11362
|
-
const
|
|
11363
|
-
|
|
11480
|
+
const cloudStrictLevel = levelOf(mergedSettings.mode) === "strict" || levelOf(mergedSettings.mode) === "block-all";
|
|
11481
|
+
const managedFloorActive = cloudManagedShields.length > 0 || cloudMandatesEnforcement || modeCloudControlled && cloudStrictLevel;
|
|
11482
|
+
if (modeCloudControlled && cloudStrictLevel) {
|
|
11364
11483
|
for (const name of Object.keys(mergedEnvironments)) {
|
|
11365
11484
|
if (mergedEnvironments[name]?.requireApproval === false) {
|
|
11366
11485
|
const cleaned = { ...mergedEnvironments[name] };
|
|
@@ -11378,6 +11497,35 @@ function getConfig(cwd) {
|
|
|
11378
11497
|
mergedPolicy.ignoredTools = [...new Set(mergedPolicy.ignoredTools)];
|
|
11379
11498
|
mergedPolicy.skillPinning.roots = [...new Set(mergedPolicy.skillPinning.roots)];
|
|
11380
11499
|
const resolvedSsrfStrictSource = keyed && ssrfStrictSource === "local" ? "default" : ssrfStrictSource;
|
|
11500
|
+
const level = levelOf(mergedSettings.mode);
|
|
11501
|
+
const levelKnobChecks = Object.entries(levelChecks(level)).filter(([id]) => isKnobGoverned(id));
|
|
11502
|
+
const signals = levelPackageSignals(level);
|
|
11503
|
+
if (levelKnobChecks.length > 0 || signals) {
|
|
11504
|
+
const policyOf = (layer) => layer?.policy ?? {};
|
|
11505
|
+
const trusted = /* @__PURE__ */ new Set([...managedStatedChecks, ...Object.keys(workspaceChecks)]);
|
|
11506
|
+
const trustedSignals = new Set(managedStatedSignals);
|
|
11507
|
+
const project = /* @__PURE__ */ new Set();
|
|
11508
|
+
const projectSignals = /* @__PURE__ */ new Set();
|
|
11509
|
+
if (!keyed) {
|
|
11510
|
+
for (const id of knobStatedChecks(policyOf(globalConfig))) trusted.add(id);
|
|
11511
|
+
for (const k of statedSignalFields(policyOf(globalConfig))) trustedSignals.add(k);
|
|
11512
|
+
for (const id of knobStatedChecks(policyOf(projectConfig))) project.add(id);
|
|
11513
|
+
for (const k of statedSignalFields(policyOf(projectConfig))) projectSignals.add(k);
|
|
11514
|
+
}
|
|
11515
|
+
const before = resolveCheckMap(catalogSettingsFromConfig({}, mergedPolicy));
|
|
11516
|
+
for (const [id, v] of levelKnobChecks) {
|
|
11517
|
+
if (trusted.has(id)) continue;
|
|
11518
|
+
if (project.has(id) && CHECK_VERDICT_RANK[v] <= CHECK_VERDICT_RANK[before[id] ?? "off"])
|
|
11519
|
+
continue;
|
|
11520
|
+
checkToLegacyPolicy(mergedPolicy, id, v);
|
|
11521
|
+
}
|
|
11522
|
+
if (signals) {
|
|
11523
|
+
for (const key of ["newPackage", "installScript"]) {
|
|
11524
|
+
if (trustedSignals.has(key) || projectSignals.has(key)) continue;
|
|
11525
|
+
mergedPolicy.packageCheck[key] = signals[key];
|
|
11526
|
+
}
|
|
11527
|
+
}
|
|
11528
|
+
}
|
|
11381
11529
|
const explicit = {};
|
|
11382
11530
|
const checkSources = {};
|
|
11383
11531
|
if (keyed) {
|
|
@@ -11781,7 +11929,8 @@ var init_config = __esm({
|
|
|
11781
11929
|
// ── Actions in apps (node9Firewall#390) ───────────────────────────────
|
|
11782
11930
|
// actions.money / actions.access / actions.publish: the action templates
|
|
11783
11931
|
// on every MCP server no app shield claims, plus the shell publishing
|
|
11784
|
-
// rules. Review
|
|
11932
|
+
// rules. Review on the rule; the check value governs them (money is
|
|
11933
|
+
// recorded at Standard, asked at Strict).
|
|
11785
11934
|
...GENERAL_ACTION_RULES
|
|
11786
11935
|
],
|
|
11787
11936
|
dlp: { enabled: true, scanIgnoredTools: true, pii: "block" },
|
|
@@ -12859,6 +13008,7 @@ var init_provenance = __esm({
|
|
|
12859
13008
|
var init_policy = __esm({
|
|
12860
13009
|
"src/policy/index.ts"() {
|
|
12861
13010
|
"use strict";
|
|
13011
|
+
init_dist();
|
|
12862
13012
|
init_dlp();
|
|
12863
13013
|
init_file_access();
|
|
12864
13014
|
init_config();
|