@node9/proxy 2.54.0 → 2.55.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/index.mjs CHANGED
@@ -944,12 +944,46 @@ function wordValues(word, state) {
944
944
  if (!dynamic) return out.map(asWord);
945
945
  return out.filter((piece) => piece.value !== "").map((piece) => ({ value: piece.value, pattern: piece.pattern + "*", dynamic: true }));
946
946
  }
947
+ function sedSubstitutions(script) {
948
+ const out = [];
949
+ for (const raw of script.split(/\r?\n|;/)) {
950
+ const cmd = raw.trim();
951
+ if (cmd === "") continue;
952
+ const m = /^(?:(?:\d+|\$|\/(?:\\.|[^\\/])*\/)(?:,(?:\d+|\$|\/(?:\\.|[^\\/])*\/))?)?s(.)/.exec(
953
+ cmd
954
+ );
955
+ if (!m) return null;
956
+ const delimiter = m[1];
957
+ if (delimiter === "\\") return null;
958
+ const parts = [];
959
+ let cur = "";
960
+ let i = m[0].length;
961
+ for (; i < cmd.length && parts.length < 2; i++) {
962
+ const ch = cmd[i];
963
+ if (ch === "\\" && i + 1 < cmd.length) {
964
+ cur += ch + cmd[++i];
965
+ continue;
966
+ }
967
+ if (ch === delimiter) {
968
+ parts.push(cur);
969
+ cur = "";
970
+ continue;
971
+ }
972
+ cur += ch;
973
+ }
974
+ if (parts.length < 2) return null;
975
+ if (!/^[gpiImM0-9]*$/.test(cmd.slice(i))) return null;
976
+ out.push(parts[1].replace(/\\(.)/g, "$1"));
977
+ }
978
+ return out.length > 0 ? out : null;
979
+ }
947
980
  function collectShellFileAccesses(command, context = {}) {
948
981
  const out = [];
949
982
  let payloads = 256;
950
983
  const functions = /* @__PURE__ */ new Map();
951
984
  const seenCalls = /* @__PURE__ */ new Set();
952
985
  const pipedStdin = /* @__PURE__ */ new WeakMap();
986
+ let currentStdin = null;
953
987
  let callWalks2 = MAX_CALL_WALKS;
954
988
  const initial = {
955
989
  cwd: [context.cwd ?? ""],
@@ -1044,8 +1078,9 @@ function collectShellFileAccesses(command, context = {}) {
1044
1078
  }
1045
1079
  const locate = (p) => tokens.find((w) => w?.value === p) ?? { value: p };
1046
1080
  if (name === "sed") {
1047
- let inplace = false, hasScript = false, ended = false;
1081
+ let inplace = false, hasScript = false, ended = false, scriptUnknown = false;
1048
1082
  const files = [];
1083
+ const scriptParts = [];
1049
1084
  for (let i = 0; i < args.length; i++) {
1050
1085
  const token = args[i];
1051
1086
  if (!token) {
@@ -1063,7 +1098,11 @@ function collectShellFileAccesses(command, context = {}) {
1063
1098
  hasScript = true;
1064
1099
  const eq = value.indexOf("=");
1065
1100
  const script = eq < 0 ? args[++i] : { value: value.slice(eq + 1) };
1066
- if (value.startsWith("--file") && script) add("read", script, state);
1101
+ if (value.startsWith("--file")) {
1102
+ scriptUnknown = true;
1103
+ if (script) add("read", script, state);
1104
+ } else if (script?.value) scriptParts.push(script.value);
1105
+ else scriptUnknown = true;
1067
1106
  }
1068
1107
  continue;
1069
1108
  }
@@ -1078,7 +1117,11 @@ function collectShellFileAccesses(command, context = {}) {
1078
1117
  if (flag === "e" || flag === "f") {
1079
1118
  hasScript = true;
1080
1119
  const script = value.slice(j + 1) ? { value: value.slice(j + 1) } : args[++i];
1081
- if (flag === "f" && script) add("read", script, state);
1120
+ if (flag === "f") {
1121
+ scriptUnknown = true;
1122
+ if (script) add("read", script, state);
1123
+ } else if (script?.value) scriptParts.push(script.value);
1124
+ else scriptUnknown = true;
1082
1125
  break;
1083
1126
  }
1084
1127
  if (flag === "l") {
@@ -1088,10 +1131,14 @@ function collectShellFileAccesses(command, context = {}) {
1088
1131
  }
1089
1132
  continue;
1090
1133
  }
1091
- if (!hasScript) hasScript = true;
1092
- else files.push(token);
1134
+ if (!hasScript) {
1135
+ hasScript = true;
1136
+ scriptParts.push(value);
1137
+ } else files.push(token);
1093
1138
  }
1094
- for (const file2 of files) add(inplace ? "write" : "read", file2, state);
1139
+ const edits = inplace && !scriptUnknown ? sedSubstitutions(scriptParts.join("\n")) : null;
1140
+ for (const file2 of files)
1141
+ add(inplace ? "write" : "read", file2, state, edits ? { edits } : {});
1095
1142
  return;
1096
1143
  }
1097
1144
  if (FS_READ_TOOLS.has(name) && name !== "dd") {
@@ -1218,9 +1265,11 @@ function collectShellFileAccesses(command, context = {}) {
1218
1265
  continue;
1219
1266
  const remove = name === "rm" || name === "unlink";
1220
1267
  const append = name === "tee" && strings.some((s) => s === "--append" || /^-[^-]*a/.test(s));
1268
+ const teed = name === "tee" && !append ? currentStdin : null;
1221
1269
  add(remove ? "remove" : name === "touch" ? "create" : "write", token, state, {
1222
1270
  recursive: remove && strings.some((s) => /^-[^-]*[rR]/.test(s) || s === "--recursive"),
1223
- ...append ? { append: true } : {}
1271
+ ...append ? { append: true } : {},
1272
+ ...teed !== null ? { text: teed } : {}
1224
1273
  });
1225
1274
  }
1226
1275
  return;
@@ -1542,11 +1591,18 @@ function collectShellFileAccesses(command, context = {}) {
1542
1591
  if (stmt.Background) state = clone(state);
1543
1592
  const headWord = stmt.Cmd && stmt.Cmd.kind === "CallExpr" ? base(resolveWordLiteral(stmt.Cmd.Args?.[0])) : "";
1544
1593
  const sends = SENDING_STDIN.has(headWord);
1594
+ let produced;
1545
1595
  for (const redir of stmt.Redirs ?? []) {
1546
1596
  substitutions(redir.Word, state, depth);
1547
1597
  for (const word of wordValues(redir.Word, state)) {
1548
- if (ops().WRITES.has(redir.Op))
1549
- add("write", word, state, ops().APPENDS.has(redir.Op) ? { append: true } : {});
1598
+ if (ops().WRITES.has(redir.Op)) {
1599
+ if (ops().APPENDS.has(redir.Op)) add("write", word, state, { append: true });
1600
+ else {
1601
+ const stdout = redir.N == null || redir.N.Value === "1";
1602
+ if (stdout && produced === void 0) produced = producedText(stmt);
1603
+ add("write", word, state, stdout && produced ? { text: produced } : {});
1604
+ }
1605
+ }
1550
1606
  if (ops().READS.has(redir.Op)) add("read", word, state, sends ? { upload: true } : {});
1551
1607
  if (redir.Op === ops().DUP_OUT && word.value && !/^\d+$/.test(word.value))
1552
1608
  add("write", word, state);
@@ -1558,6 +1614,7 @@ function collectShellFileAccesses(command, context = {}) {
1558
1614
  stdinScript(stmt, state, depth);
1559
1615
  const fedText = stdinText(stmt);
1560
1616
  if (fedText !== null) nestedPayload(xargsPayload(stmt, fedText), clone(state), depth);
1617
+ currentStdin = fedText;
1561
1618
  switch (cmd.kind) {
1562
1619
  case "CallExpr":
1563
1620
  call(cmd, state, depth);
@@ -1671,6 +1728,26 @@ function collectShellFileAccesses(command, context = {}) {
1671
1728
  }
1672
1729
  return out;
1673
1730
  }
1731
+ function serviceNamedIn(text) {
1732
+ const re = new RegExp(SERVICE_WORD_RE.source, "gi");
1733
+ for (let m = re.exec(text); m; m = re.exec(text)) {
1734
+ const lower2 = m[1].toLowerCase();
1735
+ if (lower2 === "init" && !INIT_PATTERN_RE.test(text)) continue;
1736
+ return SYSTEM_SERVICES.find((s) => s.toLowerCase() === lower2) ?? m[1];
1737
+ }
1738
+ return null;
1739
+ }
1740
+ function serviceOf(name) {
1741
+ const leaf = name.replace(/^.*[\\/]/, "").replace(/\.service$/, "").replace(/@.*$/, "");
1742
+ const lower2 = leaf.toLowerCase();
1743
+ return SYSTEM_SERVICES.find((s) => s.toLowerCase() === lower2) ?? UNIT_ALIASES[lower2] ?? null;
1744
+ }
1745
+ function killsService(language, code) {
1746
+ const api = KILL_API[language].exec(code);
1747
+ if (!api) return null;
1748
+ const service = serviceNamedIn(code);
1749
+ return service ? `${api[0].trim()} with ${service}` : null;
1750
+ }
1674
1751
  function inlineLanguageOf(interp) {
1675
1752
  const i = interp.toLowerCase();
1676
1753
  if (/^python[\d.]*$/.test(i)) return "python";
@@ -1745,6 +1822,15 @@ function judgeInlineCode(language, code, isProtected) {
1745
1822
  return { outcome: "unreadable", what: "is too long for node9 to read" };
1746
1823
  }
1747
1824
  const text = language === "python" ? resolvePythonAliases(code) : code;
1825
+ const killed = killsService(language, text);
1826
+ if (killed) {
1827
+ return {
1828
+ outcome: "dangerous",
1829
+ what: WHAT["kills-service"],
1830
+ evidence: killed.slice(0, 60),
1831
+ category: "kills-service"
1832
+ };
1833
+ }
1748
1834
  for (const [category, re] of TABLES[language]) {
1749
1835
  const m = re.exec(text);
1750
1836
  if (!m) continue;
@@ -6559,8 +6645,16 @@ function evaluateGitHooksFileAccess(args, accesses, context, settings, shell) {
6559
6645
  disarms = true;
6560
6646
  how = "removed";
6561
6647
  } else if (texts === null) {
6562
- disarms = true;
6563
- how = "overwritten";
6648
+ if (access.edits) {
6649
+ disarms = access.edits.some(editDisarms);
6650
+ how = "edited to exit";
6651
+ } else if (access.text !== void 0) {
6652
+ disarms = hookTextRunsNothing(access.text);
6653
+ how = "emptied";
6654
+ } else {
6655
+ disarms = true;
6656
+ how = "overwritten";
6657
+ }
6564
6658
  } else if (texts.whole.length > 0) {
6565
6659
  disarms = texts.whole.some(hookTextRunsNothing);
6566
6660
  how = "emptied";
@@ -8392,6 +8486,118 @@ function scanArgumentSecrets(args) {
8392
8486
  severity: "review"
8393
8487
  } : null;
8394
8488
  }
8489
+ function shownOf2(words) {
8490
+ return words.map((w) => w ?? "$?").join(" ").slice(0, 80);
8491
+ }
8492
+ function withoutComments(command) {
8493
+ return command.split("\n").map((line) => {
8494
+ for (let i = 0; i < line.length; i++) {
8495
+ if (line[i] === "#" && (i === 0 || line[i - 1] === " " || line[i - 1] === " ")) {
8496
+ return line.slice(0, i);
8497
+ }
8498
+ }
8499
+ return line;
8500
+ }).join("\n");
8501
+ }
8502
+ function detectSystemProcessStop(command, depth = 0) {
8503
+ if (!PRESCREEN_RE3.test(command)) return null;
8504
+ const named = serviceNamedIn(withoutComments(command));
8505
+ let direct = null;
8506
+ let dynamicKill = null;
8507
+ walkCommandScope(command, (node) => {
8508
+ const n = node;
8509
+ if (direct || !n || n.kind !== "CallExpr") return true;
8510
+ const words = (n.Args || []).map((a) => resolveWordLiteral(a));
8511
+ if (words.length === 0) return true;
8512
+ if (baseWord(words[0]) === "xargs" && words.some((w) => w !== null && baseWord(w) === "kill")) {
8513
+ dynamicKill ??= shownOf2(words);
8514
+ return true;
8515
+ }
8516
+ if (depth < MAX_PAYLOAD_DEPTH5) {
8517
+ const payload = literalShellPayload(words, baseWord(words[0]));
8518
+ if (payload !== null) {
8519
+ const inner = detectSystemProcessStop(payload, depth + 1);
8520
+ if (inner) direct = inner;
8521
+ return true;
8522
+ }
8523
+ }
8524
+ const head = unwrapCommandHead(words);
8525
+ if (head >= words.length) return true;
8526
+ const name = baseWord(words[head]);
8527
+ const rest = words.slice(head + 1);
8528
+ const shown = shownOf2(words);
8529
+ const viaXargs = words.slice(0, head).some((w) => w !== null && baseWord(w) === "xargs");
8530
+ if (name === "kill") {
8531
+ const targets = [];
8532
+ for (let i = 0; i < rest.length; i++) {
8533
+ const w = rest[i];
8534
+ if (i === 0 && w !== null && KILL_SIGNAL_RE.test(w)) {
8535
+ if (w === "-s") i++;
8536
+ continue;
8537
+ }
8538
+ if (w === "--") continue;
8539
+ targets.push(w);
8540
+ }
8541
+ if (targets.some((t) => t === "1" || t === "-1")) {
8542
+ direct = { service: "init (pid 1)", how: "kills", shown };
8543
+ } else if (viaXargs || targets.some((t) => t === null)) {
8544
+ dynamicKill ??= shown;
8545
+ }
8546
+ return true;
8547
+ }
8548
+ if (name === "pkill" || name === "killall") {
8549
+ let skipValue = false;
8550
+ for (const w of rest) {
8551
+ if (skipValue) {
8552
+ skipValue = false;
8553
+ continue;
8554
+ }
8555
+ if (w !== null && w.startsWith("-")) {
8556
+ if (/^-(?:u|U|g|G|t|P|s|n|o|r|q|-signal|-uid|-user)$/.test(w)) skipValue = true;
8557
+ continue;
8558
+ }
8559
+ if (w === null) {
8560
+ dynamicKill ??= shown;
8561
+ continue;
8562
+ }
8563
+ const service = serviceOf(w) ?? serviceNamedIn(w);
8564
+ if (service) direct = { service, how: "kills", shown };
8565
+ }
8566
+ return true;
8567
+ }
8568
+ if (name === "systemctl") {
8569
+ if (rest.includes("--user")) return true;
8570
+ const verb = rest.find((w) => w !== null && !w.startsWith("-"));
8571
+ if (verb === void 0 || verb === null || !SYSTEMCTL_STOP_VERBS.has(verb)) return true;
8572
+ for (const w of rest.slice(rest.indexOf(verb) + 1)) {
8573
+ const service = w === null ? null : serviceOf(w);
8574
+ if (service) direct = { service, how: verb === "kill" ? "kills" : "stops", shown };
8575
+ }
8576
+ return true;
8577
+ }
8578
+ if (name === "service") {
8579
+ const [unit, verb] = rest;
8580
+ const service = typeof unit === "string" ? serviceOf(unit) : null;
8581
+ if (service && verb === "stop") direct = { service, how: "stops", shown };
8582
+ return true;
8583
+ }
8584
+ if (name === "launchctl") {
8585
+ const verb = rest.find((w) => w !== null && !w.startsWith("-"));
8586
+ if (verb === void 0 || verb === null || !LAUNCHCTL_UNLOAD_VERBS.has(verb)) return true;
8587
+ const daemon = rest.find((w) => w !== null && LAUNCH_DAEMONS_RE.test(w));
8588
+ if (daemon) {
8589
+ direct = { service: daemon.replace(/^.*\//, ""), how: "unloads the system daemon", shown };
8590
+ }
8591
+ return true;
8592
+ }
8593
+ return true;
8594
+ });
8595
+ if (direct) return direct;
8596
+ if (dynamicKill !== null && named) {
8597
+ return { service: named, how: "kills the processes of", shown: dynamicKill };
8598
+ }
8599
+ return null;
8600
+ }
8395
8601
  function patternSelects(pattern, targets) {
8396
8602
  const pieces = pattern.toLowerCase().split(/[\\^$.*+?()[\]{}|]+/).filter(Boolean);
8397
8603
  if (pieces.length === 0) return false;
@@ -9011,6 +9217,17 @@ async function evaluatePolicyCore(config, toolName, args, context = {}, hooks =
9011
9217
  checkId: "commands.eval-dynamic"
9012
9218
  });
9013
9219
  }
9220
+ const stopped = detectSystemProcessStop(shellCommand);
9221
+ if (stopped) {
9222
+ consider("commands.system-processes", {
9223
+ decision: "review",
9224
+ blockedByLabel: "Node9: System Service Stopped",
9225
+ reason: `The AI ${stopped.how} ${stopped.service}: ${stopped.shown}`,
9226
+ ruleDescription: "The AI stops or kills a system service (sshd, dockerd, systemd, a database or web server). Other people and programs on this machine depend on it; confirm this is intentional.",
9227
+ tier: 3,
9228
+ checkId: "commands.system-processes"
9229
+ });
9230
+ }
9014
9231
  const builtin = strictestVerdict(candidates);
9015
9232
  if (builtin) return builtin;
9016
9233
  {
@@ -10089,7 +10306,7 @@ function matchCanaryArgs(args, values) {
10089
10306
  return null;
10090
10307
  }
10091
10308
  }
10092
- var getFilename, __filename2, 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, settings_default, branches_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, ASI, ASI_IDS, PACK_SHIELD_OWASP, PACK_RULE_OWASP, 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, syntax, KINDS, STRUCTS, unknownKinds, 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_ALTERNATIVES, MAX_CALL_DEPTH, MAX_CALL_WALKS, MAX_XARGS_PAYLOAD, 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, ops, MAX_INLINE_CODE, WHAT, OUTSIDE, pyImport, either, PYTHON, NODE, PERL, RUBY, PHP, TABLES, STRING_LITERAL, READ_CALL, ARG, WRAP, STR_PREFIX, WRITE_MODE_LITERAL, WRITE_MODE, WRITE_MODE_AFTER, PERL_WRITE_BEFORE, readCallBefore, READ_BEFORE, READ_AFTER, ASSIGNED, openedName, OPENED_NAME, DOTENV, DOTENV_PATH_OPTION, sharedParser, MESSAGE_FLAGS, SHELL_INTERPRETERS, DOWNLOAD_CMDS, NORMALIZE_CACHE_MAX, normalizeCache, codeBodiesCache, AST_CACHE_MAX, astCache, PARSE_FAIL, INTERPRETER_LINE, PROGRAM_DIR, ACCESS_VIEW_CACHE_MAX, accessViewCache, MAX_READING_PAYLOADS, STDIN_CODE_INTERPRETERS, RUNS_TEXT_ELSEWHERE, defaultExpansionOps, EMPTY_NAMES, VARIABLE_READERS, PLAIN_PROGRAM_NAME, 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, NODE_VALUE_FLAG, 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, andOrOps, ARRAY_MARK, ARRAY_SEP, MAX_CALL_DEPTH2, MAX_CALL_WALKS2, callDepth, callWalks, FS_OP_CACHE_MAX, fsOpCache, stripDotSlash, REDIR_TRUNCATE_OPS, REDIR_FILE_IN_OPS, REDIR_HEREDOC_OPS, FIND_OPTIONS, COPY_RULE_OF, INDIRECT_SHAPE_RE, SOURCES_FILE_RE, SHELL_SET_VARS, pipeOps, callWords, JAILED_GLOB_NAMES, JAILED_DIR_NAMES, shellGlob, GLOB_META, INLINE_INTERP_PRESCREEN_RE, runsInlineInterpreter, isReaderWord, positionalAfter, NONE, UNKNOWN, FORBIDDEN_PATH_SEGMENTS, BASH_TOOL_NAMES, MCP_EXECUTORS, BUILTIN_FIELDS, ARGV_FIELDS, BARE_WORD, MAX_ARGV_CHARACTERS, exempt, RANK, SEQUENCE_OPS, 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, VERHOEFF_D, VERHOEFF_P, MAX, UNTRUSTED_TOOLS, INJECTION_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, BASIC_HEADER_RE, BASIC_HEADER_PAIR_RE, BASIC_PLACEHOLDER_RE, BASIC_TEMPLATE_MARKERS, DROPBOX_SECRET_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, IMPERATIVE, SECRET_TARGET, GUARD, SIGNALS, DESTINATION_RE, REUSED_SIGNALS, NEVER_NEGATED, NEGATION_BEFORE, RDR_IN, COPY_VERBS2, LITERAL_VERBS, GIT_PRESCREEN_RE, MAX_PAYLOAD_DEPTH2, MAX_ALIAS_DEPTH, CACHE_MAX, cache, PAYLOAD_SHELLS, CONFIG_SCOPE_FLAGS, CONFIG_VALUE_FLAGS, GLOBAL_VALUE_OPTIONS, GLOBAL_FLAG_OPTIONS, MAX_LOOP_ITEMS, GitWalk, POSITIONAL2, NO_VARS, NO_APPENDS, FORCE_PUSH, DESTRUCTIVE, UNREADABLE, PUSH_LONG_VALUE, BRANCH_LONG_VALUE, TAG_LONG_VALUE, CLEAN_LONG_VALUE, RESTORE_LONG_VALUE, CHECKOUT_LONG_VALUE, HOOKS_BYPASS, NO_VERIFY_SUBS, HOOK_KILL_SWITCHES, COMMIT_LONG_VALUE, CHMOD_OPTION_RE, _appendOp, STAGE_ALL, ADD_LONG_VALUE, CHECK_ID, RULE_NAME, INERT_LINE_RE, CHECK_ID2, INSTRUCTION_NAMES, SETTINGS_RE, HOOK_WORDS_RE, SHELLS, NETCATS, NET_CLIENTS, SENDERS, NETCAT_EXEC_LONG, DECL_DUMPS, PROC_ENVIRON_RE, DEV_NET_RE, SOCAT_PROGRAM_RE, SOCAT_NET_RE, PRESCREEN_RE, MAX_PAYLOAD_DEPTH3, CACHE_MAX2, cache2, dupInOp, REVERSE_SHELL_DESCRIPTION, ENV_EXFIL_DESCRIPTION, DYNAMIC_WORD, MULTICALL, SHELL_VALUE_OPTIONS, INTERPRETERS, OutboundWalk, 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, SHELLS2, MAX_NESTING, SHELL_VALUE_FLAGS, NPM_FAMILY, PIP_FAMILY, NPM_FETCH_VERBS, PIP_FETCH_VERBS, NPM_FLAGS, PIP_FLAGS, NPM_VARS, PIP_VARS, PRESCREEN_RE2, PIP_ATTACHED_RE, MAX_PAYLOAD_DEPTH4, PUBLIC_REGISTRY_HOSTS, 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, RULE_NAME2, DESCRIPTION, DAEMON_CMDLINES, DAEMON_NAMES, KILLALL_NAMES, STOP_SYSTEMCTL, STOP_LAUNCHCTL, PKILL_VALUE_FLAGS, NAME_PRESCREEN_RE, base2, HOME_PID_FILE_RE, VERDICT_RANK, SQL_DML_KEYWORDS, NOT_OVERRIDABLE_CHECKS, 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_CS_RE, idLabelIn, 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, 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, SHELLS3, 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;
10309
+ var getFilename, __filename2, 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, settings_default, branches_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, ASI, ASI_IDS, PACK_SHIELD_OWASP, PACK_RULE_OWASP, 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, syntax, KINDS, STRUCTS, unknownKinds, 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_ALTERNATIVES, MAX_CALL_DEPTH, MAX_CALL_WALKS, MAX_XARGS_PAYLOAD, 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, ops, INFRASTRUCTURE_SERVICES, SERVER_SERVICES, SYSTEM_SERVICES, escape, SERVICE_WORD_RE, INIT_PATTERN_RE, UNIT_ALIASES, MAX_INLINE_CODE, WHAT, KILL_API, OUTSIDE, pyImport, either, PYTHON, NODE, PERL, RUBY, PHP, TABLES, STRING_LITERAL, READ_CALL, ARG, WRAP, STR_PREFIX, WRITE_MODE_LITERAL, WRITE_MODE, WRITE_MODE_AFTER, PERL_WRITE_BEFORE, readCallBefore, READ_BEFORE, READ_AFTER, ASSIGNED, openedName, OPENED_NAME, DOTENV, DOTENV_PATH_OPTION, sharedParser, MESSAGE_FLAGS, SHELL_INTERPRETERS, DOWNLOAD_CMDS, NORMALIZE_CACHE_MAX, normalizeCache, codeBodiesCache, AST_CACHE_MAX, astCache, PARSE_FAIL, INTERPRETER_LINE, PROGRAM_DIR, ACCESS_VIEW_CACHE_MAX, accessViewCache, MAX_READING_PAYLOADS, STDIN_CODE_INTERPRETERS, RUNS_TEXT_ELSEWHERE, defaultExpansionOps, EMPTY_NAMES, VARIABLE_READERS, PLAIN_PROGRAM_NAME, 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, NODE_VALUE_FLAG, 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, andOrOps, ARRAY_MARK, ARRAY_SEP, MAX_CALL_DEPTH2, MAX_CALL_WALKS2, callDepth, callWalks, FS_OP_CACHE_MAX, fsOpCache, stripDotSlash, REDIR_TRUNCATE_OPS, REDIR_FILE_IN_OPS, REDIR_HEREDOC_OPS, FIND_OPTIONS, COPY_RULE_OF, INDIRECT_SHAPE_RE, SOURCES_FILE_RE, SHELL_SET_VARS, pipeOps, callWords, JAILED_GLOB_NAMES, JAILED_DIR_NAMES, shellGlob, GLOB_META, INLINE_INTERP_PRESCREEN_RE, runsInlineInterpreter, isReaderWord, positionalAfter, NONE, UNKNOWN, FORBIDDEN_PATH_SEGMENTS, BASH_TOOL_NAMES, MCP_EXECUTORS, BUILTIN_FIELDS, ARGV_FIELDS, BARE_WORD, MAX_ARGV_CHARACTERS, exempt, RANK, SEQUENCE_OPS, 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, VERHOEFF_D, VERHOEFF_P, MAX, UNTRUSTED_TOOLS, INJECTION_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, BASIC_HEADER_RE, BASIC_HEADER_PAIR_RE, BASIC_PLACEHOLDER_RE, BASIC_TEMPLATE_MARKERS, DROPBOX_SECRET_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, IMPERATIVE, SECRET_TARGET, GUARD, SIGNALS, DESTINATION_RE, REUSED_SIGNALS, NEVER_NEGATED, NEGATION_BEFORE, RDR_IN, COPY_VERBS2, LITERAL_VERBS, GIT_PRESCREEN_RE, MAX_PAYLOAD_DEPTH2, MAX_ALIAS_DEPTH, CACHE_MAX, cache, PAYLOAD_SHELLS, CONFIG_SCOPE_FLAGS, CONFIG_VALUE_FLAGS, GLOBAL_VALUE_OPTIONS, GLOBAL_FLAG_OPTIONS, MAX_LOOP_ITEMS, GitWalk, POSITIONAL2, NO_VARS, NO_APPENDS, FORCE_PUSH, DESTRUCTIVE, UNREADABLE, PUSH_LONG_VALUE, BRANCH_LONG_VALUE, TAG_LONG_VALUE, CLEAN_LONG_VALUE, RESTORE_LONG_VALUE, CHECKOUT_LONG_VALUE, HOOKS_BYPASS, NO_VERIFY_SUBS, HOOK_KILL_SWITCHES, COMMIT_LONG_VALUE, CHMOD_OPTION_RE, _appendOp, STAGE_ALL, ADD_LONG_VALUE, CHECK_ID, RULE_NAME, INERT_LINE_RE, CHECK_ID2, INSTRUCTION_NAMES, SETTINGS_RE, HOOK_WORDS_RE, SHELLS, NETCATS, NET_CLIENTS, SENDERS, NETCAT_EXEC_LONG, DECL_DUMPS, PROC_ENVIRON_RE, DEV_NET_RE, SOCAT_PROGRAM_RE, SOCAT_NET_RE, PRESCREEN_RE, MAX_PAYLOAD_DEPTH3, CACHE_MAX2, cache2, dupInOp, REVERSE_SHELL_DESCRIPTION, ENV_EXFIL_DESCRIPTION, DYNAMIC_WORD, MULTICALL, SHELL_VALUE_OPTIONS, INTERPRETERS, OutboundWalk, 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, SHELLS2, MAX_NESTING, SHELL_VALUE_FLAGS, NPM_FAMILY, PIP_FAMILY, NPM_FETCH_VERBS, PIP_FETCH_VERBS, NPM_FLAGS, PIP_FLAGS, NPM_VARS, PIP_VARS, PRESCREEN_RE2, PIP_ATTACHED_RE, MAX_PAYLOAD_DEPTH4, PUBLIC_REGISTRY_HOSTS, 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, PRESCREEN_RE3, KILL_SIGNAL_RE, SYSTEMCTL_STOP_VERBS, LAUNCHCTL_UNLOAD_VERBS, LAUNCH_DAEMONS_RE, MAX_PAYLOAD_DEPTH5, RULE_NAME2, DESCRIPTION, DAEMON_CMDLINES, DAEMON_NAMES, KILLALL_NAMES, STOP_SYSTEMCTL, STOP_LAUNCHCTL, PKILL_VALUE_FLAGS, NAME_PRESCREEN_RE, base2, HOME_PID_FILE_RE, VERDICT_RANK, SQL_DML_KEYWORDS, NOT_OVERRIDABLE_CHECKS, 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_CS_RE, idLabelIn, 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, 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, SHELLS3, 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;
10093
10310
  var init_dist = __esm({
10094
10311
  "packages/policy-engine/dist/index.mjs"() {
10095
10312
  "use strict";
@@ -11964,6 +12181,11 @@ var init_dist = __esm({
11964
12181
  example: "/tmp/build-helper --serve",
11965
12182
  advice: "Keep Review. Malware often runs from /tmp."
11966
12183
  },
12184
+ "commands.system-processes": {
12185
+ plain: "The agent stops or kills a system service: sshd, dockerd, containerd, systemd, kubelet, cron, the firewall, the display server, or a database or web server (nginx, apache, mysql, postgres, redis, mongo). Directly (pkill sshd, systemctl stop docker, kill of pid 1) or through the process list (a script that finds the processes of a name and kills them). Killing a process by its number, pkill node, killall python and systemctl restart are not this check.",
12186
+ example: "ps -eo pid,cmd | grep sshd | awk '{print $1}' | xargs kill -9",
12187
+ advice: "Keep Review: a stopped service takes other people and programs down with it. Set Log on a machine where agents manage local servers all day."
12188
+ },
11967
12189
  "commands.disk-destroy": {
11968
12190
  plain: "The agent formats, overwrites or securely erases a disk or file.",
11969
12191
  example: "dd if=/dev/zero of=/dev/sda",
@@ -12133,6 +12355,7 @@ var init_dist = __esm({
12133
12355
  "commands.sql-no-where": "log",
12134
12356
  "commands.temp-binary": "log",
12135
12357
  "commands.disk-destroy": "log",
12358
+ "commands.system-processes": "log",
12136
12359
  "commands.dangerous-word": "log",
12137
12360
  "files.system-dirs": "log",
12138
12361
  "files.shell-startup": "log",
@@ -12451,6 +12674,16 @@ var init_dist = __esm({
12451
12674
  defaultValue: "review",
12452
12675
  legacy: ["Manual Nuclear Protection"]
12453
12676
  },
12677
+ {
12678
+ id: "commands.system-processes",
12679
+ group: "commands",
12680
+ owasp: "ASI02",
12681
+ title: "Stops a system service",
12682
+ catches: "kill, pkill, killall, systemctl stop or kill, service stop or launchctl unload aimed at a system service (sshd, dockerd, systemd, kubelet, cron, a database or web server), or a script that walks the process list for one of those names and kills what it finds",
12683
+ values: ALL,
12684
+ defaultValue: "review",
12685
+ legacy: ["Node9: System Service Stopped"]
12686
+ },
12454
12687
  {
12455
12688
  id: "commands.dangerous-word",
12456
12689
  group: "commands",
@@ -13110,6 +13343,82 @@ var init_dist = __esm({
13110
13343
  )
13111
13344
  )
13112
13345
  }));
13346
+ INFRASTRUCTURE_SERVICES = [
13347
+ "init",
13348
+ "sshd",
13349
+ "dockerd",
13350
+ "docker-proxy",
13351
+ "containerd",
13352
+ "containerd-shim",
13353
+ "docker-containerd-shim",
13354
+ "runc",
13355
+ "systemd-journald",
13356
+ "journald",
13357
+ "systemd-logind",
13358
+ "systemd-udevd",
13359
+ "udevd",
13360
+ "dbus-daemon",
13361
+ "polkitd",
13362
+ "sssd",
13363
+ "kubelet",
13364
+ "kube-apiserver",
13365
+ "crond",
13366
+ "cron",
13367
+ "atd",
13368
+ "auditd",
13369
+ "rsyslogd",
13370
+ "syslogd",
13371
+ "chronyd",
13372
+ "ntpd",
13373
+ "NetworkManager",
13374
+ "wpa_supplicant",
13375
+ "dhclient",
13376
+ "avahi-daemon",
13377
+ "firewalld",
13378
+ "ufw",
13379
+ "cupsd",
13380
+ "snapd",
13381
+ "bluetoothd",
13382
+ "Xorg",
13383
+ "Xwayland",
13384
+ "gdm",
13385
+ "sddm",
13386
+ "lightdm"
13387
+ ];
13388
+ SERVER_SERVICES = [
13389
+ "nginx",
13390
+ "apache2",
13391
+ "httpd",
13392
+ "mysqld",
13393
+ "mariadbd",
13394
+ "postgres",
13395
+ "postgresql",
13396
+ "redis-server",
13397
+ "mongod"
13398
+ ];
13399
+ SYSTEM_SERVICES = [...INFRASTRUCTURE_SERVICES, ...SERVER_SERVICES];
13400
+ escape = (s) => s.replace(/[.*+?^${}()|[\]\\-]/g, "\\$&");
13401
+ SERVICE_WORD_RE = new RegExp(
13402
+ `(?:^|[^A-Za-z0-9_.-])(${SYSTEM_SERVICES.map(escape).join("|")})(?![A-Za-z0-9_.-])`,
13403
+ "i"
13404
+ );
13405
+ INIT_PATTERN_RE = /(?:["'*])init(?:["'*])/;
13406
+ UNIT_ALIASES = {
13407
+ docker: "dockerd",
13408
+ ssh: "sshd",
13409
+ mysql: "mysqld",
13410
+ mariadb: "mariadbd",
13411
+ redis: "redis-server",
13412
+ mongodb: "mongod",
13413
+ apache: "apache2",
13414
+ rsyslog: "rsyslogd",
13415
+ "systemd-networkd": "systemd-udevd",
13416
+ dbus: "dbus-daemon",
13417
+ avahi: "avahi-daemon",
13418
+ bluetooth: "bluetoothd",
13419
+ cups: "cupsd",
13420
+ chrony: "chronyd"
13421
+ };
13113
13422
  MAX_INLINE_CODE = 64 * 1024;
13114
13423
  WHAT = {
13115
13424
  deletes: "deletes files",
@@ -13121,7 +13430,15 @@ var init_dist = __esm({
13121
13430
  "builds-code": "runs code it builds at run time",
13122
13431
  permissions: "changes permissions or ownership",
13123
13432
  monitors: "captures the screen, the clipboard or the keyboard",
13124
- amplifies: "writes or sends in an endless loop"
13433
+ amplifies: "writes or sends in an endless loop",
13434
+ "kills-service": "stops a system service"
13435
+ };
13436
+ KILL_API = {
13437
+ python: /\bos\.kill(?:pg)?\s*\(|\.(?:kill|terminate)\s*\(|\bsignal\.SIGKILL\b/,
13438
+ node: /\bprocess\.kill\s*\(|\.kill\s*\(\s*['"`]?SIG/,
13439
+ perl: /\bkill\s+(?:-?\d+|['"]?[A-Z]+['"]?)\s*,/,
13440
+ ruby: /\bProcess\.kill\b/,
13441
+ php: /\bposix_kill\s*\(/
13125
13442
  };
13126
13443
  OUTSIDE = String.raw`(?:~|\.\.[\\/]|/(?!(?:tmp|var/tmp)/(?![^'"\n]*\.\.)|dev/(?:null|stdout|stderr)\b))`;
13127
13444
  pyImport = (mods) => new RegExp(String.raw`\b(?:import\s+(?:[\w.]+(?:\s+as\s+\w+)?\s*,\s*)*|from\s+)(?:${mods})\b`);
@@ -19012,6 +19329,7 @@ ${text}` : text);
19012
19329
  "commands.sql-no-where",
19013
19330
  "commands.temp-binary",
19014
19331
  "commands.disk-destroy",
19332
+ "commands.system-processes",
19015
19333
  "commands.dangerous-word",
19016
19334
  "commands.node9-disarm",
19017
19335
  "commands.reverse-shell",
@@ -19226,6 +19544,12 @@ ${text}` : text);
19226
19544
  const char = value[index] ?? "";
19227
19545
  return RUN_CHAR.test(char) || char !== "" && isInvisibleChar(char);
19228
19546
  };
19547
+ PRESCREEN_RE3 = /\b(?:kill|pkill|killall|systemctl|service|launchctl|xargs)\b/;
19548
+ KILL_SIGNAL_RE = /^-(?:\d+|s|SIG[A-Z]+|[A-Z]{2,})$/;
19549
+ SYSTEMCTL_STOP_VERBS = /* @__PURE__ */ new Set(["stop", "kill", "disable", "mask"]);
19550
+ LAUNCHCTL_UNLOAD_VERBS = /* @__PURE__ */ new Set(["unload", "bootout", "remove"]);
19551
+ LAUNCH_DAEMONS_RE = /(?:^|\/)(?:System\/)?Library\/LaunchDaemons\//;
19552
+ MAX_PAYLOAD_DEPTH5 = 3;
19229
19553
  RULE_NAME2 = "review-node9-disarm";
19230
19554
  DESCRIPTION = "The AI wants to stop node9, remove it, or change its own files. These are your commands to run, not the agent's: with the daemon stopped the outside-content and taint checks are off.";
19231
19555
  DAEMON_CMDLINES = [
package/dist/scan-ink.mjs CHANGED
@@ -2192,6 +2192,11 @@ var CHECK_TEXT = {
2192
2192
  example: "/tmp/build-helper --serve",
2193
2193
  advice: "Keep Review. Malware often runs from /tmp."
2194
2194
  },
2195
+ "commands.system-processes": {
2196
+ plain: "The agent stops or kills a system service: sshd, dockerd, containerd, systemd, kubelet, cron, the firewall, the display server, or a database or web server (nginx, apache, mysql, postgres, redis, mongo). Directly (pkill sshd, systemctl stop docker, kill of pid 1) or through the process list (a script that finds the processes of a name and kills them). Killing a process by its number, pkill node, killall python and systemctl restart are not this check.",
2197
+ example: "ps -eo pid,cmd | grep sshd | awk '{print $1}' | xargs kill -9",
2198
+ advice: "Keep Review: a stopped service takes other people and programs down with it. Set Log on a machine where agents manage local servers all day."
2199
+ },
2195
2200
  "commands.disk-destroy": {
2196
2201
  plain: "The agent formats, overwrites or securely erases a disk or file.",
2197
2202
  example: "dd if=/dev/zero of=/dev/sda",
@@ -2654,6 +2659,16 @@ var PRODUCT_CHECKS = [
2654
2659
  defaultValue: "review",
2655
2660
  legacy: ["Manual Nuclear Protection"]
2656
2661
  },
2662
+ {
2663
+ id: "commands.system-processes",
2664
+ group: "commands",
2665
+ owasp: "ASI02",
2666
+ title: "Stops a system service",
2667
+ catches: "kill, pkill, killall, systemctl stop or kill, service stop or launchctl unload aimed at a system service (sshd, dockerd, systemd, kubelet, cron, a database or web server), or a script that walks the process list for one of those names and kills what it finds",
2668
+ values: ALL,
2669
+ defaultValue: "review",
2670
+ legacy: ["Node9: System Service Stopped"]
2671
+ },
2657
2672
  {
2658
2673
  id: "commands.dangerous-word",
2659
2674
  group: "commands",
@@ -3282,6 +3297,65 @@ var ops = lazy(() => ({
3282
3297
  )
3283
3298
  )
3284
3299
  }));
3300
+ var INFRASTRUCTURE_SERVICES = [
3301
+ "init",
3302
+ "sshd",
3303
+ "dockerd",
3304
+ "docker-proxy",
3305
+ "containerd",
3306
+ "containerd-shim",
3307
+ "docker-containerd-shim",
3308
+ "runc",
3309
+ "systemd-journald",
3310
+ "journald",
3311
+ "systemd-logind",
3312
+ "systemd-udevd",
3313
+ "udevd",
3314
+ "dbus-daemon",
3315
+ "polkitd",
3316
+ "sssd",
3317
+ "kubelet",
3318
+ "kube-apiserver",
3319
+ "crond",
3320
+ "cron",
3321
+ "atd",
3322
+ "auditd",
3323
+ "rsyslogd",
3324
+ "syslogd",
3325
+ "chronyd",
3326
+ "ntpd",
3327
+ "NetworkManager",
3328
+ "wpa_supplicant",
3329
+ "dhclient",
3330
+ "avahi-daemon",
3331
+ "firewalld",
3332
+ "ufw",
3333
+ "cupsd",
3334
+ "snapd",
3335
+ "bluetoothd",
3336
+ "Xorg",
3337
+ "Xwayland",
3338
+ "gdm",
3339
+ "sddm",
3340
+ "lightdm"
3341
+ ];
3342
+ var SERVER_SERVICES = [
3343
+ "nginx",
3344
+ "apache2",
3345
+ "httpd",
3346
+ "mysqld",
3347
+ "mariadbd",
3348
+ "postgres",
3349
+ "postgresql",
3350
+ "redis-server",
3351
+ "mongod"
3352
+ ];
3353
+ var SYSTEM_SERVICES = [...INFRASTRUCTURE_SERVICES, ...SERVER_SERVICES];
3354
+ var escape = (s) => s.replace(/[.*+?^${}()|[\]\\-]/g, "\\$&");
3355
+ var SERVICE_WORD_RE = new RegExp(
3356
+ `(?:^|[^A-Za-z0-9_.-])(${SYSTEM_SERVICES.map(escape).join("|")})(?![A-Za-z0-9_.-])`,
3357
+ "i"
3358
+ );
3285
3359
  var MAX_INLINE_CODE = 64 * 1024;
3286
3360
  var OUTSIDE = String.raw`(?:~|\.\.[\\/]|/(?!(?:tmp|var/tmp)/(?![^'"\n]*\.\.)|dev/(?:null|stdout|stderr)\b))`;
3287
3361
  var pyImport = (mods) => new RegExp(String.raw`\b(?:import\s+(?:[\w.]+(?:\s+as\s+\w+)?\s*,\s*)*|from\s+)(?:${mods})\b`);
@@ -7475,6 +7549,7 @@ var MAP_GOVERNED = /* @__PURE__ */ new Set([
7475
7549
  "commands.sql-no-where",
7476
7550
  "commands.temp-binary",
7477
7551
  "commands.disk-destroy",
7552
+ "commands.system-processes",
7478
7553
  "commands.dangerous-word",
7479
7554
  "commands.node9-disarm",
7480
7555
  "commands.reverse-shell",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node9/proxy",
3
- "version": "2.54.0",
3
+ "version": "2.55.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",