@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/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";
|
|
@@ -9196,6 +9253,52 @@ 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
|
+
};
|
|
9290
|
+
BLOCK_ALL = {
|
|
9291
|
+
...STRICT,
|
|
9292
|
+
"commands.unknown": "review",
|
|
9293
|
+
"commands.temp-binary": "block"
|
|
9294
|
+
};
|
|
9295
|
+
LEVEL_CHECKS = {
|
|
9296
|
+
audit: {},
|
|
9297
|
+
soft: SOFT,
|
|
9298
|
+
standard: {},
|
|
9299
|
+
strict: STRICT,
|
|
9300
|
+
"block-all": BLOCK_ALL
|
|
9301
|
+
};
|
|
9199
9302
|
VERDICTS = ["off", "log", "review", "block"];
|
|
9200
9303
|
CHECK_VERDICT_RANK = { off: 0, log: 1, review: 2, block: 3 };
|
|
9201
9304
|
ALL = VERDICTS;
|
|
@@ -9652,7 +9755,7 @@ var init_dist = __esm({
|
|
|
9652
9755
|
"commands.rm": (s) => knob(s.commandChecks?.rmAdvisory),
|
|
9653
9756
|
"commands.chmod": (s) => knob(s.commandChecks?.chmod),
|
|
9654
9757
|
"commands.sql-ddl": (s) => knob(s.commandChecks?.sqlDdl),
|
|
9655
|
-
"commands.unknown": (s) => s.mode === void 0 ? void 0 : s.mode
|
|
9758
|
+
"commands.unknown": (s) => s.mode === void 0 ? void 0 : isBlockAll(s.mode) ? "review" : "off",
|
|
9656
9759
|
"data.secrets": (s) => enabledOr(s.dlp?.enabled, "block"),
|
|
9657
9760
|
"data.secrets-weak": (s) => {
|
|
9658
9761
|
if (s.dlp?.enabled === false) return "off";
|
|
@@ -15288,7 +15391,8 @@ var SmartRuleSchema = import_zod.z.object({
|
|
|
15288
15391
|
var ConfigFileSchema = import_zod.z.object({
|
|
15289
15392
|
version: import_zod.z.string().optional(),
|
|
15290
15393
|
settings: import_zod.z.object({
|
|
15291
|
-
|
|
15394
|
+
// The protection level (levels.ts in the engine); `observe` is Audit's older name.
|
|
15395
|
+
mode: import_zod.z.enum(["observe", "audit", "soft", "standard", "strict", "block-all"]).optional(),
|
|
15292
15396
|
autoStartDaemon: import_zod.z.boolean().optional(),
|
|
15293
15397
|
// enableUndo / policy.snapshot: removed with the undo feature. The
|
|
15294
15398
|
// schema strips undeclared keys silently (plain zod object — no
|
|
@@ -15663,7 +15767,7 @@ function readShieldOverrides() {
|
|
|
15663
15767
|
}
|
|
15664
15768
|
|
|
15665
15769
|
// src/config/managed.ts
|
|
15666
|
-
var MODE_ORDER = ["observe", "audit", "standard", "strict"];
|
|
15770
|
+
var MODE_ORDER = ["observe", "audit", "soft", "standard", "strict", "block-all"];
|
|
15667
15771
|
var EGRESS_MODE_ORDER = ["off", "review", "block"];
|
|
15668
15772
|
function rankIn(order, value) {
|
|
15669
15773
|
return value === void 0 ? -1 : order.indexOf(value);
|
|
@@ -15926,7 +16030,7 @@ function v2ToLegacy(raw, options = {}) {
|
|
|
15926
16030
|
continue;
|
|
15927
16031
|
}
|
|
15928
16032
|
if (id === "commands.unknown") {
|
|
15929
|
-
warnings.push(`checks.${id}: set "mode": "
|
|
16033
|
+
warnings.push(`checks.${id}: set "mode": "block-all" instead`);
|
|
15930
16034
|
continue;
|
|
15931
16035
|
}
|
|
15932
16036
|
const allowed = configurableValues(id);
|
|
@@ -16465,6 +16569,11 @@ var KNOB_TO_CHECK = {
|
|
|
16465
16569
|
evalDynamic: "commands.eval-dynamic",
|
|
16466
16570
|
pipeChainHigh: "data.pipe-chain"
|
|
16467
16571
|
};
|
|
16572
|
+
function statedSignalFields(policy) {
|
|
16573
|
+
return Object.keys(tuningFromLegacyPolicy(policy)["loading.malicious-package"] ?? {}).filter(
|
|
16574
|
+
(k) => k === "newPackage" || k === "installScript"
|
|
16575
|
+
);
|
|
16576
|
+
}
|
|
16468
16577
|
function catalogSettingsFrom(settings, policy) {
|
|
16469
16578
|
return catalogSettingsFromConfig(settings, policy);
|
|
16470
16579
|
}
|
|
@@ -16532,6 +16641,8 @@ function getConfig(cwd) {
|
|
|
16532
16641
|
const keyed = !!pr2Creds?.apiKey && pr2Creds.localOnly !== true;
|
|
16533
16642
|
let ssrfStrictSource = "default";
|
|
16534
16643
|
const workspaceChecks = {};
|
|
16644
|
+
const managedStatedChecks = /* @__PURE__ */ new Set();
|
|
16645
|
+
const managedStatedSignals = /* @__PURE__ */ new Set();
|
|
16535
16646
|
const applyLayer = (source, isProject = false, isCloud = false) => {
|
|
16536
16647
|
if (!source) return;
|
|
16537
16648
|
const s = source.settings || {};
|
|
@@ -16739,9 +16850,11 @@ function getConfig(cwd) {
|
|
|
16739
16850
|
if (raw.managedConfig && typeof raw.managedConfig === "object") {
|
|
16740
16851
|
const mc = raw.managedConfig;
|
|
16741
16852
|
const locked = Array.isArray(mc.locked) ? mc.locked.filter((f) => typeof f === "string") : [];
|
|
16853
|
+
for (const id of knobStatedChecks(mc)) managedStatedChecks.add(id);
|
|
16854
|
+
for (const k of statedSignalFields(mc)) managedStatedSignals.add(k);
|
|
16742
16855
|
if (typeof mc.mode === "string") {
|
|
16743
16856
|
if (keyed) {
|
|
16744
|
-
if (
|
|
16857
|
+
if (isModeValue(mc.mode)) {
|
|
16745
16858
|
mergedSettings.mode = mc.mode;
|
|
16746
16859
|
}
|
|
16747
16860
|
} else {
|
|
@@ -17023,14 +17136,15 @@ function getConfig(cwd) {
|
|
|
17023
17136
|
const envMode = process.env.NODE9_MODE;
|
|
17024
17137
|
if (envMode && !modeCloudControlled && // PR-2: one listening point includes the env var — a keyed machine's
|
|
17025
17138
|
// mode comes from the workspace (or the shipped default), never the shell.
|
|
17026
|
-
!keyed &&
|
|
17139
|
+
!keyed && isModeValue(envMode)) {
|
|
17027
17140
|
mergedSettings.mode = envMode;
|
|
17028
17141
|
}
|
|
17029
|
-
if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && (mergedSettings.mode
|
|
17142
|
+
if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && isRecordOnly(mergedSettings.mode)) {
|
|
17030
17143
|
mergedSettings.mode = "standard";
|
|
17031
17144
|
}
|
|
17032
|
-
const
|
|
17033
|
-
|
|
17145
|
+
const cloudStrictLevel = levelOf(mergedSettings.mode) === "strict" || levelOf(mergedSettings.mode) === "block-all";
|
|
17146
|
+
const managedFloorActive = cloudManagedShields.length > 0 || cloudMandatesEnforcement || modeCloudControlled && cloudStrictLevel;
|
|
17147
|
+
if (modeCloudControlled && cloudStrictLevel) {
|
|
17034
17148
|
for (const name of Object.keys(mergedEnvironments)) {
|
|
17035
17149
|
if (mergedEnvironments[name]?.requireApproval === false) {
|
|
17036
17150
|
const cleaned = { ...mergedEnvironments[name] };
|
|
@@ -17048,6 +17162,35 @@ function getConfig(cwd) {
|
|
|
17048
17162
|
mergedPolicy.ignoredTools = [...new Set(mergedPolicy.ignoredTools)];
|
|
17049
17163
|
mergedPolicy.skillPinning.roots = [...new Set(mergedPolicy.skillPinning.roots)];
|
|
17050
17164
|
const resolvedSsrfStrictSource = keyed && ssrfStrictSource === "local" ? "default" : ssrfStrictSource;
|
|
17165
|
+
const level = levelOf(mergedSettings.mode);
|
|
17166
|
+
const levelKnobChecks = Object.entries(levelChecks(level)).filter(([id]) => isKnobGoverned(id));
|
|
17167
|
+
const signals = levelPackageSignals(level);
|
|
17168
|
+
if (levelKnobChecks.length > 0 || signals) {
|
|
17169
|
+
const policyOf = (layer) => layer?.policy ?? {};
|
|
17170
|
+
const trusted = /* @__PURE__ */ new Set([...managedStatedChecks, ...Object.keys(workspaceChecks)]);
|
|
17171
|
+
const trustedSignals = new Set(managedStatedSignals);
|
|
17172
|
+
const project = /* @__PURE__ */ new Set();
|
|
17173
|
+
const projectSignals = /* @__PURE__ */ new Set();
|
|
17174
|
+
if (!keyed) {
|
|
17175
|
+
for (const id of knobStatedChecks(policyOf(globalConfig))) trusted.add(id);
|
|
17176
|
+
for (const k of statedSignalFields(policyOf(globalConfig))) trustedSignals.add(k);
|
|
17177
|
+
for (const id of knobStatedChecks(policyOf(projectConfig))) project.add(id);
|
|
17178
|
+
for (const k of statedSignalFields(policyOf(projectConfig))) projectSignals.add(k);
|
|
17179
|
+
}
|
|
17180
|
+
const before = resolveCheckMap(catalogSettingsFromConfig({}, mergedPolicy));
|
|
17181
|
+
for (const [id, v] of levelKnobChecks) {
|
|
17182
|
+
if (trusted.has(id)) continue;
|
|
17183
|
+
if (project.has(id) && CHECK_VERDICT_RANK[v] <= CHECK_VERDICT_RANK[before[id] ?? "off"])
|
|
17184
|
+
continue;
|
|
17185
|
+
checkToLegacyPolicy(mergedPolicy, id, v);
|
|
17186
|
+
}
|
|
17187
|
+
if (signals) {
|
|
17188
|
+
for (const key of ["newPackage", "installScript"]) {
|
|
17189
|
+
if (trustedSignals.has(key) || projectSignals.has(key)) continue;
|
|
17190
|
+
mergedPolicy.packageCheck[key] = signals[key];
|
|
17191
|
+
}
|
|
17192
|
+
}
|
|
17193
|
+
}
|
|
17051
17194
|
const explicit = {};
|
|
17052
17195
|
const checkSources = {};
|
|
17053
17196
|
if (keyed) {
|
|
@@ -17219,6 +17362,9 @@ function applyUntrustedContent(cur, raw, replaceLists = false, isProject = false
|
|
|
17219
17362
|
// src/utils/regex.ts
|
|
17220
17363
|
init_dist();
|
|
17221
17364
|
|
|
17365
|
+
// src/policy/index.ts
|
|
17366
|
+
init_dist();
|
|
17367
|
+
|
|
17222
17368
|
// src/dlp.ts
|
|
17223
17369
|
var import_fs5 = __toESM(require("fs"));
|
|
17224
17370
|
var import_path5 = __toESM(require("path"));
|
|
@@ -20147,11 +20293,11 @@ async function checkOne(p, cfg, misses, networkCapped, cwd) {
|
|
|
20147
20293
|
}
|
|
20148
20294
|
return findings;
|
|
20149
20295
|
}
|
|
20150
|
-
var
|
|
20296
|
+
var SOFT2 = /* @__PURE__ */ new Set(["new", "install-script"]);
|
|
20151
20297
|
async function byHistory(p, version, info, findings, misses) {
|
|
20152
20298
|
let out = findings;
|
|
20153
20299
|
let h = info.history;
|
|
20154
|
-
if (!h && p.ecosystem === "PyPI" && out.some((f) =>
|
|
20300
|
+
if (!h && p.ecosystem === "PyPI" && out.some((f) => SOFT2.has(f.kind))) {
|
|
20155
20301
|
try {
|
|
20156
20302
|
h = await pypiHistory(p.name, version) ?? void 0;
|
|
20157
20303
|
} catch (err) {
|
|
@@ -20171,7 +20317,7 @@ async function byHistory(p, version, info, findings, misses) {
|
|
|
20171
20317
|
});
|
|
20172
20318
|
if (p.ecosystem === "npm") {
|
|
20173
20319
|
if (h.previousProvenance && h.provenance === false) return [...out, drop()];
|
|
20174
|
-
if (!out.some((f) =>
|
|
20320
|
+
if (!out.some((f) => SOFT2.has(f.kind)) || !h.provenance || !h.previousProvenance) return out;
|
|
20175
20321
|
const [now, before] = await Promise.all([
|
|
20176
20322
|
npmSourceRepo(p.name, version),
|
|
20177
20323
|
npmSourceRepo(p.name, previous)
|
|
@@ -20179,7 +20325,7 @@ async function byHistory(p, version, info, findings, misses) {
|
|
|
20179
20325
|
return vouched(p, version, now, before, out, misses);
|
|
20180
20326
|
}
|
|
20181
20327
|
if (p.ecosystem === "PyPI") {
|
|
20182
|
-
if (!out.some((f) =>
|
|
20328
|
+
if (!out.some((f) => SOFT2.has(f.kind)) || !info.file || !h.previousFile) return out;
|
|
20183
20329
|
const [now, before] = await Promise.all([
|
|
20184
20330
|
pypiSourceRepo(p.name, version, info.file),
|
|
20185
20331
|
pypiSourceRepo(p.name, previous, h.previousFile)
|
|
@@ -20195,7 +20341,7 @@ function vouched(p, version, now, before, findings, misses) {
|
|
|
20195
20341
|
return findings;
|
|
20196
20342
|
}
|
|
20197
20343
|
if (now === "none" || before === "none" || now !== before) return findings;
|
|
20198
|
-
return findings.filter((f) => !
|
|
20344
|
+
return findings.filter((f) => !SOFT2.has(f.kind));
|
|
20199
20345
|
}
|
|
20200
20346
|
async function runPackageCheck(toolName, args, cfg, cwd) {
|
|
20201
20347
|
if (!cfg.enabled) return ALLOW;
|
|
@@ -20515,7 +20661,7 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
|
|
|
20515
20661
|
appendHookDebug(toolName, args, meta, hashAuditArgs);
|
|
20516
20662
|
}
|
|
20517
20663
|
const isManual = meta?.agent === "Terminal";
|
|
20518
|
-
const isObserveMode = config.settings.mode
|
|
20664
|
+
const isObserveMode = isRecordOnly(config.settings.mode);
|
|
20519
20665
|
let explainableLabel = "Local Config";
|
|
20520
20666
|
let dlpReviewFlagged = false;
|
|
20521
20667
|
let packageReview = null;
|
|
@@ -20573,7 +20719,7 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
|
|
|
20573
20719
|
explainableLabel = "Shell inspection incomplete";
|
|
20574
20720
|
policyRuleDescription = "The executable command could not be inspected. Approve this call explicitly.";
|
|
20575
20721
|
}
|
|
20576
|
-
const fileReview = !isObserveMode &&
|
|
20722
|
+
const fileReview = !isObserveMode && fileFinding?.decision === "review";
|
|
20577
20723
|
const evaluateCurrentPolicy = async (skipIgnoredFastPath = false) => {
|
|
20578
20724
|
const own = await evaluatePolicy2(toolName, args, meta?.agent, options?.cwd, {
|
|
20579
20725
|
fileAccess,
|
|
@@ -20600,7 +20746,7 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
|
|
|
20600
20746
|
if (fileFinding) {
|
|
20601
20747
|
meta = { ...meta, ruleName: fileFinding.ruleName };
|
|
20602
20748
|
hashAuditArgs = true;
|
|
20603
|
-
const observing = isObserveMode
|
|
20749
|
+
const observing = isObserveMode;
|
|
20604
20750
|
const blocked = !observing && (fileFinding.decision === "block" || fileReview && config.settings.panicMode);
|
|
20605
20751
|
appendLocalAudit(
|
|
20606
20752
|
toolName,
|
|
@@ -21082,15 +21228,6 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
|
|
|
21082
21228
|
}
|
|
21083
21229
|
return { approved: true, checkedBy: "audit" };
|
|
21084
21230
|
}
|
|
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
21231
|
let appPermReview = null;
|
|
21095
21232
|
let appPermReviewTool = null;
|
|
21096
21233
|
const callSpecificReview = () => fileReview || shellReview || dlpReviewFlagged || !!appPermReview || !!taintWarning || !!exposureReview || !!packageReview;
|