@node9/proxy 2.38.0 → 2.39.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 +1113 -969
- package/dist/cli.mjs +1112 -968
- package/dist/dashboard.mjs +157 -13
- package/dist/index.js +181 -44
- package/dist/index.mjs +181 -44
- package/dist/scan-ink.mjs +23 -1
- 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";
|
|
@@ -4603,6 +4660,52 @@ 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
|
+
};
|
|
4697
|
+
BLOCK_ALL = {
|
|
4698
|
+
...STRICT,
|
|
4699
|
+
"commands.unknown": "review",
|
|
4700
|
+
"commands.temp-binary": "block"
|
|
4701
|
+
};
|
|
4702
|
+
LEVEL_CHECKS = {
|
|
4703
|
+
audit: {},
|
|
4704
|
+
soft: SOFT,
|
|
4705
|
+
standard: {},
|
|
4706
|
+
strict: STRICT,
|
|
4707
|
+
"block-all": BLOCK_ALL
|
|
4708
|
+
};
|
|
4606
4709
|
VERDICTS = ["off", "log", "review", "block"];
|
|
4607
4710
|
CHECK_VERDICT_RANK = { off: 0, log: 1, review: 2, block: 3 };
|
|
4608
4711
|
ALL = VERDICTS;
|
|
@@ -5056,7 +5159,7 @@ var init_dist = __esm({
|
|
|
5056
5159
|
"commands.rm": (s) => knob(s.commandChecks?.rmAdvisory),
|
|
5057
5160
|
"commands.chmod": (s) => knob(s.commandChecks?.chmod),
|
|
5058
5161
|
"commands.sql-ddl": (s) => knob(s.commandChecks?.sqlDdl),
|
|
5059
|
-
"commands.unknown": (s) => s.mode === void 0 ? void 0 : s.mode
|
|
5162
|
+
"commands.unknown": (s) => s.mode === void 0 ? void 0 : isBlockAll(s.mode) ? "review" : "off",
|
|
5060
5163
|
"data.secrets": (s) => enabledOr(s.dlp?.enabled, "block"),
|
|
5061
5164
|
"data.secrets-weak": (s) => {
|
|
5062
5165
|
if (s.dlp?.enabled === false) return "off";
|
|
@@ -10066,7 +10169,8 @@ var init_config_schema = __esm({
|
|
|
10066
10169
|
ConfigFileSchema = z.object({
|
|
10067
10170
|
version: z.string().optional(),
|
|
10068
10171
|
settings: z.object({
|
|
10069
|
-
|
|
10172
|
+
// The protection level (levels.ts in the engine); `observe` is Audit's older name.
|
|
10173
|
+
mode: z.enum(["observe", "audit", "soft", "standard", "strict", "block-all"]).optional(),
|
|
10070
10174
|
autoStartDaemon: z.boolean().optional(),
|
|
10071
10175
|
// enableUndo / policy.snapshot: removed with the undo feature. The
|
|
10072
10176
|
// schema strips undeclared keys silently (plain zod object — no
|
|
@@ -10472,7 +10576,7 @@ var MODE_ORDER, EGRESS_MODE_ORDER, DLP_PII_ORDER, DLP_REVIEW_ACTION_ORDER, COMMA
|
|
|
10472
10576
|
var init_managed = __esm({
|
|
10473
10577
|
"src/config/managed.ts"() {
|
|
10474
10578
|
"use strict";
|
|
10475
|
-
MODE_ORDER = ["observe", "audit", "standard", "strict"];
|
|
10579
|
+
MODE_ORDER = ["observe", "audit", "soft", "standard", "strict", "block-all"];
|
|
10476
10580
|
EGRESS_MODE_ORDER = ["off", "review", "block"];
|
|
10477
10581
|
DLP_PII_ORDER = ["off", "block"];
|
|
10478
10582
|
DLP_REVIEW_ACTION_ORDER = ["review", "block"];
|
|
@@ -10562,7 +10666,7 @@ function v2ToLegacy(raw, options = {}) {
|
|
|
10562
10666
|
continue;
|
|
10563
10667
|
}
|
|
10564
10668
|
if (id === "commands.unknown") {
|
|
10565
|
-
warnings.push(`checks.${id}: set "mode": "
|
|
10669
|
+
warnings.push(`checks.${id}: set "mode": "block-all" instead`);
|
|
10566
10670
|
continue;
|
|
10567
10671
|
}
|
|
10568
10672
|
const allowed = configurableValues(id);
|
|
@@ -10795,6 +10899,11 @@ function logCacheReadIssue(cacheFile, kind) {
|
|
|
10795
10899
|
} catch {
|
|
10796
10900
|
}
|
|
10797
10901
|
}
|
|
10902
|
+
function statedSignalFields(policy) {
|
|
10903
|
+
return Object.keys(tuningFromLegacyPolicy(policy)["loading.malicious-package"] ?? {}).filter(
|
|
10904
|
+
(k) => k === "newPackage" || k === "installScript"
|
|
10905
|
+
);
|
|
10906
|
+
}
|
|
10798
10907
|
function catalogSettingsFrom(settings, policy) {
|
|
10799
10908
|
return catalogSettingsFromConfig(settings, policy);
|
|
10800
10909
|
}
|
|
@@ -10862,6 +10971,8 @@ function getConfig(cwd) {
|
|
|
10862
10971
|
const keyed = !!pr2Creds?.apiKey && pr2Creds.localOnly !== true;
|
|
10863
10972
|
let ssrfStrictSource = "default";
|
|
10864
10973
|
const workspaceChecks = {};
|
|
10974
|
+
const managedStatedChecks = /* @__PURE__ */ new Set();
|
|
10975
|
+
const managedStatedSignals = /* @__PURE__ */ new Set();
|
|
10865
10976
|
const applyLayer = (source, isProject = false, isCloud = false) => {
|
|
10866
10977
|
if (!source) return;
|
|
10867
10978
|
const s = source.settings || {};
|
|
@@ -11069,9 +11180,11 @@ function getConfig(cwd) {
|
|
|
11069
11180
|
if (raw.managedConfig && typeof raw.managedConfig === "object") {
|
|
11070
11181
|
const mc = raw.managedConfig;
|
|
11071
11182
|
const locked = Array.isArray(mc.locked) ? mc.locked.filter((f) => typeof f === "string") : [];
|
|
11183
|
+
for (const id of knobStatedChecks(mc)) managedStatedChecks.add(id);
|
|
11184
|
+
for (const k of statedSignalFields(mc)) managedStatedSignals.add(k);
|
|
11072
11185
|
if (typeof mc.mode === "string") {
|
|
11073
11186
|
if (keyed) {
|
|
11074
|
-
if (
|
|
11187
|
+
if (isModeValue(mc.mode)) {
|
|
11075
11188
|
mergedSettings.mode = mc.mode;
|
|
11076
11189
|
}
|
|
11077
11190
|
} else {
|
|
@@ -11353,14 +11466,15 @@ function getConfig(cwd) {
|
|
|
11353
11466
|
const envMode = process.env.NODE9_MODE;
|
|
11354
11467
|
if (envMode && !modeCloudControlled && // PR-2: one listening point includes the env var — a keyed machine's
|
|
11355
11468
|
// mode comes from the workspace (or the shipped default), never the shell.
|
|
11356
|
-
!keyed &&
|
|
11469
|
+
!keyed && isModeValue(envMode)) {
|
|
11357
11470
|
mergedSettings.mode = envMode;
|
|
11358
11471
|
}
|
|
11359
|
-
if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && (mergedSettings.mode
|
|
11472
|
+
if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && isRecordOnly(mergedSettings.mode)) {
|
|
11360
11473
|
mergedSettings.mode = "standard";
|
|
11361
11474
|
}
|
|
11362
|
-
const
|
|
11363
|
-
|
|
11475
|
+
const cloudStrictLevel = levelOf(mergedSettings.mode) === "strict" || levelOf(mergedSettings.mode) === "block-all";
|
|
11476
|
+
const managedFloorActive = cloudManagedShields.length > 0 || cloudMandatesEnforcement || modeCloudControlled && cloudStrictLevel;
|
|
11477
|
+
if (modeCloudControlled && cloudStrictLevel) {
|
|
11364
11478
|
for (const name of Object.keys(mergedEnvironments)) {
|
|
11365
11479
|
if (mergedEnvironments[name]?.requireApproval === false) {
|
|
11366
11480
|
const cleaned = { ...mergedEnvironments[name] };
|
|
@@ -11378,6 +11492,35 @@ function getConfig(cwd) {
|
|
|
11378
11492
|
mergedPolicy.ignoredTools = [...new Set(mergedPolicy.ignoredTools)];
|
|
11379
11493
|
mergedPolicy.skillPinning.roots = [...new Set(mergedPolicy.skillPinning.roots)];
|
|
11380
11494
|
const resolvedSsrfStrictSource = keyed && ssrfStrictSource === "local" ? "default" : ssrfStrictSource;
|
|
11495
|
+
const level = levelOf(mergedSettings.mode);
|
|
11496
|
+
const levelKnobChecks = Object.entries(levelChecks(level)).filter(([id]) => isKnobGoverned(id));
|
|
11497
|
+
const signals = levelPackageSignals(level);
|
|
11498
|
+
if (levelKnobChecks.length > 0 || signals) {
|
|
11499
|
+
const policyOf = (layer) => layer?.policy ?? {};
|
|
11500
|
+
const trusted = /* @__PURE__ */ new Set([...managedStatedChecks, ...Object.keys(workspaceChecks)]);
|
|
11501
|
+
const trustedSignals = new Set(managedStatedSignals);
|
|
11502
|
+
const project = /* @__PURE__ */ new Set();
|
|
11503
|
+
const projectSignals = /* @__PURE__ */ new Set();
|
|
11504
|
+
if (!keyed) {
|
|
11505
|
+
for (const id of knobStatedChecks(policyOf(globalConfig))) trusted.add(id);
|
|
11506
|
+
for (const k of statedSignalFields(policyOf(globalConfig))) trustedSignals.add(k);
|
|
11507
|
+
for (const id of knobStatedChecks(policyOf(projectConfig))) project.add(id);
|
|
11508
|
+
for (const k of statedSignalFields(policyOf(projectConfig))) projectSignals.add(k);
|
|
11509
|
+
}
|
|
11510
|
+
const before = resolveCheckMap(catalogSettingsFromConfig({}, mergedPolicy));
|
|
11511
|
+
for (const [id, v] of levelKnobChecks) {
|
|
11512
|
+
if (trusted.has(id)) continue;
|
|
11513
|
+
if (project.has(id) && CHECK_VERDICT_RANK[v] <= CHECK_VERDICT_RANK[before[id] ?? "off"])
|
|
11514
|
+
continue;
|
|
11515
|
+
checkToLegacyPolicy(mergedPolicy, id, v);
|
|
11516
|
+
}
|
|
11517
|
+
if (signals) {
|
|
11518
|
+
for (const key of ["newPackage", "installScript"]) {
|
|
11519
|
+
if (trustedSignals.has(key) || projectSignals.has(key)) continue;
|
|
11520
|
+
mergedPolicy.packageCheck[key] = signals[key];
|
|
11521
|
+
}
|
|
11522
|
+
}
|
|
11523
|
+
}
|
|
11381
11524
|
const explicit = {};
|
|
11382
11525
|
const checkSources = {};
|
|
11383
11526
|
if (keyed) {
|
|
@@ -12859,6 +13002,7 @@ var init_provenance = __esm({
|
|
|
12859
13002
|
var init_policy = __esm({
|
|
12860
13003
|
"src/policy/index.ts"() {
|
|
12861
13004
|
"use strict";
|
|
13005
|
+
init_dist();
|
|
12862
13006
|
init_dlp();
|
|
12863
13007
|
init_file_access();
|
|
12864
13008
|
init_config();
|