@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.mjs
CHANGED
|
@@ -438,6 +438,32 @@ function ssrfFloorDecision(m, asWritten, opts) {
|
|
|
438
438
|
}
|
|
439
439
|
return "block";
|
|
440
440
|
}
|
|
441
|
+
function isModeValue(v) {
|
|
442
|
+
return typeof v === "string" && MODE_VALUES.includes(v);
|
|
443
|
+
}
|
|
444
|
+
function levelOf(mode) {
|
|
445
|
+
if (mode === "observe") return "audit";
|
|
446
|
+
return LEVELS.includes(mode ?? "") ? mode : "standard";
|
|
447
|
+
}
|
|
448
|
+
function isRecordOnly(mode) {
|
|
449
|
+
return levelOf(mode) === "audit";
|
|
450
|
+
}
|
|
451
|
+
function reviewsEveryInline(mode) {
|
|
452
|
+
const level = levelOf(mode);
|
|
453
|
+
return level === "strict" || level === "block-all";
|
|
454
|
+
}
|
|
455
|
+
function isBlockAll(mode) {
|
|
456
|
+
return levelOf(mode) === "block-all";
|
|
457
|
+
}
|
|
458
|
+
function levelCheckValue(mode, id) {
|
|
459
|
+
return LEVEL_CHECKS[levelOf(mode)][id];
|
|
460
|
+
}
|
|
461
|
+
function levelChecks(mode) {
|
|
462
|
+
return LEVEL_CHECKS[levelOf(mode)];
|
|
463
|
+
}
|
|
464
|
+
function levelPackageSignals(mode) {
|
|
465
|
+
return levelOf(mode) === "soft" ? { newPackage: "off", installScript: "off" } : void 0;
|
|
466
|
+
}
|
|
441
467
|
function isVerdict(v) {
|
|
442
468
|
return v === "off" || v === "log" || v === "review" || v === "block";
|
|
443
469
|
}
|
|
@@ -583,19 +609,21 @@ function resolveCheck(settings, id) {
|
|
|
583
609
|
if (!def) return void 0;
|
|
584
610
|
if (isLockedCheck(def)) return { id, value: "block", source: "locked" };
|
|
585
611
|
const floor = def.floor ? CHECK_VERDICT_RANK[def.floor] : 0;
|
|
612
|
+
const levelDefault = levelCheckValue(settings.mode, id) ?? def.defaultValue;
|
|
613
|
+
const sourceOf = (value2) => value2 === levelDefault ? "default" : "configured";
|
|
586
614
|
const explicit = settings.checks?.[id];
|
|
587
615
|
if (isVerdict(explicit)) {
|
|
588
616
|
const value2 = CHECK_VERDICT_RANK[explicit] < floor ? def.floor : explicit;
|
|
589
|
-
return { id, value: value2, source: value2
|
|
617
|
+
return { id, value: value2, source: sourceOf(value2) };
|
|
590
618
|
}
|
|
591
619
|
if (def.pack) {
|
|
592
620
|
const on = settings.appliedShields?.includes(def.pack) ?? false;
|
|
593
621
|
return { id, value: on ? def.defaultValue : "off", source: "default" };
|
|
594
622
|
}
|
|
595
623
|
const read2 = LEGACY_READERS[id]?.(settings);
|
|
596
|
-
if (read2 === void 0) return { id, value:
|
|
624
|
+
if (read2 === void 0) return { id, value: levelDefault, source: "default" };
|
|
597
625
|
const value = CHECK_VERDICT_RANK[read2] < floor ? def.floor : read2;
|
|
598
|
-
return { id, value, source: value
|
|
626
|
+
return { id, value, source: sourceOf(value) };
|
|
599
627
|
}
|
|
600
628
|
function checkValue(settings, id) {
|
|
601
629
|
return resolveCheck(settings, id)?.value ?? "off";
|
|
@@ -5345,6 +5373,20 @@ function extractPackageInstalls(command) {
|
|
|
5345
5373
|
return true;
|
|
5346
5374
|
});
|
|
5347
5375
|
}
|
|
5376
|
+
function tuningFromLegacyPolicy(policy) {
|
|
5377
|
+
const out = {};
|
|
5378
|
+
const p = policy;
|
|
5379
|
+
if (policy.packageCheck?.registrySignals === false) {
|
|
5380
|
+
out["loading.malicious-package"] = { newPackage: "off", installScript: "off" };
|
|
5381
|
+
}
|
|
5382
|
+
for (const f of TUNING_FIELDS) {
|
|
5383
|
+
const [block, key] = f.legacy;
|
|
5384
|
+
const value = p[block]?.[key];
|
|
5385
|
+
if (value === void 0) continue;
|
|
5386
|
+
(out[f.checkId] ??= {})[f.name] = value;
|
|
5387
|
+
}
|
|
5388
|
+
return out;
|
|
5389
|
+
}
|
|
5348
5390
|
function tuningToLegacyPolicy(policy, tuning) {
|
|
5349
5391
|
const unknown = [];
|
|
5350
5392
|
for (const [id, fields] of Object.entries(tuning)) {
|
|
@@ -5459,6 +5501,25 @@ function checkToLegacyPolicy(policy, id, v) {
|
|
|
5459
5501
|
return false;
|
|
5460
5502
|
}
|
|
5461
5503
|
}
|
|
5504
|
+
function knobStatedChecks(policy) {
|
|
5505
|
+
const out = /* @__PURE__ */ new Set();
|
|
5506
|
+
const has = (o, key) => !!o && typeof o === "object" && o[key] !== void 0;
|
|
5507
|
+
const { dlp, egress, loopDetection, injectionScan, skillPinning, packageCheck } = policy;
|
|
5508
|
+
const uc = policy.untrustedContent;
|
|
5509
|
+
if (has(dlp, "enabled")) out.add("data.secrets");
|
|
5510
|
+
if (has(dlp, "reviewAction") || dlp?.enabled === false) out.add("data.secrets-weak");
|
|
5511
|
+
if (has(dlp, "pii")) out.add("data.pii");
|
|
5512
|
+
if (has(egress, "enabled") || has(egress, "mode")) out.add("network.unknown-host");
|
|
5513
|
+
if (has(egress, "ssrfStrict")) out.add("network.internal-addresses");
|
|
5514
|
+
if (has(loopDetection, "enabled")) out.add("behavior.loops");
|
|
5515
|
+
if (has(injectionScan, "enabled")) out.add("behavior.prompt-injection");
|
|
5516
|
+
if (has(skillPinning, "enabled") || has(skillPinning, "mode")) out.add("loading.skill-tamper");
|
|
5517
|
+
if (has(packageCheck, "enabled") || has(packageCheck, "onMalicious"))
|
|
5518
|
+
out.add("loading.malicious-package");
|
|
5519
|
+
if (uc && typeof uc === "object" && (uc.enabled === false || has(uc, "afterExposure")))
|
|
5520
|
+
out.add("behavior.untrusted-content");
|
|
5521
|
+
return out;
|
|
5522
|
+
}
|
|
5462
5523
|
function isKnobGoverned(id) {
|
|
5463
5524
|
return id in KNOB_GOVERNED;
|
|
5464
5525
|
}
|
|
@@ -6269,7 +6330,7 @@ async function evaluatePolicyCore(config, toolName, args, context = {}, hooks =
|
|
|
6269
6330
|
if (v?.logged) noteLogged(v);
|
|
6270
6331
|
else if (v) candidates.push(v);
|
|
6271
6332
|
};
|
|
6272
|
-
const inline = config.settings.mode
|
|
6333
|
+
const inline = reviewsEveryInline(config.settings.mode) ? detectInlineExec(shellCommand) ? void 0 : null : inlineExecReview(shellCommand);
|
|
6273
6334
|
if (inline !== null) {
|
|
6274
6335
|
consider("commands.inline-exec", {
|
|
6275
6336
|
decision: "review",
|
|
@@ -6329,21 +6390,17 @@ async function evaluatePolicyCore(config, toolName, args, context = {}, hooks =
|
|
|
6329
6390
|
if (firstToken && firstToken.startsWith("/") && checkProvenance2) {
|
|
6330
6391
|
const prov = checkProvenance2(firstToken, cwd);
|
|
6331
6392
|
if (prov.trustLevel === "suspect") {
|
|
6332
|
-
const
|
|
6333
|
-
|
|
6334
|
-
|
|
6335
|
-
{
|
|
6336
|
-
|
|
6337
|
-
|
|
6338
|
-
|
|
6339
|
-
tier: 3,
|
|
6340
|
-
checkId: "commands.temp-binary"
|
|
6341
|
-
}
|
|
6342
|
-
);
|
|
6393
|
+
const v = applyCheckValue(cv("commands.temp-binary"), {
|
|
6394
|
+
decision: "review",
|
|
6395
|
+
blockedByLabel: "Node9: Suspect Binary",
|
|
6396
|
+
reason: `Binary "${firstToken}" resolved to ${prov.resolvedPath} \u2014 ${prov.reason}`,
|
|
6397
|
+
tier: 3,
|
|
6398
|
+
checkId: "commands.temp-binary"
|
|
6399
|
+
});
|
|
6343
6400
|
if (v?.logged) noteLogged(v);
|
|
6344
6401
|
else if (v) return v;
|
|
6345
6402
|
}
|
|
6346
|
-
if (prov.trustLevel === "unknown" && config.settings.mode
|
|
6403
|
+
if (prov.trustLevel === "unknown" && isBlockAll(config.settings.mode)) {
|
|
6347
6404
|
return {
|
|
6348
6405
|
decision: "review",
|
|
6349
6406
|
blockedByLabel: "Node9: Unknown Binary (strict mode)",
|
|
@@ -6434,7 +6491,7 @@ async function evaluatePolicyCore(config, toolName, args, context = {}, hooks =
|
|
|
6434
6491
|
if (v?.logged) noteLogged(v);
|
|
6435
6492
|
else if (v) return v;
|
|
6436
6493
|
}
|
|
6437
|
-
if (config.settings.mode
|
|
6494
|
+
if (isBlockAll(config.settings.mode)) {
|
|
6438
6495
|
if (activeEnvironment?.requireApproval === false) return allowed();
|
|
6439
6496
|
return {
|
|
6440
6497
|
decision: "review",
|
|
@@ -7365,7 +7422,7 @@ function matchCanaryArgs(args, values) {
|
|
|
7365
7422
|
return null;
|
|
7366
7423
|
}
|
|
7367
7424
|
}
|
|
7368
|
-
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, 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;
|
|
7425
|
+
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, 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;
|
|
7369
7426
|
var init_dist = __esm({
|
|
7370
7427
|
"packages/policy-engine/dist/index.mjs"() {
|
|
7371
7428
|
"use strict";
|
|
@@ -9173,6 +9230,52 @@ var init_dist = __esm({
|
|
|
9173
9230
|
advice: "Keep Block for known-malicious packages; brand-new packages already stop for Review."
|
|
9174
9231
|
}
|
|
9175
9232
|
};
|
|
9233
|
+
LEVELS = ["audit", "soft", "standard", "strict", "block-all"];
|
|
9234
|
+
MODE_VALUES = ["observe", ...LEVELS];
|
|
9235
|
+
SOFT = {
|
|
9236
|
+
"commands.inline-exec": "log",
|
|
9237
|
+
"commands.eval-dynamic": "log",
|
|
9238
|
+
"commands.rm": "log",
|
|
9239
|
+
"commands.chmod": "log",
|
|
9240
|
+
"commands.sudo": "log",
|
|
9241
|
+
"commands.git-destructive": "log",
|
|
9242
|
+
"commands.sql-ddl": "log",
|
|
9243
|
+
"commands.sql-no-where": "log",
|
|
9244
|
+
"commands.temp-binary": "log",
|
|
9245
|
+
"commands.disk-destroy": "log",
|
|
9246
|
+
"commands.dangerous-word": "log",
|
|
9247
|
+
"files.system-dirs": "log",
|
|
9248
|
+
"files.shell-startup": "log",
|
|
9249
|
+
"files.password-hashes": "log",
|
|
9250
|
+
"data.pipe-chain": "log",
|
|
9251
|
+
"behavior.untrusted-content": "log"
|
|
9252
|
+
};
|
|
9253
|
+
STRICT = {
|
|
9254
|
+
"commands.sql-ddl": "block",
|
|
9255
|
+
"commands.disk-destroy": "block",
|
|
9256
|
+
"commands.node9-disarm": "block",
|
|
9257
|
+
"files.system-dirs": "block",
|
|
9258
|
+
"files.shell-startup": "block",
|
|
9259
|
+
"files.password-hashes": "block",
|
|
9260
|
+
"data.secrets-weak": "block",
|
|
9261
|
+
"data.pipe-chain": "block",
|
|
9262
|
+
"network.unknown-host": "review",
|
|
9263
|
+
"network.internal-addresses": "block",
|
|
9264
|
+
"behavior.prompt-injection": "log",
|
|
9265
|
+
"loading.skill-tamper": "block"
|
|
9266
|
+
};
|
|
9267
|
+
BLOCK_ALL = {
|
|
9268
|
+
...STRICT,
|
|
9269
|
+
"commands.unknown": "review",
|
|
9270
|
+
"commands.temp-binary": "block"
|
|
9271
|
+
};
|
|
9272
|
+
LEVEL_CHECKS = {
|
|
9273
|
+
audit: {},
|
|
9274
|
+
soft: SOFT,
|
|
9275
|
+
standard: {},
|
|
9276
|
+
strict: STRICT,
|
|
9277
|
+
"block-all": BLOCK_ALL
|
|
9278
|
+
};
|
|
9176
9279
|
VERDICTS = ["off", "log", "review", "block"];
|
|
9177
9280
|
CHECK_VERDICT_RANK = { off: 0, log: 1, review: 2, block: 3 };
|
|
9178
9281
|
ALL = VERDICTS;
|
|
@@ -9629,7 +9732,7 @@ var init_dist = __esm({
|
|
|
9629
9732
|
"commands.rm": (s) => knob(s.commandChecks?.rmAdvisory),
|
|
9630
9733
|
"commands.chmod": (s) => knob(s.commandChecks?.chmod),
|
|
9631
9734
|
"commands.sql-ddl": (s) => knob(s.commandChecks?.sqlDdl),
|
|
9632
|
-
"commands.unknown": (s) => s.mode === void 0 ? void 0 : s.mode
|
|
9735
|
+
"commands.unknown": (s) => s.mode === void 0 ? void 0 : isBlockAll(s.mode) ? "review" : "off",
|
|
9633
9736
|
"data.secrets": (s) => enabledOr(s.dlp?.enabled, "block"),
|
|
9634
9737
|
"data.secrets-weak": (s) => {
|
|
9635
9738
|
if (s.dlp?.enabled === false) return "off";
|
|
@@ -15258,7 +15361,8 @@ var SmartRuleSchema = z.object({
|
|
|
15258
15361
|
var ConfigFileSchema = z.object({
|
|
15259
15362
|
version: z.string().optional(),
|
|
15260
15363
|
settings: z.object({
|
|
15261
|
-
|
|
15364
|
+
// The protection level (levels.ts in the engine); `observe` is Audit's older name.
|
|
15365
|
+
mode: z.enum(["observe", "audit", "soft", "standard", "strict", "block-all"]).optional(),
|
|
15262
15366
|
autoStartDaemon: z.boolean().optional(),
|
|
15263
15367
|
// enableUndo / policy.snapshot: removed with the undo feature. The
|
|
15264
15368
|
// schema strips undeclared keys silently (plain zod object — no
|
|
@@ -15633,7 +15737,7 @@ function readShieldOverrides() {
|
|
|
15633
15737
|
}
|
|
15634
15738
|
|
|
15635
15739
|
// src/config/managed.ts
|
|
15636
|
-
var MODE_ORDER = ["observe", "audit", "standard", "strict"];
|
|
15740
|
+
var MODE_ORDER = ["observe", "audit", "soft", "standard", "strict", "block-all"];
|
|
15637
15741
|
var EGRESS_MODE_ORDER = ["off", "review", "block"];
|
|
15638
15742
|
function rankIn(order, value) {
|
|
15639
15743
|
return value === void 0 ? -1 : order.indexOf(value);
|
|
@@ -15896,7 +16000,7 @@ function v2ToLegacy(raw, options = {}) {
|
|
|
15896
16000
|
continue;
|
|
15897
16001
|
}
|
|
15898
16002
|
if (id === "commands.unknown") {
|
|
15899
|
-
warnings.push(`checks.${id}: set "mode": "
|
|
16003
|
+
warnings.push(`checks.${id}: set "mode": "block-all" instead`);
|
|
15900
16004
|
continue;
|
|
15901
16005
|
}
|
|
15902
16006
|
const allowed = configurableValues(id);
|
|
@@ -16435,6 +16539,11 @@ var KNOB_TO_CHECK = {
|
|
|
16435
16539
|
evalDynamic: "commands.eval-dynamic",
|
|
16436
16540
|
pipeChainHigh: "data.pipe-chain"
|
|
16437
16541
|
};
|
|
16542
|
+
function statedSignalFields(policy) {
|
|
16543
|
+
return Object.keys(tuningFromLegacyPolicy(policy)["loading.malicious-package"] ?? {}).filter(
|
|
16544
|
+
(k) => k === "newPackage" || k === "installScript"
|
|
16545
|
+
);
|
|
16546
|
+
}
|
|
16438
16547
|
function catalogSettingsFrom(settings, policy) {
|
|
16439
16548
|
return catalogSettingsFromConfig(settings, policy);
|
|
16440
16549
|
}
|
|
@@ -16502,6 +16611,8 @@ function getConfig(cwd) {
|
|
|
16502
16611
|
const keyed = !!pr2Creds?.apiKey && pr2Creds.localOnly !== true;
|
|
16503
16612
|
let ssrfStrictSource = "default";
|
|
16504
16613
|
const workspaceChecks = {};
|
|
16614
|
+
const managedStatedChecks = /* @__PURE__ */ new Set();
|
|
16615
|
+
const managedStatedSignals = /* @__PURE__ */ new Set();
|
|
16505
16616
|
const applyLayer = (source, isProject = false, isCloud = false) => {
|
|
16506
16617
|
if (!source) return;
|
|
16507
16618
|
const s = source.settings || {};
|
|
@@ -16709,9 +16820,11 @@ function getConfig(cwd) {
|
|
|
16709
16820
|
if (raw.managedConfig && typeof raw.managedConfig === "object") {
|
|
16710
16821
|
const mc = raw.managedConfig;
|
|
16711
16822
|
const locked = Array.isArray(mc.locked) ? mc.locked.filter((f) => typeof f === "string") : [];
|
|
16823
|
+
for (const id of knobStatedChecks(mc)) managedStatedChecks.add(id);
|
|
16824
|
+
for (const k of statedSignalFields(mc)) managedStatedSignals.add(k);
|
|
16712
16825
|
if (typeof mc.mode === "string") {
|
|
16713
16826
|
if (keyed) {
|
|
16714
|
-
if (
|
|
16827
|
+
if (isModeValue(mc.mode)) {
|
|
16715
16828
|
mergedSettings.mode = mc.mode;
|
|
16716
16829
|
}
|
|
16717
16830
|
} else {
|
|
@@ -16993,14 +17106,15 @@ function getConfig(cwd) {
|
|
|
16993
17106
|
const envMode = process.env.NODE9_MODE;
|
|
16994
17107
|
if (envMode && !modeCloudControlled && // PR-2: one listening point includes the env var — a keyed machine's
|
|
16995
17108
|
// mode comes from the workspace (or the shipped default), never the shell.
|
|
16996
|
-
!keyed &&
|
|
17109
|
+
!keyed && isModeValue(envMode)) {
|
|
16997
17110
|
mergedSettings.mode = envMode;
|
|
16998
17111
|
}
|
|
16999
|
-
if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && (mergedSettings.mode
|
|
17112
|
+
if ((cloudManagedShields.length > 0 || cloudMandatesEnforcement) && !modeCloudControlled && !modeCloudStaged && isRecordOnly(mergedSettings.mode)) {
|
|
17000
17113
|
mergedSettings.mode = "standard";
|
|
17001
17114
|
}
|
|
17002
|
-
const
|
|
17003
|
-
|
|
17115
|
+
const cloudStrictLevel = levelOf(mergedSettings.mode) === "strict" || levelOf(mergedSettings.mode) === "block-all";
|
|
17116
|
+
const managedFloorActive = cloudManagedShields.length > 0 || cloudMandatesEnforcement || modeCloudControlled && cloudStrictLevel;
|
|
17117
|
+
if (modeCloudControlled && cloudStrictLevel) {
|
|
17004
17118
|
for (const name of Object.keys(mergedEnvironments)) {
|
|
17005
17119
|
if (mergedEnvironments[name]?.requireApproval === false) {
|
|
17006
17120
|
const cleaned = { ...mergedEnvironments[name] };
|
|
@@ -17018,6 +17132,35 @@ function getConfig(cwd) {
|
|
|
17018
17132
|
mergedPolicy.ignoredTools = [...new Set(mergedPolicy.ignoredTools)];
|
|
17019
17133
|
mergedPolicy.skillPinning.roots = [...new Set(mergedPolicy.skillPinning.roots)];
|
|
17020
17134
|
const resolvedSsrfStrictSource = keyed && ssrfStrictSource === "local" ? "default" : ssrfStrictSource;
|
|
17135
|
+
const level = levelOf(mergedSettings.mode);
|
|
17136
|
+
const levelKnobChecks = Object.entries(levelChecks(level)).filter(([id]) => isKnobGoverned(id));
|
|
17137
|
+
const signals = levelPackageSignals(level);
|
|
17138
|
+
if (levelKnobChecks.length > 0 || signals) {
|
|
17139
|
+
const policyOf = (layer) => layer?.policy ?? {};
|
|
17140
|
+
const trusted = /* @__PURE__ */ new Set([...managedStatedChecks, ...Object.keys(workspaceChecks)]);
|
|
17141
|
+
const trustedSignals = new Set(managedStatedSignals);
|
|
17142
|
+
const project = /* @__PURE__ */ new Set();
|
|
17143
|
+
const projectSignals = /* @__PURE__ */ new Set();
|
|
17144
|
+
if (!keyed) {
|
|
17145
|
+
for (const id of knobStatedChecks(policyOf(globalConfig))) trusted.add(id);
|
|
17146
|
+
for (const k of statedSignalFields(policyOf(globalConfig))) trustedSignals.add(k);
|
|
17147
|
+
for (const id of knobStatedChecks(policyOf(projectConfig))) project.add(id);
|
|
17148
|
+
for (const k of statedSignalFields(policyOf(projectConfig))) projectSignals.add(k);
|
|
17149
|
+
}
|
|
17150
|
+
const before = resolveCheckMap(catalogSettingsFromConfig({}, mergedPolicy));
|
|
17151
|
+
for (const [id, v] of levelKnobChecks) {
|
|
17152
|
+
if (trusted.has(id)) continue;
|
|
17153
|
+
if (project.has(id) && CHECK_VERDICT_RANK[v] <= CHECK_VERDICT_RANK[before[id] ?? "off"])
|
|
17154
|
+
continue;
|
|
17155
|
+
checkToLegacyPolicy(mergedPolicy, id, v);
|
|
17156
|
+
}
|
|
17157
|
+
if (signals) {
|
|
17158
|
+
for (const key of ["newPackage", "installScript"]) {
|
|
17159
|
+
if (trustedSignals.has(key) || projectSignals.has(key)) continue;
|
|
17160
|
+
mergedPolicy.packageCheck[key] = signals[key];
|
|
17161
|
+
}
|
|
17162
|
+
}
|
|
17163
|
+
}
|
|
17021
17164
|
const explicit = {};
|
|
17022
17165
|
const checkSources = {};
|
|
17023
17166
|
if (keyed) {
|
|
@@ -17189,6 +17332,9 @@ function applyUntrustedContent(cur, raw, replaceLists = false, isProject = false
|
|
|
17189
17332
|
// src/utils/regex.ts
|
|
17190
17333
|
init_dist();
|
|
17191
17334
|
|
|
17335
|
+
// src/policy/index.ts
|
|
17336
|
+
init_dist();
|
|
17337
|
+
|
|
17192
17338
|
// src/dlp.ts
|
|
17193
17339
|
init_dist();
|
|
17194
17340
|
init_dist();
|
|
@@ -20117,11 +20263,11 @@ async function checkOne(p, cfg, misses, networkCapped, cwd) {
|
|
|
20117
20263
|
}
|
|
20118
20264
|
return findings;
|
|
20119
20265
|
}
|
|
20120
|
-
var
|
|
20266
|
+
var SOFT2 = /* @__PURE__ */ new Set(["new", "install-script"]);
|
|
20121
20267
|
async function byHistory(p, version, info, findings, misses) {
|
|
20122
20268
|
let out = findings;
|
|
20123
20269
|
let h = info.history;
|
|
20124
|
-
if (!h && p.ecosystem === "PyPI" && out.some((f) =>
|
|
20270
|
+
if (!h && p.ecosystem === "PyPI" && out.some((f) => SOFT2.has(f.kind))) {
|
|
20125
20271
|
try {
|
|
20126
20272
|
h = await pypiHistory(p.name, version) ?? void 0;
|
|
20127
20273
|
} catch (err) {
|
|
@@ -20141,7 +20287,7 @@ async function byHistory(p, version, info, findings, misses) {
|
|
|
20141
20287
|
});
|
|
20142
20288
|
if (p.ecosystem === "npm") {
|
|
20143
20289
|
if (h.previousProvenance && h.provenance === false) return [...out, drop()];
|
|
20144
|
-
if (!out.some((f) =>
|
|
20290
|
+
if (!out.some((f) => SOFT2.has(f.kind)) || !h.provenance || !h.previousProvenance) return out;
|
|
20145
20291
|
const [now, before] = await Promise.all([
|
|
20146
20292
|
npmSourceRepo(p.name, version),
|
|
20147
20293
|
npmSourceRepo(p.name, previous)
|
|
@@ -20149,7 +20295,7 @@ async function byHistory(p, version, info, findings, misses) {
|
|
|
20149
20295
|
return vouched(p, version, now, before, out, misses);
|
|
20150
20296
|
}
|
|
20151
20297
|
if (p.ecosystem === "PyPI") {
|
|
20152
|
-
if (!out.some((f) =>
|
|
20298
|
+
if (!out.some((f) => SOFT2.has(f.kind)) || !info.file || !h.previousFile) return out;
|
|
20153
20299
|
const [now, before] = await Promise.all([
|
|
20154
20300
|
pypiSourceRepo(p.name, version, info.file),
|
|
20155
20301
|
pypiSourceRepo(p.name, previous, h.previousFile)
|
|
@@ -20165,7 +20311,7 @@ function vouched(p, version, now, before, findings, misses) {
|
|
|
20165
20311
|
return findings;
|
|
20166
20312
|
}
|
|
20167
20313
|
if (now === "none" || before === "none" || now !== before) return findings;
|
|
20168
|
-
return findings.filter((f) => !
|
|
20314
|
+
return findings.filter((f) => !SOFT2.has(f.kind));
|
|
20169
20315
|
}
|
|
20170
20316
|
async function runPackageCheck(toolName, args, cfg, cwd) {
|
|
20171
20317
|
if (!cfg.enabled) return ALLOW;
|
|
@@ -20485,7 +20631,7 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
|
|
|
20485
20631
|
appendHookDebug(toolName, args, meta, hashAuditArgs);
|
|
20486
20632
|
}
|
|
20487
20633
|
const isManual = meta?.agent === "Terminal";
|
|
20488
|
-
const isObserveMode = config.settings.mode
|
|
20634
|
+
const isObserveMode = isRecordOnly(config.settings.mode);
|
|
20489
20635
|
let explainableLabel = "Local Config";
|
|
20490
20636
|
let dlpReviewFlagged = false;
|
|
20491
20637
|
let packageReview = null;
|
|
@@ -20543,7 +20689,7 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
|
|
|
20543
20689
|
explainableLabel = "Shell inspection incomplete";
|
|
20544
20690
|
policyRuleDescription = "The executable command could not be inspected. Approve this call explicitly.";
|
|
20545
20691
|
}
|
|
20546
|
-
const fileReview = !isObserveMode &&
|
|
20692
|
+
const fileReview = !isObserveMode && fileFinding?.decision === "review";
|
|
20547
20693
|
const evaluateCurrentPolicy = async (skipIgnoredFastPath = false) => {
|
|
20548
20694
|
const own = await evaluatePolicy2(toolName, args, meta?.agent, options?.cwd, {
|
|
20549
20695
|
fileAccess,
|
|
@@ -20570,7 +20716,7 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
|
|
|
20570
20716
|
if (fileFinding) {
|
|
20571
20717
|
meta = { ...meta, ruleName: fileFinding.ruleName };
|
|
20572
20718
|
hashAuditArgs = true;
|
|
20573
|
-
const observing = isObserveMode
|
|
20719
|
+
const observing = isObserveMode;
|
|
20574
20720
|
const blocked = !observing && (fileFinding.decision === "block" || fileReview && config.settings.panicMode);
|
|
20575
20721
|
appendLocalAudit(
|
|
20576
20722
|
toolName,
|
|
@@ -21052,15 +21198,6 @@ async function _authorizeHeadlessCore(toolName, args, metaArg, options) {
|
|
|
21052
21198
|
}
|
|
21053
21199
|
return { approved: true, checkedBy: "audit" };
|
|
21054
21200
|
}
|
|
21055
|
-
if (config.settings.mode === "audit") {
|
|
21056
|
-
if (judge) {
|
|
21057
|
-
const policyResult = await evaluateCurrentPolicy();
|
|
21058
|
-
if (policyResult.decision === "review") {
|
|
21059
|
-
appendLocalAudit(toolName, args, "allow", "audit-mode", ownRowMeta(true), hashAuditArgs);
|
|
21060
|
-
}
|
|
21061
|
-
}
|
|
21062
|
-
return { approved: true, checkedBy: "audit" };
|
|
21063
|
-
}
|
|
21064
21201
|
let appPermReview = null;
|
|
21065
21202
|
let appPermReviewTool = null;
|
|
21066
21203
|
const callSpecificReview = () => fileReview || shellReview || dlpReviewFlagged || !!appPermReview || !!taintWarning || !!exposureReview || !!packageReview;
|
package/dist/scan-ink.mjs
CHANGED
|
@@ -102,7 +102,8 @@ var SmartRuleSchema = z.object({
|
|
|
102
102
|
var ConfigFileSchema = z.object({
|
|
103
103
|
version: z.string().optional(),
|
|
104
104
|
settings: z.object({
|
|
105
|
-
|
|
105
|
+
// The protection level (levels.ts in the engine); `observe` is Audit's older name.
|
|
106
|
+
mode: z.enum(["observe", "audit", "soft", "standard", "strict", "block-all"]).optional(),
|
|
106
107
|
autoStartDaemon: z.boolean().optional(),
|
|
107
108
|
// enableUndo / policy.snapshot: removed with the undo feature. The
|
|
108
109
|
// schema strips undeclared keys silently (plain zod object — no
|
|
@@ -2121,6 +2122,27 @@ var CHECK_TEXT = {
|
|
|
2121
2122
|
advice: "Keep Block for known-malicious packages; brand-new packages already stop for Review."
|
|
2122
2123
|
}
|
|
2123
2124
|
};
|
|
2125
|
+
var LEVELS = ["audit", "soft", "standard", "strict", "block-all"];
|
|
2126
|
+
var MODE_VALUES = ["observe", ...LEVELS];
|
|
2127
|
+
var STRICT = {
|
|
2128
|
+
"commands.sql-ddl": "block",
|
|
2129
|
+
"commands.disk-destroy": "block",
|
|
2130
|
+
"commands.node9-disarm": "block",
|
|
2131
|
+
"files.system-dirs": "block",
|
|
2132
|
+
"files.shell-startup": "block",
|
|
2133
|
+
"files.password-hashes": "block",
|
|
2134
|
+
"data.secrets-weak": "block",
|
|
2135
|
+
"data.pipe-chain": "block",
|
|
2136
|
+
"network.unknown-host": "review",
|
|
2137
|
+
"network.internal-addresses": "block",
|
|
2138
|
+
"behavior.prompt-injection": "log",
|
|
2139
|
+
"loading.skill-tamper": "block"
|
|
2140
|
+
};
|
|
2141
|
+
var BLOCK_ALL = {
|
|
2142
|
+
...STRICT,
|
|
2143
|
+
"commands.unknown": "review",
|
|
2144
|
+
"commands.temp-binary": "block"
|
|
2145
|
+
};
|
|
2124
2146
|
var VERDICTS = ["off", "log", "review", "block"];
|
|
2125
2147
|
var ALL = VERDICTS;
|
|
2126
2148
|
var BUILTIN_DANGEROUS_WORDS = ["mkfs", "shred"];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@node9/proxy",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.39.0",
|
|
4
4
|
"description": "Access control for AI agents. Set what Claude Code, Codex, Gemini, Cursor and any MCP server are allowed to do, review risky actions before they run, and keep every action on the record.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|