@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/index.js
CHANGED
|
@@ -449,6 +449,32 @@ function ssrfFloorDecision(m, asWritten, opts) {
|
|
|
449
449
|
}
|
|
450
450
|
return "block";
|
|
451
451
|
}
|
|
452
|
+
function isModeValue(v) {
|
|
453
|
+
return typeof v === "string" && MODE_VALUES.includes(v);
|
|
454
|
+
}
|
|
455
|
+
function levelOf(mode) {
|
|
456
|
+
if (mode === "observe") return "audit";
|
|
457
|
+
return LEVELS.includes(mode ?? "") ? mode : "standard";
|
|
458
|
+
}
|
|
459
|
+
function isRecordOnly(mode) {
|
|
460
|
+
return levelOf(mode) === "audit";
|
|
461
|
+
}
|
|
462
|
+
function reviewsEveryInline(mode) {
|
|
463
|
+
const level = levelOf(mode);
|
|
464
|
+
return level === "strict" || level === "block-all";
|
|
465
|
+
}
|
|
466
|
+
function isBlockAll(mode) {
|
|
467
|
+
return levelOf(mode) === "block-all";
|
|
468
|
+
}
|
|
469
|
+
function levelCheckValue(mode, id) {
|
|
470
|
+
return LEVEL_CHECKS[levelOf(mode)][id];
|
|
471
|
+
}
|
|
472
|
+
function levelChecks(mode) {
|
|
473
|
+
return LEVEL_CHECKS[levelOf(mode)];
|
|
474
|
+
}
|
|
475
|
+
function levelPackageSignals(mode) {
|
|
476
|
+
return levelOf(mode) === "soft" ? { newPackage: "off", installScript: "off" } : void 0;
|
|
477
|
+
}
|
|
452
478
|
function isVerdict(v) {
|
|
453
479
|
return v === "off" || v === "log" || v === "review" || v === "block";
|
|
454
480
|
}
|
|
@@ -594,19 +620,21 @@ function resolveCheck(settings, id) {
|
|
|
594
620
|
if (!def) return void 0;
|
|
595
621
|
if (isLockedCheck(def)) return { id, value: "block", source: "locked" };
|
|
596
622
|
const floor = def.floor ? CHECK_VERDICT_RANK[def.floor] : 0;
|
|
623
|
+
const levelDefault = levelCheckValue(settings.mode, id) ?? def.defaultValue;
|
|
624
|
+
const sourceOf = (value2) => value2 === levelDefault ? "default" : "configured";
|
|
597
625
|
const explicit = settings.checks?.[id];
|
|
598
626
|
if (isVerdict(explicit)) {
|
|
599
627
|
const value2 = CHECK_VERDICT_RANK[explicit] < floor ? def.floor : explicit;
|
|
600
|
-
return { id, value: value2, source: value2
|
|
628
|
+
return { id, value: value2, source: sourceOf(value2) };
|
|
601
629
|
}
|
|
602
630
|
if (def.pack) {
|
|
603
631
|
const on = settings.appliedShields?.includes(def.pack) ?? false;
|
|
604
632
|
return { id, value: on ? def.defaultValue : "off", source: "default" };
|
|
605
633
|
}
|
|
606
634
|
const read2 = LEGACY_READERS[id]?.(settings);
|
|
607
|
-
if (read2 === void 0) return { id, value:
|
|
635
|
+
if (read2 === void 0) return { id, value: levelDefault, source: "default" };
|
|
608
636
|
const value = CHECK_VERDICT_RANK[read2] < floor ? def.floor : read2;
|
|
609
|
-
return { id, value, source: value
|
|
637
|
+
return { id, value, source: sourceOf(value) };
|
|
610
638
|
}
|
|
611
639
|
function checkValue(settings, id) {
|
|
612
640
|
return resolveCheck(settings, id)?.value ?? "off";
|
|
@@ -5356,6 +5384,20 @@ function extractPackageInstalls(command) {
|
|
|
5356
5384
|
return true;
|
|
5357
5385
|
});
|
|
5358
5386
|
}
|
|
5387
|
+
function tuningFromLegacyPolicy(policy) {
|
|
5388
|
+
const out = {};
|
|
5389
|
+
const p = policy;
|
|
5390
|
+
if (policy.packageCheck?.registrySignals === false) {
|
|
5391
|
+
out["loading.malicious-package"] = { newPackage: "off", installScript: "off" };
|
|
5392
|
+
}
|
|
5393
|
+
for (const f of TUNING_FIELDS) {
|
|
5394
|
+
const [block, key] = f.legacy;
|
|
5395
|
+
const value = p[block]?.[key];
|
|
5396
|
+
if (value === void 0) continue;
|
|
5397
|
+
(out[f.checkId] ??= {})[f.name] = value;
|
|
5398
|
+
}
|
|
5399
|
+
return out;
|
|
5400
|
+
}
|
|
5359
5401
|
function tuningToLegacyPolicy(policy, tuning) {
|
|
5360
5402
|
const unknown = [];
|
|
5361
5403
|
for (const [id, fields] of Object.entries(tuning)) {
|
|
@@ -5470,6 +5512,25 @@ function checkToLegacyPolicy(policy, id, v) {
|
|
|
5470
5512
|
return false;
|
|
5471
5513
|
}
|
|
5472
5514
|
}
|
|
5515
|
+
function knobStatedChecks(policy) {
|
|
5516
|
+
const out = /* @__PURE__ */ new Set();
|
|
5517
|
+
const has = (o, key) => !!o && typeof o === "object" && o[key] !== void 0;
|
|
5518
|
+
const { dlp, egress, loopDetection, injectionScan, skillPinning, packageCheck } = policy;
|
|
5519
|
+
const uc = policy.untrustedContent;
|
|
5520
|
+
if (has(dlp, "enabled")) out.add("data.secrets");
|
|
5521
|
+
if (has(dlp, "reviewAction") || dlp?.enabled === false) out.add("data.secrets-weak");
|
|
5522
|
+
if (has(dlp, "pii")) out.add("data.pii");
|
|
5523
|
+
if (has(egress, "enabled") || has(egress, "mode")) out.add("network.unknown-host");
|
|
5524
|
+
if (has(egress, "ssrfStrict")) out.add("network.internal-addresses");
|
|
5525
|
+
if (has(loopDetection, "enabled")) out.add("behavior.loops");
|
|
5526
|
+
if (has(injectionScan, "enabled")) out.add("behavior.prompt-injection");
|
|
5527
|
+
if (has(skillPinning, "enabled") || has(skillPinning, "mode")) out.add("loading.skill-tamper");
|
|
5528
|
+
if (has(packageCheck, "enabled") || has(packageCheck, "onMalicious"))
|
|
5529
|
+
out.add("loading.malicious-package");
|
|
5530
|
+
if (uc && typeof uc === "object" && (uc.enabled === false || has(uc, "afterExposure")))
|
|
5531
|
+
out.add("behavior.untrusted-content");
|
|
5532
|
+
return out;
|
|
5533
|
+
}
|
|
5473
5534
|
function isKnobGoverned(id) {
|
|
5474
5535
|
return id in KNOB_GOVERNED;
|
|
5475
5536
|
}
|
|
@@ -6280,7 +6341,7 @@ async function evaluatePolicyCore(config, toolName, args, context = {}, hooks =
|
|
|
6280
6341
|
if (v?.logged) noteLogged(v);
|
|
6281
6342
|
else if (v) candidates.push(v);
|
|
6282
6343
|
};
|
|
6283
|
-
const inline = config.settings.mode
|
|
6344
|
+
const inline = reviewsEveryInline(config.settings.mode) ? detectInlineExec(shellCommand) ? void 0 : null : inlineExecReview(shellCommand);
|
|
6284
6345
|
if (inline !== null) {
|
|
6285
6346
|
consider("commands.inline-exec", {
|
|
6286
6347
|
decision: "review",
|
|
@@ -6340,21 +6401,17 @@ async function evaluatePolicyCore(config, toolName, args, context = {}, hooks =
|
|
|
6340
6401
|
if (firstToken && firstToken.startsWith("/") && checkProvenance2) {
|
|
6341
6402
|
const prov = checkProvenance2(firstToken, cwd);
|
|
6342
6403
|
if (prov.trustLevel === "suspect") {
|
|
6343
|
-
const
|
|
6344
|
-
|
|
6345
|
-
|
|
6346
|
-
{
|
|
6347
|
-
|
|
6348
|
-
|
|
6349
|
-
|
|
6350
|
-
tier: 3,
|
|
6351
|
-
checkId: "commands.temp-binary"
|
|
6352
|
-
}
|
|
6353
|
-
);
|
|
6404
|
+
const v = applyCheckValue(cv("commands.temp-binary"), {
|
|
6405
|
+
decision: "review",
|
|
6406
|
+
blockedByLabel: "Node9: Suspect Binary",
|
|
6407
|
+
reason: `Binary "${firstToken}" resolved to ${prov.resolvedPath} \u2014 ${prov.reason}`,
|
|
6408
|
+
tier: 3,
|
|
6409
|
+
checkId: "commands.temp-binary"
|
|
6410
|
+
});
|
|
6354
6411
|
if (v?.logged) noteLogged(v);
|
|
6355
6412
|
else if (v) return v;
|
|
6356
6413
|
}
|
|
6357
|
-
if (prov.trustLevel === "unknown" && config.settings.mode
|
|
6414
|
+
if (prov.trustLevel === "unknown" && isBlockAll(config.settings.mode)) {
|
|
6358
6415
|
return {
|
|
6359
6416
|
decision: "review",
|
|
6360
6417
|
blockedByLabel: "Node9: Unknown Binary (strict mode)",
|
|
@@ -6445,7 +6502,7 @@ async function evaluatePolicyCore(config, toolName, args, context = {}, hooks =
|
|
|
6445
6502
|
if (v?.logged) noteLogged(v);
|
|
6446
6503
|
else if (v) return v;
|
|
6447
6504
|
}
|
|
6448
|
-
if (config.settings.mode
|
|
6505
|
+
if (isBlockAll(config.settings.mode)) {
|
|
6449
6506
|
if (activeEnvironment?.requireApproval === false) return allowed();
|
|
6450
6507
|
return {
|
|
6451
6508
|
decision: "review",
|
|
@@ -7376,7 +7433,7 @@ function matchCanaryArgs(args, values) {
|
|
|
7376
7433
|
return null;
|
|
7377
7434
|
}
|
|
7378
7435
|
}
|
|
7379
|
-
var import_picomatch, import_safe_regex2, import_picomatch2, import_mvdan_sh, import_mvdan_sh2, import_safe_regex22, import_crypto2, import_crypto3, import_mvdan_sh3, import_crypto4, import_mvdan_sh4, import_crypto5, 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, STRICT_TIERS, METADATA_HOSTNAMES, v4Octets, TIER_REASON, 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, PROJECT_JAIL_BLOCK_READ, OVERRIDE_PREFIX, LABEL_WRAPPERS, LEGACY_READERS, INVISIBLE_RE, INVISIBLE_ONE, HOMOGLYPHS, HOMOGLYPH_RE, MAX_BLOBS, MIN_DECODED, BASE64_RUN_RE, HEX_RUN_RE, HEX_ESCAPE_RUN_RE, SYSTEM_AUTH_FILES, SYSTEM_AUTH_DIRS, PASSWORD_HASH_FILES, STARTUP_NAMES, SYSTEM_DIRS, SYSTEM_DIRS_EXEMPT, UPLOAD_SYSTEM_DIRS, AGENT_INSTRUCTION_FILES, AGENT_INSTRUCTION_DIRS, LEGACY_SYSTEM_PATH_RE, MAX_INLINE_CODE, WHAT, OUTSIDE, pyImport, either, PYTHON, NODE, PERL, RUBY, PHP, TABLES, STRING_LITERAL, 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, SQL_DB_CLIS, SQL_DDL_RE, CHMOD_OPEN_PERM_TOKENS, COMMAND_WRAPPERS, INLINE_INTERPRETER, RUNNER_WRAPPERS, _redirStdinOps, _listOps, WRAPPER_TAKES_TARGET, FIND_EXEC_FLAGS, FS_MUTATION_TOOLS, INTERP_LEADING_TARGET, MAX_PAYLOAD_NESTING, payloadNesting, MAX_INLINE_CALLS, INLINE_EXEC_FALLBACK, UNREADABLE_SOURCE, SCRIPT_RUNNERS, SCRIPT_RUNNER_VALUE_FLAGS, MAX_SCRIPT_OPERANDS, NET_BINARIES, VALUE_FLAGS, 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, stripDotSlash, 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, MAX_ALTERNATIVES, MAX_CALL_DEPTH2, MAX_CALL_WALKS2, POSITIONAL, MAX_DEPTH, MAX_PAYLOAD_DEPTH, unique, clone, SENDING_STDIN, DOWNLOAD_SHORT_VALUE, DOWNLOAD_LONG_VALUE, DOWNLOAD_OUTPUT_FLAGS, DOWNLOAD_DIR_FLAGS, base, quoteGlob, asWord, WRITES, READS, DUP_OUT, HERE_STRING, AND, OR, DEFAULT_OPS, exempt, RANK, BIP39_ENGLISH, BIP39_PUBLIC_VECTORS, indices, lengths, hash, MAX_MNEMONIC_HASHES, SECRET_VIEW_LIMITS, 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, SPANISH_LETTERS, HETU_CHARS, MAX, UNTRUSTED_TOOLS, SIGNALS, MENTION_QUOTE_RE, MENTION_WORD_RE, 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, BATCH_SEPARATOR, syntax3, NPM_INSTALL_VERBS, NPM_EXEC_VERBS, PNPM_INSTALL_VERBS, YARN_INSTALL_VERBS, BUN_INSTALL_VERBS, DLX_VERBS, NON_REGISTRY_RE, NPM_NAME_RE, EXACT_SEMVER_RE, NPM_VALUE_FLAGS, PNPM_VALUE_FLAGS, YARN_VALUE_FLAGS, BUN_VALUE_FLAGS, PIP_VALUE_FLAGS, UV_VALUE_FLAGS, POETRY_VALUE_FLAGS, PIPENV_VALUE_FLAGS, PIPX_VALUE_FLAGS, PY_SPEC_RE, PY_EXACT_RE, EXACT_VERSION_RE, GEM_NAME_RE, GEM_VALUE_FLAGS, BUNDLE_VALUE_FLAGS, CRATE_NAME_RE, CARGO_ADD_VALUE_FLAGS, CARGO_INSTALL_VALUE_FLAGS, GO_VALUE_FLAGS, GO_PATH_RE, NUGET_NAME_RE, DOTNET_ADD_VALUE_FLAGS, DOTNET_TOOL_VALUE_FLAGS, NUGET_VALUE_FLAGS, MAVEN_COORD_RE, COMPOSER_NAME_RE, COMPOSER_VALUE_FLAGS, EDITOR_HEADS, EXTENSION_ID_RE, MANAGER_HEADS, SHELLS, MAX_NESTING, SHELL_VALUE_FLAGS, TUNING_FIELDS, MAP_GOVERNED, KNOB_GOVERNED, CONFIGURABLE_CHECK_IDS, DEFAULT_EGRESS_ALLOWLIST, PRIVATE_HOST_SUFFIXES, SOURCE_COMMANDS, SINK_COMMANDS, OBFUSCATORS, SENSITIVE_PATTERNS, FLAGS_WITH_VALUES, DESTINATION_ARGS, MCP_DESTINATION_KEYS, ARGUMENT_SCAN_LIMITS, RUN_CHAR, runChar, VERDICT_RANK, SQL_DML_KEYWORDS, MAX_DESTINATIONS, MAX_SCAN_CHARS, EMAIL_RE, URL_RE, IBAN_RE, RECIPIENT_KEYS, DESTRUCTIVE_VERB_RE, PII_EMAIL_RE, PII_SSN_RE, PII_PHONE_RE, PII_CC16_RE, PII_CC15_RE, PII_CC14_RE, PII_CC13_RE, PII_CC19_RE, CARD_PATTERNS, PII_ROUTING_RE, ROUTING_LABEL_RE, ROUTING_LABEL_WINDOW, NATIONAL_ID_SHAPES, NATIONAL_ID_LABEL_RE, NATIONAL_ID_LABEL_WINDOW, NATIONAL_ID_GUARD_RE, PII_IBAN_RE, REALTIME_PII_PATTERNS, MAX_PII_SCAN_BYTES, IBAN_DESTINATION_KEYS, WHOLE_IBAN_RE, JSON_ESCAPE_RE, JSON_ESCAPES, MASKED_KINDS, ENTRY_RE, IBAN_TEXT_RE, EMAIL_TEXT_RE, ACCOUNT_KEY_RE, ACCOUNT_VALUE_RE, MAX_MASK_DEPTH, syntax4, EMPTY, CURL_SEND_FLAGS, WGET_SEND_FLAGS, IWR_SEND_FLAGS, WRITE_METHODS, GH_READ, GH_WRITE, GH_HOSTNAME_FLAGS, GH_REPO_VALUE_FLAGS, GH_API_VALUE_FLAGS, GIT_FETCH, PUBLISH, SHELLS2, OWN_HEADS, MAX_DEPTH3, CWD_CHANGERS, TERMINAL_ESCAPE_RE, LOOP_MAX_RECORDS, 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;
|
|
7436
|
+
var import_picomatch, import_safe_regex2, import_picomatch2, import_mvdan_sh, import_mvdan_sh2, import_safe_regex22, import_crypto2, import_crypto3, import_mvdan_sh3, import_crypto4, import_mvdan_sh4, import_crypto5, 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, STRICT_TIERS, METADATA_HOSTNAMES, v4Octets, TIER_REASON, 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, PROJECT_JAIL_BLOCK_READ, OVERRIDE_PREFIX, LABEL_WRAPPERS, LEGACY_READERS, INVISIBLE_RE, INVISIBLE_ONE, HOMOGLYPHS, HOMOGLYPH_RE, MAX_BLOBS, MIN_DECODED, BASE64_RUN_RE, HEX_RUN_RE, HEX_ESCAPE_RUN_RE, SYSTEM_AUTH_FILES, SYSTEM_AUTH_DIRS, PASSWORD_HASH_FILES, STARTUP_NAMES, SYSTEM_DIRS, SYSTEM_DIRS_EXEMPT, UPLOAD_SYSTEM_DIRS, AGENT_INSTRUCTION_FILES, AGENT_INSTRUCTION_DIRS, LEGACY_SYSTEM_PATH_RE, MAX_INLINE_CODE, WHAT, OUTSIDE, pyImport, either, PYTHON, NODE, PERL, RUBY, PHP, TABLES, STRING_LITERAL, 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, SQL_DB_CLIS, SQL_DDL_RE, CHMOD_OPEN_PERM_TOKENS, COMMAND_WRAPPERS, INLINE_INTERPRETER, RUNNER_WRAPPERS, _redirStdinOps, _listOps, WRAPPER_TAKES_TARGET, FIND_EXEC_FLAGS, FS_MUTATION_TOOLS, INTERP_LEADING_TARGET, MAX_PAYLOAD_NESTING, payloadNesting, MAX_INLINE_CALLS, INLINE_EXEC_FALLBACK, UNREADABLE_SOURCE, SCRIPT_RUNNERS, SCRIPT_RUNNER_VALUE_FLAGS, MAX_SCRIPT_OPERANDS, NET_BINARIES, VALUE_FLAGS, 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, stripDotSlash, 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, MAX_ALTERNATIVES, MAX_CALL_DEPTH2, MAX_CALL_WALKS2, POSITIONAL, MAX_DEPTH, MAX_PAYLOAD_DEPTH, unique, clone, SENDING_STDIN, DOWNLOAD_SHORT_VALUE, DOWNLOAD_LONG_VALUE, DOWNLOAD_OUTPUT_FLAGS, DOWNLOAD_DIR_FLAGS, base, quoteGlob, asWord, WRITES, READS, DUP_OUT, HERE_STRING, AND, OR, DEFAULT_OPS, exempt, RANK, BIP39_ENGLISH, BIP39_PUBLIC_VECTORS, indices, lengths, hash, MAX_MNEMONIC_HASHES, SECRET_VIEW_LIMITS, 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, SPANISH_LETTERS, HETU_CHARS, MAX, UNTRUSTED_TOOLS, SIGNALS, MENTION_QUOTE_RE, MENTION_WORD_RE, 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, BATCH_SEPARATOR, syntax3, NPM_INSTALL_VERBS, NPM_EXEC_VERBS, PNPM_INSTALL_VERBS, YARN_INSTALL_VERBS, BUN_INSTALL_VERBS, DLX_VERBS, NON_REGISTRY_RE, NPM_NAME_RE, EXACT_SEMVER_RE, NPM_VALUE_FLAGS, PNPM_VALUE_FLAGS, YARN_VALUE_FLAGS, BUN_VALUE_FLAGS, PIP_VALUE_FLAGS, UV_VALUE_FLAGS, POETRY_VALUE_FLAGS, PIPENV_VALUE_FLAGS, PIPX_VALUE_FLAGS, PY_SPEC_RE, PY_EXACT_RE, EXACT_VERSION_RE, GEM_NAME_RE, GEM_VALUE_FLAGS, BUNDLE_VALUE_FLAGS, CRATE_NAME_RE, CARGO_ADD_VALUE_FLAGS, CARGO_INSTALL_VALUE_FLAGS, GO_VALUE_FLAGS, GO_PATH_RE, NUGET_NAME_RE, DOTNET_ADD_VALUE_FLAGS, DOTNET_TOOL_VALUE_FLAGS, NUGET_VALUE_FLAGS, MAVEN_COORD_RE, COMPOSER_NAME_RE, COMPOSER_VALUE_FLAGS, EDITOR_HEADS, EXTENSION_ID_RE, MANAGER_HEADS, SHELLS, MAX_NESTING, SHELL_VALUE_FLAGS, TUNING_FIELDS, MAP_GOVERNED, KNOB_GOVERNED, CONFIGURABLE_CHECK_IDS, DEFAULT_EGRESS_ALLOWLIST, PRIVATE_HOST_SUFFIXES, SOURCE_COMMANDS, SINK_COMMANDS, OBFUSCATORS, SENSITIVE_PATTERNS, FLAGS_WITH_VALUES, DESTINATION_ARGS, MCP_DESTINATION_KEYS, ARGUMENT_SCAN_LIMITS, RUN_CHAR, runChar, VERDICT_RANK, SQL_DML_KEYWORDS, MAX_DESTINATIONS, MAX_SCAN_CHARS, EMAIL_RE, URL_RE, IBAN_RE, RECIPIENT_KEYS, DESTRUCTIVE_VERB_RE, PII_EMAIL_RE, PII_SSN_RE, PII_PHONE_RE, PII_CC16_RE, PII_CC15_RE, PII_CC14_RE, PII_CC13_RE, PII_CC19_RE, CARD_PATTERNS, PII_ROUTING_RE, ROUTING_LABEL_RE, ROUTING_LABEL_WINDOW, NATIONAL_ID_SHAPES, NATIONAL_ID_LABEL_RE, NATIONAL_ID_LABEL_WINDOW, NATIONAL_ID_GUARD_RE, PII_IBAN_RE, REALTIME_PII_PATTERNS, MAX_PII_SCAN_BYTES, IBAN_DESTINATION_KEYS, WHOLE_IBAN_RE, JSON_ESCAPE_RE, JSON_ESCAPES, MASKED_KINDS, ENTRY_RE, IBAN_TEXT_RE, EMAIL_TEXT_RE, ACCOUNT_KEY_RE, ACCOUNT_VALUE_RE, MAX_MASK_DEPTH, syntax4, EMPTY, CURL_SEND_FLAGS, WGET_SEND_FLAGS, IWR_SEND_FLAGS, WRITE_METHODS, GH_READ, GH_WRITE, GH_HOSTNAME_FLAGS, GH_REPO_VALUE_FLAGS, GH_API_VALUE_FLAGS, GIT_FETCH, PUBLISH, SHELLS2, OWN_HEADS, MAX_DEPTH3, CWD_CHANGERS, TERMINAL_ESCAPE_RE, LOOP_MAX_RECORDS, 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;
|
|
7380
7437
|
var init_dist = __esm({
|
|
7381
7438
|
"packages/policy-engine/dist/index.mjs"() {
|
|
7382
7439
|
"use strict";
|
|
@@ -9019,7 +9076,7 @@ var init_dist = __esm({
|
|
|
9019
9076
|
"actions.money": {
|
|
9020
9077
|
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.",
|
|
9021
9078
|
example: "refund_order on a server called acme-billing",
|
|
9022
|
-
advice: "
|
|
9079
|
+
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."
|
|
9023
9080
|
},
|
|
9024
9081
|
"actions.access": {
|
|
9025
9082
|
plain: "The agent changes a password, a key, a role or who belongs to a team, through an app node9 has no protection for.",
|
|
@@ -9196,6 +9253,54 @@ var init_dist = __esm({
|
|
|
9196
9253
|
advice: "Keep Block for known-malicious packages; brand-new packages already stop for Review."
|
|
9197
9254
|
}
|
|
9198
9255
|
};
|
|
9256
|
+
LEVELS = ["audit", "soft", "standard", "strict", "block-all"];
|
|
9257
|
+
MODE_VALUES = ["observe", ...LEVELS];
|
|
9258
|
+
SOFT = {
|
|
9259
|
+
"commands.inline-exec": "log",
|
|
9260
|
+
"commands.eval-dynamic": "log",
|
|
9261
|
+
"commands.rm": "log",
|
|
9262
|
+
"commands.chmod": "log",
|
|
9263
|
+
"commands.sudo": "log",
|
|
9264
|
+
"commands.git-destructive": "log",
|
|
9265
|
+
"commands.sql-ddl": "log",
|
|
9266
|
+
"commands.sql-no-where": "log",
|
|
9267
|
+
"commands.temp-binary": "log",
|
|
9268
|
+
"commands.disk-destroy": "log",
|
|
9269
|
+
"commands.dangerous-word": "log",
|
|
9270
|
+
"files.system-dirs": "log",
|
|
9271
|
+
"files.shell-startup": "log",
|
|
9272
|
+
"files.password-hashes": "log",
|
|
9273
|
+
"data.pipe-chain": "log",
|
|
9274
|
+
"behavior.untrusted-content": "log"
|
|
9275
|
+
};
|
|
9276
|
+
STRICT = {
|
|
9277
|
+
"commands.sql-ddl": "block",
|
|
9278
|
+
"commands.disk-destroy": "block",
|
|
9279
|
+
"commands.node9-disarm": "block",
|
|
9280
|
+
"files.system-dirs": "block",
|
|
9281
|
+
"files.shell-startup": "block",
|
|
9282
|
+
"files.password-hashes": "block",
|
|
9283
|
+
"data.secrets-weak": "block",
|
|
9284
|
+
"data.pipe-chain": "block",
|
|
9285
|
+
"network.unknown-host": "review",
|
|
9286
|
+
"network.internal-addresses": "block",
|
|
9287
|
+
"behavior.prompt-injection": "log",
|
|
9288
|
+
"loading.skill-tamper": "block",
|
|
9289
|
+
// Standard records money moves (catalog default log); Strict asks.
|
|
9290
|
+
"actions.money": "review"
|
|
9291
|
+
};
|
|
9292
|
+
BLOCK_ALL = {
|
|
9293
|
+
...STRICT,
|
|
9294
|
+
"commands.unknown": "review",
|
|
9295
|
+
"commands.temp-binary": "block"
|
|
9296
|
+
};
|
|
9297
|
+
LEVEL_CHECKS = {
|
|
9298
|
+
audit: {},
|
|
9299
|
+
soft: SOFT,
|
|
9300
|
+
standard: {},
|
|
9301
|
+
strict: STRICT,
|
|
9302
|
+
"block-all": BLOCK_ALL
|
|
9303
|
+
};
|
|
9199
9304
|
VERDICTS = ["off", "log", "review", "block"];
|
|
9200
9305
|
CHECK_VERDICT_RANK = { off: 0, log: 1, review: 2, block: 3 };
|
|
9201
9306
|
ALL = VERDICTS;
|
|
@@ -9612,7 +9717,10 @@ var init_dist = __esm({
|
|
|
9612
9717
|
title: "Money moves",
|
|
9613
9718
|
catches: "a refund, payout, transfer, charge or withdrawal through an app with no protection of its own",
|
|
9614
9719
|
values: ALL,
|
|
9615
|
-
|
|
9720
|
+
// Founder decision 2026-10-25: a transfer the user asked for is ordinary
|
|
9721
|
+
// work. Standard records it; Strict asks (levels.ts); a user who wants to
|
|
9722
|
+
// be asked states review.
|
|
9723
|
+
defaultValue: "log",
|
|
9616
9724
|
legacy: generalActionRuleNames("finance")
|
|
9617
9725
|
},
|
|
9618
9726
|
{
|
|
@@ -9652,7 +9760,7 @@ var init_dist = __esm({
|
|
|
9652
9760
|
"commands.rm": (s) => knob(s.commandChecks?.rmAdvisory),
|
|
9653
9761
|
"commands.chmod": (s) => knob(s.commandChecks?.chmod),
|
|
9654
9762
|
"commands.sql-ddl": (s) => knob(s.commandChecks?.sqlDdl),
|
|
9655
|
-
"commands.unknown": (s) => s.mode === void 0 ? void 0 : s.mode
|
|
9763
|
+
"commands.unknown": (s) => s.mode === void 0 ? void 0 : isBlockAll(s.mode) ? "review" : "off",
|
|
9656
9764
|
"data.secrets": (s) => enabledOr(s.dlp?.enabled, "block"),
|
|
9657
9765
|
"data.secrets-weak": (s) => {
|
|
9658
9766
|
if (s.dlp?.enabled === false) return "off";
|
|
@@ -15288,7 +15396,8 @@ var SmartRuleSchema = import_zod.z.object({
|
|
|
15288
15396
|
var ConfigFileSchema = import_zod.z.object({
|
|
15289
15397
|
version: import_zod.z.string().optional(),
|
|
15290
15398
|
settings: import_zod.z.object({
|
|
15291
|
-
|
|
15399
|
+
// The protection level (levels.ts in the engine); `observe` is Audit's older name.
|
|
15400
|
+
mode: import_zod.z.enum(["observe", "audit", "soft", "standard", "strict", "block-all"]).optional(),
|
|
15292
15401
|
autoStartDaemon: import_zod.z.boolean().optional(),
|
|
15293
15402
|
// enableUndo / policy.snapshot: removed with the undo feature. The
|
|
15294
15403
|
// schema strips undeclared keys silently (plain zod object — no
|
|
@@ -15663,7 +15772,7 @@ function readShieldOverrides() {
|
|
|
15663
15772
|
}
|
|
15664
15773
|
|
|
15665
15774
|
// src/config/managed.ts
|
|
15666
|
-
var MODE_ORDER = ["observe", "audit", "standard", "strict"];
|
|
15775
|
+
var MODE_ORDER = ["observe", "audit", "soft", "standard", "strict", "block-all"];
|
|
15667
15776
|
var EGRESS_MODE_ORDER = ["off", "review", "block"];
|
|
15668
15777
|
function rankIn(order, value) {
|
|
15669
15778
|
return value === void 0 ? -1 : order.indexOf(value);
|
|
@@ -15926,7 +16035,7 @@ function v2ToLegacy(raw, options = {}) {
|
|
|
15926
16035
|
continue;
|
|
15927
16036
|
}
|
|
15928
16037
|
if (id === "commands.unknown") {
|
|
15929
|
-
warnings.push(`checks.${id}: set "mode": "
|
|
16038
|
+
warnings.push(`checks.${id}: set "mode": "block-all" instead`);
|
|
15930
16039
|
continue;
|
|
15931
16040
|
}
|
|
15932
16041
|
const allowed = configurableValues(id);
|
|
@@ -16247,7 +16356,8 @@ var DEFAULT_CONFIG = {
|
|
|
16247
16356
|
// ── Actions in apps (node9Firewall#390) ───────────────────────────────
|
|
16248
16357
|
// actions.money / actions.access / actions.publish: the action templates
|
|
16249
16358
|
// on every MCP server no app shield claims, plus the shell publishing
|
|
16250
|
-
// rules. Review
|
|
16359
|
+
// rules. Review on the rule; the check value governs them (money is
|
|
16360
|
+
// recorded at Standard, asked at Strict).
|
|
16251
16361
|
...GENERAL_ACTION_RULES
|
|
16252
16362
|
],
|
|
16253
16363
|
dlp: { enabled: true, scanIgnoredTools: true, pii: "block" },
|
|
@@ -16465,6 +16575,11 @@ var KNOB_TO_CHECK = {
|
|
|
16465
16575
|
evalDynamic: "commands.eval-dynamic",
|
|
16466
16576
|
pipeChainHigh: "data.pipe-chain"
|
|
16467
16577
|
};
|
|
16578
|
+
function statedSignalFields(policy) {
|
|
16579
|
+
return Object.keys(tuningFromLegacyPolicy(policy)["loading.malicious-package"] ?? {}).filter(
|
|
16580
|
+
(k) => k === "newPackage" || k === "installScript"
|
|
16581
|
+
);
|
|
16582
|
+
}
|
|
16468
16583
|
function catalogSettingsFrom(settings, policy) {
|
|
16469
16584
|
return catalogSettingsFromConfig(settings, policy);
|
|
16470
16585
|
}
|
|
@@ -16532,6 +16647,8 @@ function getConfig(cwd) {
|
|
|
16532
16647
|
const keyed = !!pr2Creds?.apiKey && pr2Creds.localOnly !== true;
|
|
16533
16648
|
let ssrfStrictSource = "default";
|
|
16534
16649
|
const workspaceChecks = {};
|
|
16650
|
+
const managedStatedChecks = /* @__PURE__ */ new Set();
|
|
16651
|
+
const managedStatedSignals = /* @__PURE__ */ new Set();
|
|
16535
16652
|
const applyLayer = (source, isProject = false, isCloud = false) => {
|
|
16536
16653
|
if (!source) return;
|
|
16537
16654
|
const s = source.settings || {};
|
|
@@ -16739,9 +16856,11 @@ function getConfig(cwd) {
|
|
|
16739
16856
|
if (raw.managedConfig && typeof raw.managedConfig === "object") {
|
|
16740
16857
|
const mc = raw.managedConfig;
|
|
16741
16858
|
const locked = Array.isArray(mc.locked) ? mc.locked.filter((f) => typeof f === "string") : [];
|
|
16859
|
+
for (const id of knobStatedChecks(mc)) managedStatedChecks.add(id);
|
|
16860
|
+
for (const k of statedSignalFields(mc)) managedStatedSignals.add(k);
|
|
16742
16861
|
if (typeof mc.mode === "string") {
|
|
16743
16862
|
if (keyed) {
|
|
16744
|
-
if (
|
|
16863
|
+
if (isModeValue(mc.mode)) {
|
|
16745
16864
|
mergedSettings.mode = mc.mode;
|
|
16746
16865
|
}
|
|
16747
16866
|
} else {
|
|
@@ -17023,14 +17142,15 @@ function getConfig(cwd) {
|
|
|
17023
17142
|
const envMode = process.env.NODE9_MODE;
|
|
17024
17143
|
if (envMode && !modeCloudControlled && // PR-2: one listening point includes the env var — a keyed machine's
|
|
17025
17144
|
// mode comes from the workspace (or the shipped default), never the shell.
|
|
17026
|
-
!keyed &&
|
|
17145
|
+
!keyed && isModeValue(envMode)) {
|
|
17027
17146
|
mergedSettings.mode = envMode;
|
|
17028
17147
|
}
|
|
17029
|
-
if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && (mergedSettings.mode
|
|
17148
|
+
if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && isRecordOnly(mergedSettings.mode)) {
|
|
17030
17149
|
mergedSettings.mode = "standard";
|
|
17031
17150
|
}
|
|
17032
|
-
const
|
|
17033
|
-
|
|
17151
|
+
const cloudStrictLevel = levelOf(mergedSettings.mode) === "strict" || levelOf(mergedSettings.mode) === "block-all";
|
|
17152
|
+
const managedFloorActive = cloudManagedShields.length > 0 || cloudMandatesEnforcement || modeCloudControlled && cloudStrictLevel;
|
|
17153
|
+
if (modeCloudControlled && cloudStrictLevel) {
|
|
17034
17154
|
for (const name of Object.keys(mergedEnvironments)) {
|
|
17035
17155
|
if (mergedEnvironments[name]?.requireApproval === false) {
|
|
17036
17156
|
const cleaned = { ...mergedEnvironments[name] };
|
|
@@ -17048,6 +17168,35 @@ function getConfig(cwd) {
|
|
|
17048
17168
|
mergedPolicy.ignoredTools = [...new Set(mergedPolicy.ignoredTools)];
|
|
17049
17169
|
mergedPolicy.skillPinning.roots = [...new Set(mergedPolicy.skillPinning.roots)];
|
|
17050
17170
|
const resolvedSsrfStrictSource = keyed && ssrfStrictSource === "local" ? "default" : ssrfStrictSource;
|
|
17171
|
+
const level = levelOf(mergedSettings.mode);
|
|
17172
|
+
const levelKnobChecks = Object.entries(levelChecks(level)).filter(([id]) => isKnobGoverned(id));
|
|
17173
|
+
const signals = levelPackageSignals(level);
|
|
17174
|
+
if (levelKnobChecks.length > 0 || signals) {
|
|
17175
|
+
const policyOf = (layer) => layer?.policy ?? {};
|
|
17176
|
+
const trusted = /* @__PURE__ */ new Set([...managedStatedChecks, ...Object.keys(workspaceChecks)]);
|
|
17177
|
+
const trustedSignals = new Set(managedStatedSignals);
|
|
17178
|
+
const project = /* @__PURE__ */ new Set();
|
|
17179
|
+
const projectSignals = /* @__PURE__ */ new Set();
|
|
17180
|
+
if (!keyed) {
|
|
17181
|
+
for (const id of knobStatedChecks(policyOf(globalConfig))) trusted.add(id);
|
|
17182
|
+
for (const k of statedSignalFields(policyOf(globalConfig))) trustedSignals.add(k);
|
|
17183
|
+
for (const id of knobStatedChecks(policyOf(projectConfig))) project.add(id);
|
|
17184
|
+
for (const k of statedSignalFields(policyOf(projectConfig))) projectSignals.add(k);
|
|
17185
|
+
}
|
|
17186
|
+
const before = resolveCheckMap(catalogSettingsFromConfig({}, mergedPolicy));
|
|
17187
|
+
for (const [id, v] of levelKnobChecks) {
|
|
17188
|
+
if (trusted.has(id)) continue;
|
|
17189
|
+
if (project.has(id) && CHECK_VERDICT_RANK[v] <= CHECK_VERDICT_RANK[before[id] ?? "off"])
|
|
17190
|
+
continue;
|
|
17191
|
+
checkToLegacyPolicy(mergedPolicy, id, v);
|
|
17192
|
+
}
|
|
17193
|
+
if (signals) {
|
|
17194
|
+
for (const key of ["newPackage", "installScript"]) {
|
|
17195
|
+
if (trustedSignals.has(key) || projectSignals.has(key)) continue;
|
|
17196
|
+
mergedPolicy.packageCheck[key] = signals[key];
|
|
17197
|
+
}
|
|
17198
|
+
}
|
|
17199
|
+
}
|
|
17051
17200
|
const explicit = {};
|
|
17052
17201
|
const checkSources = {};
|
|
17053
17202
|
if (keyed) {
|
|
@@ -17219,6 +17368,9 @@ function applyUntrustedContent(cur, raw, replaceLists = false, isProject = false
|
|
|
17219
17368
|
// src/utils/regex.ts
|
|
17220
17369
|
init_dist();
|
|
17221
17370
|
|
|
17371
|
+
// src/policy/index.ts
|
|
17372
|
+
init_dist();
|
|
17373
|
+
|
|
17222
17374
|
// src/dlp.ts
|
|
17223
17375
|
var import_fs5 = __toESM(require("fs"));
|
|
17224
17376
|
var import_path5 = __toESM(require("path"));
|
|
@@ -20147,11 +20299,11 @@ async function checkOne(p, cfg, misses, networkCapped, cwd) {
|
|
|
20147
20299
|
}
|
|
20148
20300
|
return findings;
|
|
20149
20301
|
}
|
|
20150
|
-
var
|
|
20302
|
+
var SOFT2 = /* @__PURE__ */ new Set(["new", "install-script"]);
|
|
20151
20303
|
async function byHistory(p, version, info, findings, misses) {
|
|
20152
20304
|
let out = findings;
|
|
20153
20305
|
let h = info.history;
|
|
20154
|
-
if (!h && p.ecosystem === "PyPI" && out.some((f) =>
|
|
20306
|
+
if (!h && p.ecosystem === "PyPI" && out.some((f) => SOFT2.has(f.kind))) {
|
|
20155
20307
|
try {
|
|
20156
20308
|
h = await pypiHistory(p.name, version) ?? void 0;
|
|
20157
20309
|
} catch (err) {
|
|
@@ -20171,7 +20323,7 @@ async function byHistory(p, version, info, findings, misses) {
|
|
|
20171
20323
|
});
|
|
20172
20324
|
if (p.ecosystem === "npm") {
|
|
20173
20325
|
if (h.previousProvenance && h.provenance === false) return [...out, drop()];
|
|
20174
|
-
if (!out.some((f) =>
|
|
20326
|
+
if (!out.some((f) => SOFT2.has(f.kind)) || !h.provenance || !h.previousProvenance) return out;
|
|
20175
20327
|
const [now, before] = await Promise.all([
|
|
20176
20328
|
npmSourceRepo(p.name, version),
|
|
20177
20329
|
npmSourceRepo(p.name, previous)
|
|
@@ -20179,7 +20331,7 @@ async function byHistory(p, version, info, findings, misses) {
|
|
|
20179
20331
|
return vouched(p, version, now, before, out, misses);
|
|
20180
20332
|
}
|
|
20181
20333
|
if (p.ecosystem === "PyPI") {
|
|
20182
|
-
if (!out.some((f) =>
|
|
20334
|
+
if (!out.some((f) => SOFT2.has(f.kind)) || !info.file || !h.previousFile) return out;
|
|
20183
20335
|
const [now, before] = await Promise.all([
|
|
20184
20336
|
pypiSourceRepo(p.name, version, info.file),
|
|
20185
20337
|
pypiSourceRepo(p.name, previous, h.previousFile)
|
|
@@ -20195,7 +20347,7 @@ function vouched(p, version, now, before, findings, misses) {
|
|
|
20195
20347
|
return findings;
|
|
20196
20348
|
}
|
|
20197
20349
|
if (now === "none" || before === "none" || now !== before) return findings;
|
|
20198
|
-
return findings.filter((f) => !
|
|
20350
|
+
return findings.filter((f) => !SOFT2.has(f.kind));
|
|
20199
20351
|
}
|
|
20200
20352
|
async function runPackageCheck(toolName, args, cfg, cwd) {
|
|
20201
20353
|
if (!cfg.enabled) return ALLOW;
|
|
@@ -20515,7 +20667,7 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
|
|
|
20515
20667
|
appendHookDebug(toolName, args, meta, hashAuditArgs);
|
|
20516
20668
|
}
|
|
20517
20669
|
const isManual = meta?.agent === "Terminal";
|
|
20518
|
-
const isObserveMode = config.settings.mode
|
|
20670
|
+
const isObserveMode = isRecordOnly(config.settings.mode);
|
|
20519
20671
|
let explainableLabel = "Local Config";
|
|
20520
20672
|
let dlpReviewFlagged = false;
|
|
20521
20673
|
let packageReview = null;
|
|
@@ -20573,7 +20725,7 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
|
|
|
20573
20725
|
explainableLabel = "Shell inspection incomplete";
|
|
20574
20726
|
policyRuleDescription = "The executable command could not be inspected. Approve this call explicitly.";
|
|
20575
20727
|
}
|
|
20576
|
-
const fileReview = !isObserveMode &&
|
|
20728
|
+
const fileReview = !isObserveMode && fileFinding?.decision === "review";
|
|
20577
20729
|
const evaluateCurrentPolicy = async (skipIgnoredFastPath = false) => {
|
|
20578
20730
|
const own = await evaluatePolicy2(toolName, args, meta?.agent, options?.cwd, {
|
|
20579
20731
|
fileAccess,
|
|
@@ -20600,7 +20752,7 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
|
|
|
20600
20752
|
if (fileFinding) {
|
|
20601
20753
|
meta = { ...meta, ruleName: fileFinding.ruleName };
|
|
20602
20754
|
hashAuditArgs = true;
|
|
20603
|
-
const observing = isObserveMode
|
|
20755
|
+
const observing = isObserveMode;
|
|
20604
20756
|
const blocked = !observing && (fileFinding.decision === "block" || fileReview && config.settings.panicMode);
|
|
20605
20757
|
appendLocalAudit(
|
|
20606
20758
|
toolName,
|
|
@@ -21082,15 +21234,6 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
|
|
|
21082
21234
|
}
|
|
21083
21235
|
return { approved: true, checkedBy: "audit" };
|
|
21084
21236
|
}
|
|
21085
|
-
if (config.settings.mode === "audit") {
|
|
21086
|
-
if (judge) {
|
|
21087
|
-
const policyResult = await evaluateCurrentPolicy();
|
|
21088
|
-
if (policyResult.decision === "review") {
|
|
21089
|
-
appendLocalAudit(toolName, args, "allow", "audit-mode", ownRowMeta(true), hashAuditArgs);
|
|
21090
|
-
}
|
|
21091
|
-
}
|
|
21092
|
-
return { approved: true, checkedBy: "audit" };
|
|
21093
|
-
}
|
|
21094
21237
|
let appPermReview = null;
|
|
21095
21238
|
let appPermReviewTool = null;
|
|
21096
21239
|
const callSpecificReview = () => fileReview || shellReview || dlpReviewFlagged || !!appPermReview || !!taintWarning || !!exposureReview || !!packageReview;
|