@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/cli-main.js CHANGED
@@ -976,12 +976,46 @@ function wordValues(word, state) {
976
976
  if (!dynamic) return out.map(asWord);
977
977
  return out.filter((piece) => piece.value !== "").map((piece) => ({ value: piece.value, pattern: piece.pattern + "*", dynamic: true }));
978
978
  }
979
+ function sedSubstitutions(script) {
980
+ const out = [];
981
+ for (const raw of script.split(/\r?\n|;/)) {
982
+ const cmd = raw.trim();
983
+ if (cmd === "") continue;
984
+ const m = /^(?:(?:\d+|\$|\/(?:\\.|[^\\/])*\/)(?:,(?:\d+|\$|\/(?:\\.|[^\\/])*\/))?)?s(.)/.exec(
985
+ cmd
986
+ );
987
+ if (!m) return null;
988
+ const delimiter = m[1];
989
+ if (delimiter === "\\") return null;
990
+ const parts = [];
991
+ let cur = "";
992
+ let i = m[0].length;
993
+ for (; i < cmd.length && parts.length < 2; i++) {
994
+ const ch = cmd[i];
995
+ if (ch === "\\" && i + 1 < cmd.length) {
996
+ cur += ch + cmd[++i];
997
+ continue;
998
+ }
999
+ if (ch === delimiter) {
1000
+ parts.push(cur);
1001
+ cur = "";
1002
+ continue;
1003
+ }
1004
+ cur += ch;
1005
+ }
1006
+ if (parts.length < 2) return null;
1007
+ if (!/^[gpiImM0-9]*$/.test(cmd.slice(i))) return null;
1008
+ out.push(parts[1].replace(/\\(.)/g, "$1"));
1009
+ }
1010
+ return out.length > 0 ? out : null;
1011
+ }
979
1012
  function collectShellFileAccesses(command, context = {}) {
980
1013
  const out = [];
981
1014
  let payloads = 256;
982
1015
  const functions = /* @__PURE__ */ new Map();
983
1016
  const seenCalls = /* @__PURE__ */ new Set();
984
1017
  const pipedStdin = /* @__PURE__ */ new WeakMap();
1018
+ let currentStdin = null;
985
1019
  let callWalks2 = MAX_CALL_WALKS;
986
1020
  const initial = {
987
1021
  cwd: [context.cwd ?? ""],
@@ -1076,8 +1110,9 @@ function collectShellFileAccesses(command, context = {}) {
1076
1110
  }
1077
1111
  const locate = (p) => tokens.find((w) => w?.value === p) ?? { value: p };
1078
1112
  if (name === "sed") {
1079
- let inplace = false, hasScript = false, ended = false;
1113
+ let inplace = false, hasScript = false, ended = false, scriptUnknown = false;
1080
1114
  const files = [];
1115
+ const scriptParts = [];
1081
1116
  for (let i = 0; i < args.length; i++) {
1082
1117
  const token = args[i];
1083
1118
  if (!token) {
@@ -1095,7 +1130,11 @@ function collectShellFileAccesses(command, context = {}) {
1095
1130
  hasScript = true;
1096
1131
  const eq = value.indexOf("=");
1097
1132
  const script = eq < 0 ? args[++i] : { value: value.slice(eq + 1) };
1098
- if (value.startsWith("--file") && script) add("read", script, state);
1133
+ if (value.startsWith("--file")) {
1134
+ scriptUnknown = true;
1135
+ if (script) add("read", script, state);
1136
+ } else if (script?.value) scriptParts.push(script.value);
1137
+ else scriptUnknown = true;
1099
1138
  }
1100
1139
  continue;
1101
1140
  }
@@ -1110,7 +1149,11 @@ function collectShellFileAccesses(command, context = {}) {
1110
1149
  if (flag === "e" || flag === "f") {
1111
1150
  hasScript = true;
1112
1151
  const script = value.slice(j + 1) ? { value: value.slice(j + 1) } : args[++i];
1113
- if (flag === "f" && script) add("read", script, state);
1152
+ if (flag === "f") {
1153
+ scriptUnknown = true;
1154
+ if (script) add("read", script, state);
1155
+ } else if (script?.value) scriptParts.push(script.value);
1156
+ else scriptUnknown = true;
1114
1157
  break;
1115
1158
  }
1116
1159
  if (flag === "l") {
@@ -1120,10 +1163,14 @@ function collectShellFileAccesses(command, context = {}) {
1120
1163
  }
1121
1164
  continue;
1122
1165
  }
1123
- if (!hasScript) hasScript = true;
1124
- else files.push(token);
1166
+ if (!hasScript) {
1167
+ hasScript = true;
1168
+ scriptParts.push(value);
1169
+ } else files.push(token);
1125
1170
  }
1126
- for (const file2 of files) add(inplace ? "write" : "read", file2, state);
1171
+ const edits = inplace && !scriptUnknown ? sedSubstitutions(scriptParts.join("\n")) : null;
1172
+ for (const file2 of files)
1173
+ add(inplace ? "write" : "read", file2, state, edits ? { edits } : {});
1127
1174
  return;
1128
1175
  }
1129
1176
  if (FS_READ_TOOLS.has(name) && name !== "dd") {
@@ -1250,9 +1297,11 @@ function collectShellFileAccesses(command, context = {}) {
1250
1297
  continue;
1251
1298
  const remove = name === "rm" || name === "unlink";
1252
1299
  const append = name === "tee" && strings.some((s) => s === "--append" || /^-[^-]*a/.test(s));
1300
+ const teed = name === "tee" && !append ? currentStdin : null;
1253
1301
  add(remove ? "remove" : name === "touch" ? "create" : "write", token, state, {
1254
1302
  recursive: remove && strings.some((s) => /^-[^-]*[rR]/.test(s) || s === "--recursive"),
1255
- ...append ? { append: true } : {}
1303
+ ...append ? { append: true } : {},
1304
+ ...teed !== null ? { text: teed } : {}
1256
1305
  });
1257
1306
  }
1258
1307
  return;
@@ -1574,11 +1623,18 @@ function collectShellFileAccesses(command, context = {}) {
1574
1623
  if (stmt.Background) state = clone(state);
1575
1624
  const headWord = stmt.Cmd && stmt.Cmd.kind === "CallExpr" ? base(resolveWordLiteral(stmt.Cmd.Args?.[0])) : "";
1576
1625
  const sends = SENDING_STDIN.has(headWord);
1626
+ let produced;
1577
1627
  for (const redir of stmt.Redirs ?? []) {
1578
1628
  substitutions2(redir.Word, state, depth);
1579
1629
  for (const word of wordValues(redir.Word, state)) {
1580
- if (ops().WRITES.has(redir.Op))
1581
- add("write", word, state, ops().APPENDS.has(redir.Op) ? { append: true } : {});
1630
+ if (ops().WRITES.has(redir.Op)) {
1631
+ if (ops().APPENDS.has(redir.Op)) add("write", word, state, { append: true });
1632
+ else {
1633
+ const stdout = redir.N == null || redir.N.Value === "1";
1634
+ if (stdout && produced === void 0) produced = producedText(stmt);
1635
+ add("write", word, state, stdout && produced ? { text: produced } : {});
1636
+ }
1637
+ }
1582
1638
  if (ops().READS.has(redir.Op)) add("read", word, state, sends ? { upload: true } : {});
1583
1639
  if (redir.Op === ops().DUP_OUT && word.value && !/^\d+$/.test(word.value))
1584
1640
  add("write", word, state);
@@ -1590,6 +1646,7 @@ function collectShellFileAccesses(command, context = {}) {
1590
1646
  stdinScript(stmt, state, depth);
1591
1647
  const fedText = stdinText(stmt);
1592
1648
  if (fedText !== null) nestedPayload(xargsPayload(stmt, fedText), clone(state), depth);
1649
+ currentStdin = fedText;
1593
1650
  switch (cmd.kind) {
1594
1651
  case "CallExpr":
1595
1652
  call(cmd, state, depth);
@@ -1703,6 +1760,26 @@ function collectShellFileAccesses(command, context = {}) {
1703
1760
  }
1704
1761
  return out;
1705
1762
  }
1763
+ function serviceNamedIn(text) {
1764
+ const re = new RegExp(SERVICE_WORD_RE.source, "gi");
1765
+ for (let m = re.exec(text); m; m = re.exec(text)) {
1766
+ const lower2 = m[1].toLowerCase();
1767
+ if (lower2 === "init" && !INIT_PATTERN_RE.test(text)) continue;
1768
+ return SYSTEM_SERVICES.find((s) => s.toLowerCase() === lower2) ?? m[1];
1769
+ }
1770
+ return null;
1771
+ }
1772
+ function serviceOf(name) {
1773
+ const leaf = name.replace(/^.*[\\/]/, "").replace(/\.service$/, "").replace(/@.*$/, "");
1774
+ const lower2 = leaf.toLowerCase();
1775
+ return SYSTEM_SERVICES.find((s) => s.toLowerCase() === lower2) ?? UNIT_ALIASES[lower2] ?? null;
1776
+ }
1777
+ function killsService(language, code2) {
1778
+ const api = KILL_API[language].exec(code2);
1779
+ if (!api) return null;
1780
+ const service = serviceNamedIn(code2);
1781
+ return service ? `${api[0].trim()} with ${service}` : null;
1782
+ }
1706
1783
  function inlineLanguageOf(interp) {
1707
1784
  const i = interp.toLowerCase();
1708
1785
  if (/^python[\d.]*$/.test(i)) return "python";
@@ -1777,6 +1854,15 @@ function judgeInlineCode(language, code2, isProtected) {
1777
1854
  return { outcome: "unreadable", what: "is too long for node9 to read" };
1778
1855
  }
1779
1856
  const text = language === "python" ? resolvePythonAliases(code2) : code2;
1857
+ const killed = killsService(language, text);
1858
+ if (killed) {
1859
+ return {
1860
+ outcome: "dangerous",
1861
+ what: WHAT["kills-service"],
1862
+ evidence: killed.slice(0, 60),
1863
+ category: "kills-service"
1864
+ };
1865
+ }
1780
1866
  for (const [category, re] of TABLES[language]) {
1781
1867
  const m = re.exec(text);
1782
1868
  if (!m) continue;
@@ -6717,8 +6803,16 @@ function evaluateGitHooksFileAccess(args, accesses, context, settings, shell) {
6717
6803
  disarms = true;
6718
6804
  how = "removed";
6719
6805
  } else if (texts === null) {
6720
- disarms = true;
6721
- how = "overwritten";
6806
+ if (access.edits) {
6807
+ disarms = access.edits.some(editDisarms);
6808
+ how = "edited to exit";
6809
+ } else if (access.text !== void 0) {
6810
+ disarms = hookTextRunsNothing(access.text);
6811
+ how = "emptied";
6812
+ } else {
6813
+ disarms = true;
6814
+ how = "overwritten";
6815
+ }
6722
6816
  } else if (texts.whole.length > 0) {
6723
6817
  disarms = texts.whole.some(hookTextRunsNothing);
6724
6818
  how = "emptied";
@@ -8595,6 +8689,118 @@ function scanArgumentSecrets(args) {
8595
8689
  severity: "review"
8596
8690
  } : null;
8597
8691
  }
8692
+ function shownOf2(words) {
8693
+ return words.map((w) => w ?? "$?").join(" ").slice(0, 80);
8694
+ }
8695
+ function withoutComments(command) {
8696
+ return command.split("\n").map((line) => {
8697
+ for (let i = 0; i < line.length; i++) {
8698
+ if (line[i] === "#" && (i === 0 || line[i - 1] === " " || line[i - 1] === " ")) {
8699
+ return line.slice(0, i);
8700
+ }
8701
+ }
8702
+ return line;
8703
+ }).join("\n");
8704
+ }
8705
+ function detectSystemProcessStop(command, depth = 0) {
8706
+ if (!PRESCREEN_RE3.test(command)) return null;
8707
+ const named = serviceNamedIn(withoutComments(command));
8708
+ let direct = null;
8709
+ let dynamicKill = null;
8710
+ walkCommandScope(command, (node) => {
8711
+ const n = node;
8712
+ if (direct || !n || n.kind !== "CallExpr") return true;
8713
+ const words = (n.Args || []).map((a) => resolveWordLiteral(a));
8714
+ if (words.length === 0) return true;
8715
+ if (baseWord(words[0]) === "xargs" && words.some((w) => w !== null && baseWord(w) === "kill")) {
8716
+ dynamicKill ??= shownOf2(words);
8717
+ return true;
8718
+ }
8719
+ if (depth < MAX_PAYLOAD_DEPTH5) {
8720
+ const payload = literalShellPayload(words, baseWord(words[0]));
8721
+ if (payload !== null) {
8722
+ const inner = detectSystemProcessStop(payload, depth + 1);
8723
+ if (inner) direct = inner;
8724
+ return true;
8725
+ }
8726
+ }
8727
+ const head = unwrapCommandHead(words);
8728
+ if (head >= words.length) return true;
8729
+ const name = baseWord(words[head]);
8730
+ const rest = words.slice(head + 1);
8731
+ const shown = shownOf2(words);
8732
+ const viaXargs = words.slice(0, head).some((w) => w !== null && baseWord(w) === "xargs");
8733
+ if (name === "kill") {
8734
+ const targets = [];
8735
+ for (let i = 0; i < rest.length; i++) {
8736
+ const w = rest[i];
8737
+ if (i === 0 && w !== null && KILL_SIGNAL_RE.test(w)) {
8738
+ if (w === "-s") i++;
8739
+ continue;
8740
+ }
8741
+ if (w === "--") continue;
8742
+ targets.push(w);
8743
+ }
8744
+ if (targets.some((t) => t === "1" || t === "-1")) {
8745
+ direct = { service: "init (pid 1)", how: "kills", shown };
8746
+ } else if (viaXargs || targets.some((t) => t === null)) {
8747
+ dynamicKill ??= shown;
8748
+ }
8749
+ return true;
8750
+ }
8751
+ if (name === "pkill" || name === "killall") {
8752
+ let skipValue = false;
8753
+ for (const w of rest) {
8754
+ if (skipValue) {
8755
+ skipValue = false;
8756
+ continue;
8757
+ }
8758
+ if (w !== null && w.startsWith("-")) {
8759
+ if (/^-(?:u|U|g|G|t|P|s|n|o|r|q|-signal|-uid|-user)$/.test(w)) skipValue = true;
8760
+ continue;
8761
+ }
8762
+ if (w === null) {
8763
+ dynamicKill ??= shown;
8764
+ continue;
8765
+ }
8766
+ const service = serviceOf(w) ?? serviceNamedIn(w);
8767
+ if (service) direct = { service, how: "kills", shown };
8768
+ }
8769
+ return true;
8770
+ }
8771
+ if (name === "systemctl") {
8772
+ if (rest.includes("--user")) return true;
8773
+ const verb = rest.find((w) => w !== null && !w.startsWith("-"));
8774
+ if (verb === void 0 || verb === null || !SYSTEMCTL_STOP_VERBS.has(verb)) return true;
8775
+ for (const w of rest.slice(rest.indexOf(verb) + 1)) {
8776
+ const service = w === null ? null : serviceOf(w);
8777
+ if (service) direct = { service, how: verb === "kill" ? "kills" : "stops", shown };
8778
+ }
8779
+ return true;
8780
+ }
8781
+ if (name === "service") {
8782
+ const [unit, verb] = rest;
8783
+ const service = typeof unit === "string" ? serviceOf(unit) : null;
8784
+ if (service && verb === "stop") direct = { service, how: "stops", shown };
8785
+ return true;
8786
+ }
8787
+ if (name === "launchctl") {
8788
+ const verb = rest.find((w) => w !== null && !w.startsWith("-"));
8789
+ if (verb === void 0 || verb === null || !LAUNCHCTL_UNLOAD_VERBS.has(verb)) return true;
8790
+ const daemon = rest.find((w) => w !== null && LAUNCH_DAEMONS_RE.test(w));
8791
+ if (daemon) {
8792
+ direct = { service: daemon.replace(/^.*\//, ""), how: "unloads the system daemon", shown };
8793
+ }
8794
+ return true;
8795
+ }
8796
+ return true;
8797
+ });
8798
+ if (direct) return direct;
8799
+ if (dynamicKill !== null && named) {
8800
+ return { service: named, how: "kills the processes of", shown: dynamicKill };
8801
+ }
8802
+ return null;
8803
+ }
8598
8804
  function patternSelects(pattern, targets) {
8599
8805
  const pieces = pattern.toLowerCase().split(/[\\^$.*+?()[\]{}|]+/).filter(Boolean);
8600
8806
  if (pieces.length === 0) return false;
@@ -9214,6 +9420,17 @@ async function evaluatePolicyCore(config, toolName, args, context = {}, hooks =
9214
9420
  checkId: "commands.eval-dynamic"
9215
9421
  });
9216
9422
  }
9423
+ const stopped = detectSystemProcessStop(shellCommand);
9424
+ if (stopped) {
9425
+ consider("commands.system-processes", {
9426
+ decision: "review",
9427
+ blockedByLabel: "Node9: System Service Stopped",
9428
+ reason: `The AI ${stopped.how} ${stopped.service}: ${stopped.shown}`,
9429
+ 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.",
9430
+ tier: 3,
9431
+ checkId: "commands.system-processes"
9432
+ });
9433
+ }
9217
9434
  const builtin = strictestVerdict(candidates2);
9218
9435
  if (builtin) return builtin;
9219
9436
  {
@@ -10339,7 +10556,8 @@ function classifyRuleSeverity(name, verdict) {
10339
10556
  "rebase",
10340
10557
  "delete-branch",
10341
10558
  "delete-remote",
10342
- "unknown-registry"
10559
+ "unknown-registry",
10560
+ "system-processes"
10343
10561
  ];
10344
10562
  if (highPatterns.some((p) => n.includes(p))) return "high";
10345
10563
  if (verdict === "block") return "high";
@@ -10379,6 +10597,7 @@ function narrativeRuleLabel(name) {
10379
10597
  "reverse-shell": "reverse shell",
10380
10598
  "env-exfil": "environment sent out",
10381
10599
  "unknown-registry": "install from an unknown registry",
10600
+ "system-processes": "system service stopped",
10382
10601
  "agent-file-write": "agent instruction file written",
10383
10602
  "agent-file-content": "instruction written into an agent file",
10384
10603
  "agent-hooks-change": "agent hooks changed",
@@ -10979,7 +11198,7 @@ function* stringLeavesWithKeys(obj, depth = 0, key) {
10979
11198
  }
10980
11199
  for (const [k, v] of Object.entries(obj)) yield* stringLeavesWithKeys(v, depth + 1, k);
10981
11200
  }
10982
- var import_url, import_picomatch, import_safe_regex2, import_picomatch2, import_module, import_picomatch3, import_safe_regex22, import_crypto2, import_crypto3, import_crypto4, import_crypto5, 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, REPLACED_SHIELDS, 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, POSTURE_CATEGORY_OWASP, VERDICTS, CHECK_VERDICT_RANK, CHECK_GROUPS, 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, DLP_SCAN_LIMITS, BATCH_SEPARATOR, ENCODED_RUN_RE, 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, CONTROL_CHAR_RE, SHIELD_RULE, ACTION_RULE, LOOP_MAX_RECORDS, FINDING_TO_SIGNAL, SCAN_SIGNAL_WEIGHTS, LOOP_THRESHOLD_FOR_WASTE, MAX_BLAST_PATH, DESTRUCTIVE_OP_RE, SENSITIVE_PATH_RE, FILE_TOOLS, 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, CANONICAL_EXTRACTOR_VERSION, DEDUPE_PREVIEW_LEN, ENGINE_VERSION;
11201
+ var import_url, import_picomatch, import_safe_regex2, import_picomatch2, import_module, import_picomatch3, import_safe_regex22, import_crypto2, import_crypto3, import_crypto4, import_crypto5, 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, REPLACED_SHIELDS, 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, POSTURE_CATEGORY_OWASP, VERDICTS, CHECK_VERDICT_RANK, CHECK_GROUPS, 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, DLP_SCAN_LIMITS, BATCH_SEPARATOR, ENCODED_RUN_RE, 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, CONTROL_CHAR_RE, SHIELD_RULE, ACTION_RULE, LOOP_MAX_RECORDS, FINDING_TO_SIGNAL, SCAN_SIGNAL_WEIGHTS, LOOP_THRESHOLD_FOR_WASTE, MAX_BLAST_PATH, DESTRUCTIVE_OP_RE, SENSITIVE_PATH_RE, FILE_TOOLS, 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, CANONICAL_EXTRACTOR_VERSION, DEDUPE_PREVIEW_LEN, ENGINE_VERSION;
10983
11202
  var init_dist = __esm({
10984
11203
  "packages/policy-engine/dist/index.mjs"() {
10985
11204
  "use strict";
@@ -12872,6 +13091,11 @@ var init_dist = __esm({
12872
13091
  example: "/tmp/build-helper --serve",
12873
13092
  advice: "Keep Review. Malware often runs from /tmp."
12874
13093
  },
13094
+ "commands.system-processes": {
13095
+ 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.",
13096
+ example: "ps -eo pid,cmd | grep sshd | awk '{print $1}' | xargs kill -9",
13097
+ 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."
13098
+ },
12875
13099
  "commands.disk-destroy": {
12876
13100
  plain: "The agent formats, overwrites or securely erases a disk or file.",
12877
13101
  example: "dd if=/dev/zero of=/dev/sda",
@@ -13041,6 +13265,7 @@ var init_dist = __esm({
13041
13265
  "commands.sql-no-where": "log",
13042
13266
  "commands.temp-binary": "log",
13043
13267
  "commands.disk-destroy": "log",
13268
+ "commands.system-processes": "log",
13044
13269
  "commands.dangerous-word": "log",
13045
13270
  "files.system-dirs": "log",
13046
13271
  "files.shell-startup": "log",
@@ -13388,6 +13613,16 @@ var init_dist = __esm({
13388
13613
  defaultValue: "review",
13389
13614
  legacy: ["Manual Nuclear Protection"]
13390
13615
  },
13616
+ {
13617
+ id: "commands.system-processes",
13618
+ group: "commands",
13619
+ owasp: "ASI02",
13620
+ title: "Stops a system service",
13621
+ 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",
13622
+ values: ALL,
13623
+ defaultValue: "review",
13624
+ legacy: ["Node9: System Service Stopped"]
13625
+ },
13391
13626
  {
13392
13627
  id: "commands.dangerous-word",
13393
13628
  group: "commands",
@@ -14047,6 +14282,82 @@ var init_dist = __esm({
14047
14282
  )
14048
14283
  )
14049
14284
  }));
14285
+ INFRASTRUCTURE_SERVICES = [
14286
+ "init",
14287
+ "sshd",
14288
+ "dockerd",
14289
+ "docker-proxy",
14290
+ "containerd",
14291
+ "containerd-shim",
14292
+ "docker-containerd-shim",
14293
+ "runc",
14294
+ "systemd-journald",
14295
+ "journald",
14296
+ "systemd-logind",
14297
+ "systemd-udevd",
14298
+ "udevd",
14299
+ "dbus-daemon",
14300
+ "polkitd",
14301
+ "sssd",
14302
+ "kubelet",
14303
+ "kube-apiserver",
14304
+ "crond",
14305
+ "cron",
14306
+ "atd",
14307
+ "auditd",
14308
+ "rsyslogd",
14309
+ "syslogd",
14310
+ "chronyd",
14311
+ "ntpd",
14312
+ "NetworkManager",
14313
+ "wpa_supplicant",
14314
+ "dhclient",
14315
+ "avahi-daemon",
14316
+ "firewalld",
14317
+ "ufw",
14318
+ "cupsd",
14319
+ "snapd",
14320
+ "bluetoothd",
14321
+ "Xorg",
14322
+ "Xwayland",
14323
+ "gdm",
14324
+ "sddm",
14325
+ "lightdm"
14326
+ ];
14327
+ SERVER_SERVICES = [
14328
+ "nginx",
14329
+ "apache2",
14330
+ "httpd",
14331
+ "mysqld",
14332
+ "mariadbd",
14333
+ "postgres",
14334
+ "postgresql",
14335
+ "redis-server",
14336
+ "mongod"
14337
+ ];
14338
+ SYSTEM_SERVICES = [...INFRASTRUCTURE_SERVICES, ...SERVER_SERVICES];
14339
+ escape = (s) => s.replace(/[.*+?^${}()|[\]\\-]/g, "\\$&");
14340
+ SERVICE_WORD_RE = new RegExp(
14341
+ `(?:^|[^A-Za-z0-9_.-])(${SYSTEM_SERVICES.map(escape).join("|")})(?![A-Za-z0-9_.-])`,
14342
+ "i"
14343
+ );
14344
+ INIT_PATTERN_RE = /(?:["'*])init(?:["'*])/;
14345
+ UNIT_ALIASES = {
14346
+ docker: "dockerd",
14347
+ ssh: "sshd",
14348
+ mysql: "mysqld",
14349
+ mariadb: "mariadbd",
14350
+ redis: "redis-server",
14351
+ mongodb: "mongod",
14352
+ apache: "apache2",
14353
+ rsyslog: "rsyslogd",
14354
+ "systemd-networkd": "systemd-udevd",
14355
+ dbus: "dbus-daemon",
14356
+ avahi: "avahi-daemon",
14357
+ bluetooth: "bluetoothd",
14358
+ cups: "cupsd",
14359
+ chrony: "chronyd"
14360
+ };
14050
14361
  MAX_INLINE_CODE = 64 * 1024;
14051
14362
  WHAT = {
14052
14363
  deletes: "deletes files",
@@ -14058,7 +14369,15 @@ var init_dist = __esm({
14058
14369
  "builds-code": "runs code it builds at run time",
14059
14370
  permissions: "changes permissions or ownership",
14060
14371
  monitors: "captures the screen, the clipboard or the keyboard",
14061
- amplifies: "writes or sends in an endless loop"
14372
+ amplifies: "writes or sends in an endless loop",
14373
+ "kills-service": "stops a system service"
14374
+ };
14375
+ KILL_API = {
14376
+ python: /\bos\.kill(?:pg)?\s*\(|\.(?:kill|terminate)\s*\(|\bsignal\.SIGKILL\b/,
14377
+ node: /\bprocess\.kill\s*\(|\.kill\s*\(\s*['"`]?SIG/,
14378
+ perl: /\bkill\s+(?:-?\d+|['"]?[A-Z]+['"]?)\s*,/,
14379
+ ruby: /\bProcess\.kill\b/,
14380
+ php: /\bposix_kill\s*\(/
14062
14381
  };
14063
14382
  OUTSIDE = String.raw`(?:~|\.\.[\\/]|/(?!(?:tmp|var/tmp)/(?![^'"\n]*\.\.)|dev/(?:null|stdout|stderr)\b))`;
14064
14383
  pyImport = (mods) => new RegExp(String.raw`\b(?:import\s+(?:[\w.]+(?:\s+as\s+\w+)?\s*,\s*)*|from\s+)(?:${mods})\b`);
@@ -19957,6 +20276,7 @@ ${text}` : text);
19957
20276
  "commands.sql-no-where",
19958
20277
  "commands.temp-binary",
19959
20278
  "commands.disk-destroy",
20279
+ "commands.system-processes",
19960
20280
  "commands.dangerous-word",
19961
20281
  "commands.node9-disarm",
19962
20282
  "commands.reverse-shell",
@@ -20171,6 +20491,12 @@ ${text}` : text);
20171
20491
  const char = value[index] ?? "";
20172
20492
  return RUN_CHAR.test(char) || char !== "" && isInvisibleChar(char);
20173
20493
  };
20494
+ PRESCREEN_RE3 = /\b(?:kill|pkill|killall|systemctl|service|launchctl|xargs)\b/;
20495
+ KILL_SIGNAL_RE = /^-(?:\d+|s|SIG[A-Z]+|[A-Z]{2,})$/;
20496
+ SYSTEMCTL_STOP_VERBS = /* @__PURE__ */ new Set(["stop", "kill", "disable", "mask"]);
20497
+ LAUNCHCTL_UNLOAD_VERBS = /* @__PURE__ */ new Set(["unload", "bootout", "remove"]);
20498
+ LAUNCH_DAEMONS_RE = /(?:^|\/)(?:System\/)?Library\/LaunchDaemons\//;
20499
+ MAX_PAYLOAD_DEPTH5 = 3;
20174
20500
  RULE_NAME2 = "review-node9-disarm";
20175
20501
  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.";
20176
20502
  DAEMON_CMDLINES = [