@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/hook.js CHANGED
@@ -903,12 +903,46 @@ function wordValues(word, state) {
903
903
  if (!dynamic) return out.map(asWord);
904
904
  return out.filter((piece) => piece.value !== "").map((piece) => ({ value: piece.value, pattern: piece.pattern + "*", dynamic: true }));
905
905
  }
906
+ function sedSubstitutions(script) {
907
+ const out = [];
908
+ for (const raw of script.split(/\r?\n|;/)) {
909
+ const cmd = raw.trim();
910
+ if (cmd === "") continue;
911
+ const m = /^(?:(?:\d+|\$|\/(?:\\.|[^\\/])*\/)(?:,(?:\d+|\$|\/(?:\\.|[^\\/])*\/))?)?s(.)/.exec(
912
+ cmd
913
+ );
914
+ if (!m) return null;
915
+ const delimiter = m[1];
916
+ if (delimiter === "\\") return null;
917
+ const parts = [];
918
+ let cur = "";
919
+ let i = m[0].length;
920
+ for (; i < cmd.length && parts.length < 2; i++) {
921
+ const ch = cmd[i];
922
+ if (ch === "\\" && i + 1 < cmd.length) {
923
+ cur += ch + cmd[++i];
924
+ continue;
925
+ }
926
+ if (ch === delimiter) {
927
+ parts.push(cur);
928
+ cur = "";
929
+ continue;
930
+ }
931
+ cur += ch;
932
+ }
933
+ if (parts.length < 2) return null;
934
+ if (!/^[gpiImM0-9]*$/.test(cmd.slice(i))) return null;
935
+ out.push(parts[1].replace(/\\(.)/g, "$1"));
936
+ }
937
+ return out.length > 0 ? out : null;
938
+ }
906
939
  function collectShellFileAccesses(command, context = {}) {
907
940
  const out = [];
908
941
  let payloads = 256;
909
942
  const functions = /* @__PURE__ */ new Map();
910
943
  const seenCalls = /* @__PURE__ */ new Set();
911
944
  const pipedStdin = /* @__PURE__ */ new WeakMap();
945
+ let currentStdin = null;
912
946
  let callWalks2 = MAX_CALL_WALKS;
913
947
  const initial = {
914
948
  cwd: [context.cwd ?? ""],
@@ -1003,8 +1037,9 @@ function collectShellFileAccesses(command, context = {}) {
1003
1037
  }
1004
1038
  const locate = (p) => tokens.find((w) => w?.value === p) ?? { value: p };
1005
1039
  if (name === "sed") {
1006
- let inplace = false, hasScript = false, ended = false;
1040
+ let inplace = false, hasScript = false, ended = false, scriptUnknown = false;
1007
1041
  const files = [];
1042
+ const scriptParts = [];
1008
1043
  for (let i = 0; i < args.length; i++) {
1009
1044
  const token = args[i];
1010
1045
  if (!token) {
@@ -1022,7 +1057,11 @@ function collectShellFileAccesses(command, context = {}) {
1022
1057
  hasScript = true;
1023
1058
  const eq = value.indexOf("=");
1024
1059
  const script = eq < 0 ? args[++i] : { value: value.slice(eq + 1) };
1025
- if (value.startsWith("--file") && script) add("read", script, state);
1060
+ if (value.startsWith("--file")) {
1061
+ scriptUnknown = true;
1062
+ if (script) add("read", script, state);
1063
+ } else if (script?.value) scriptParts.push(script.value);
1064
+ else scriptUnknown = true;
1026
1065
  }
1027
1066
  continue;
1028
1067
  }
@@ -1037,7 +1076,11 @@ function collectShellFileAccesses(command, context = {}) {
1037
1076
  if (flag === "e" || flag === "f") {
1038
1077
  hasScript = true;
1039
1078
  const script = value.slice(j + 1) ? { value: value.slice(j + 1) } : args[++i];
1040
- if (flag === "f" && script) add("read", script, state);
1079
+ if (flag === "f") {
1080
+ scriptUnknown = true;
1081
+ if (script) add("read", script, state);
1082
+ } else if (script?.value) scriptParts.push(script.value);
1083
+ else scriptUnknown = true;
1041
1084
  break;
1042
1085
  }
1043
1086
  if (flag === "l") {
@@ -1047,10 +1090,14 @@ function collectShellFileAccesses(command, context = {}) {
1047
1090
  }
1048
1091
  continue;
1049
1092
  }
1050
- if (!hasScript) hasScript = true;
1051
- else files.push(token);
1093
+ if (!hasScript) {
1094
+ hasScript = true;
1095
+ scriptParts.push(value);
1096
+ } else files.push(token);
1052
1097
  }
1053
- for (const file2 of files) add(inplace ? "write" : "read", file2, state);
1098
+ const edits = inplace && !scriptUnknown ? sedSubstitutions(scriptParts.join("\n")) : null;
1099
+ for (const file2 of files)
1100
+ add(inplace ? "write" : "read", file2, state, edits ? { edits } : {});
1054
1101
  return;
1055
1102
  }
1056
1103
  if (FS_READ_TOOLS.has(name) && name !== "dd") {
@@ -1177,9 +1224,11 @@ function collectShellFileAccesses(command, context = {}) {
1177
1224
  continue;
1178
1225
  const remove = name === "rm" || name === "unlink";
1179
1226
  const append = name === "tee" && strings.some((s) => s === "--append" || /^-[^-]*a/.test(s));
1227
+ const teed = name === "tee" && !append ? currentStdin : null;
1180
1228
  add(remove ? "remove" : name === "touch" ? "create" : "write", token, state, {
1181
1229
  recursive: remove && strings.some((s) => /^-[^-]*[rR]/.test(s) || s === "--recursive"),
1182
- ...append ? { append: true } : {}
1230
+ ...append ? { append: true } : {},
1231
+ ...teed !== null ? { text: teed } : {}
1183
1232
  });
1184
1233
  }
1185
1234
  return;
@@ -1501,11 +1550,18 @@ function collectShellFileAccesses(command, context = {}) {
1501
1550
  if (stmt.Background) state = clone(state);
1502
1551
  const headWord = stmt.Cmd && stmt.Cmd.kind === "CallExpr" ? base(resolveWordLiteral(stmt.Cmd.Args?.[0])) : "";
1503
1552
  const sends = SENDING_STDIN.has(headWord);
1553
+ let produced;
1504
1554
  for (const redir of stmt.Redirs ?? []) {
1505
1555
  substitutions(redir.Word, state, depth);
1506
1556
  for (const word of wordValues(redir.Word, state)) {
1507
- if (ops().WRITES.has(redir.Op))
1508
- add("write", word, state, ops().APPENDS.has(redir.Op) ? { append: true } : {});
1557
+ if (ops().WRITES.has(redir.Op)) {
1558
+ if (ops().APPENDS.has(redir.Op)) add("write", word, state, { append: true });
1559
+ else {
1560
+ const stdout = redir.N == null || redir.N.Value === "1";
1561
+ if (stdout && produced === void 0) produced = producedText(stmt);
1562
+ add("write", word, state, stdout && produced ? { text: produced } : {});
1563
+ }
1564
+ }
1509
1565
  if (ops().READS.has(redir.Op)) add("read", word, state, sends ? { upload: true } : {});
1510
1566
  if (redir.Op === ops().DUP_OUT && word.value && !/^\d+$/.test(word.value))
1511
1567
  add("write", word, state);
@@ -1517,6 +1573,7 @@ function collectShellFileAccesses(command, context = {}) {
1517
1573
  stdinScript(stmt, state, depth);
1518
1574
  const fedText = stdinText(stmt);
1519
1575
  if (fedText !== null) nestedPayload(xargsPayload(stmt, fedText), clone(state), depth);
1576
+ currentStdin = fedText;
1520
1577
  switch (cmd.kind) {
1521
1578
  case "CallExpr":
1522
1579
  call(cmd, state, depth);
@@ -1630,6 +1687,26 @@ function collectShellFileAccesses(command, context = {}) {
1630
1687
  }
1631
1688
  return out;
1632
1689
  }
1690
+ function serviceNamedIn(text) {
1691
+ const re = new RegExp(SERVICE_WORD_RE.source, "gi");
1692
+ for (let m = re.exec(text); m; m = re.exec(text)) {
1693
+ const lower2 = m[1].toLowerCase();
1694
+ if (lower2 === "init" && !INIT_PATTERN_RE.test(text)) continue;
1695
+ return SYSTEM_SERVICES.find((s) => s.toLowerCase() === lower2) ?? m[1];
1696
+ }
1697
+ return null;
1698
+ }
1699
+ function serviceOf(name) {
1700
+ const leaf = name.replace(/^.*[\\/]/, "").replace(/\.service$/, "").replace(/@.*$/, "");
1701
+ const lower2 = leaf.toLowerCase();
1702
+ return SYSTEM_SERVICES.find((s) => s.toLowerCase() === lower2) ?? UNIT_ALIASES[lower2] ?? null;
1703
+ }
1704
+ function killsService(language, code) {
1705
+ const api = KILL_API[language].exec(code);
1706
+ if (!api) return null;
1707
+ const service = serviceNamedIn(code);
1708
+ return service ? `${api[0].trim()} with ${service}` : null;
1709
+ }
1633
1710
  function inlineLanguageOf(interp) {
1634
1711
  const i = interp.toLowerCase();
1635
1712
  if (/^python[\d.]*$/.test(i)) return "python";
@@ -1704,6 +1781,15 @@ function judgeInlineCode(language, code, isProtected) {
1704
1781
  return { outcome: "unreadable", what: "is too long for node9 to read" };
1705
1782
  }
1706
1783
  const text = language === "python" ? resolvePythonAliases(code) : code;
1784
+ const killed = killsService(language, text);
1785
+ if (killed) {
1786
+ return {
1787
+ outcome: "dangerous",
1788
+ what: WHAT["kills-service"],
1789
+ evidence: killed.slice(0, 60),
1790
+ category: "kills-service"
1791
+ };
1792
+ }
1707
1793
  for (const [category, re] of TABLES[language]) {
1708
1794
  const m = re.exec(text);
1709
1795
  if (!m) continue;
@@ -6644,8 +6730,16 @@ function evaluateGitHooksFileAccess(args, accesses, context, settings, shell) {
6644
6730
  disarms = true;
6645
6731
  how = "removed";
6646
6732
  } else if (texts === null) {
6647
- disarms = true;
6648
- how = "overwritten";
6733
+ if (access.edits) {
6734
+ disarms = access.edits.some(editDisarms);
6735
+ how = "edited to exit";
6736
+ } else if (access.text !== void 0) {
6737
+ disarms = hookTextRunsNothing(access.text);
6738
+ how = "emptied";
6739
+ } else {
6740
+ disarms = true;
6741
+ how = "overwritten";
6742
+ }
6649
6743
  } else if (texts.whole.length > 0) {
6650
6744
  disarms = texts.whole.some(hookTextRunsNothing);
6651
6745
  how = "emptied";
@@ -8477,6 +8571,118 @@ function scanArgumentSecrets(args) {
8477
8571
  severity: "review"
8478
8572
  } : null;
8479
8573
  }
8574
+ function shownOf2(words) {
8575
+ return words.map((w) => w ?? "$?").join(" ").slice(0, 80);
8576
+ }
8577
+ function withoutComments(command) {
8578
+ return command.split("\n").map((line) => {
8579
+ for (let i = 0; i < line.length; i++) {
8580
+ if (line[i] === "#" && (i === 0 || line[i - 1] === " " || line[i - 1] === " ")) {
8581
+ return line.slice(0, i);
8582
+ }
8583
+ }
8584
+ return line;
8585
+ }).join("\n");
8586
+ }
8587
+ function detectSystemProcessStop(command, depth = 0) {
8588
+ if (!PRESCREEN_RE3.test(command)) return null;
8589
+ const named = serviceNamedIn(withoutComments(command));
8590
+ let direct = null;
8591
+ let dynamicKill = null;
8592
+ walkCommandScope(command, (node) => {
8593
+ const n = node;
8594
+ if (direct || !n || n.kind !== "CallExpr") return true;
8595
+ const words = (n.Args || []).map((a) => resolveWordLiteral(a));
8596
+ if (words.length === 0) return true;
8597
+ if (baseWord(words[0]) === "xargs" && words.some((w) => w !== null && baseWord(w) === "kill")) {
8598
+ dynamicKill ??= shownOf2(words);
8599
+ return true;
8600
+ }
8601
+ if (depth < MAX_PAYLOAD_DEPTH5) {
8602
+ const payload = literalShellPayload(words, baseWord(words[0]));
8603
+ if (payload !== null) {
8604
+ const inner = detectSystemProcessStop(payload, depth + 1);
8605
+ if (inner) direct = inner;
8606
+ return true;
8607
+ }
8608
+ }
8609
+ const head = unwrapCommandHead(words);
8610
+ if (head >= words.length) return true;
8611
+ const name = baseWord(words[head]);
8612
+ const rest = words.slice(head + 1);
8613
+ const shown = shownOf2(words);
8614
+ const viaXargs = words.slice(0, head).some((w) => w !== null && baseWord(w) === "xargs");
8615
+ if (name === "kill") {
8616
+ const targets = [];
8617
+ for (let i = 0; i < rest.length; i++) {
8618
+ const w = rest[i];
8619
+ if (i === 0 && w !== null && KILL_SIGNAL_RE.test(w)) {
8620
+ if (w === "-s") i++;
8621
+ continue;
8622
+ }
8623
+ if (w === "--") continue;
8624
+ targets.push(w);
8625
+ }
8626
+ if (targets.some((t) => t === "1" || t === "-1")) {
8627
+ direct = { service: "init (pid 1)", how: "kills", shown };
8628
+ } else if (viaXargs || targets.some((t) => t === null)) {
8629
+ dynamicKill ??= shown;
8630
+ }
8631
+ return true;
8632
+ }
8633
+ if (name === "pkill" || name === "killall") {
8634
+ let skipValue = false;
8635
+ for (const w of rest) {
8636
+ if (skipValue) {
8637
+ skipValue = false;
8638
+ continue;
8639
+ }
8640
+ if (w !== null && w.startsWith("-")) {
8641
+ if (/^-(?:u|U|g|G|t|P|s|n|o|r|q|-signal|-uid|-user)$/.test(w)) skipValue = true;
8642
+ continue;
8643
+ }
8644
+ if (w === null) {
8645
+ dynamicKill ??= shown;
8646
+ continue;
8647
+ }
8648
+ const service = serviceOf(w) ?? serviceNamedIn(w);
8649
+ if (service) direct = { service, how: "kills", shown };
8650
+ }
8651
+ return true;
8652
+ }
8653
+ if (name === "systemctl") {
8654
+ if (rest.includes("--user")) return true;
8655
+ const verb = rest.find((w) => w !== null && !w.startsWith("-"));
8656
+ if (verb === void 0 || verb === null || !SYSTEMCTL_STOP_VERBS.has(verb)) return true;
8657
+ for (const w of rest.slice(rest.indexOf(verb) + 1)) {
8658
+ const service = w === null ? null : serviceOf(w);
8659
+ if (service) direct = { service, how: verb === "kill" ? "kills" : "stops", shown };
8660
+ }
8661
+ return true;
8662
+ }
8663
+ if (name === "service") {
8664
+ const [unit, verb] = rest;
8665
+ const service = typeof unit === "string" ? serviceOf(unit) : null;
8666
+ if (service && verb === "stop") direct = { service, how: "stops", shown };
8667
+ return true;
8668
+ }
8669
+ if (name === "launchctl") {
8670
+ const verb = rest.find((w) => w !== null && !w.startsWith("-"));
8671
+ if (verb === void 0 || verb === null || !LAUNCHCTL_UNLOAD_VERBS.has(verb)) return true;
8672
+ const daemon = rest.find((w) => w !== null && LAUNCH_DAEMONS_RE.test(w));
8673
+ if (daemon) {
8674
+ direct = { service: daemon.replace(/^.*\//, ""), how: "unloads the system daemon", shown };
8675
+ }
8676
+ return true;
8677
+ }
8678
+ return true;
8679
+ });
8680
+ if (direct) return direct;
8681
+ if (dynamicKill !== null && named) {
8682
+ return { service: named, how: "kills the processes of", shown: dynamicKill };
8683
+ }
8684
+ return null;
8685
+ }
8480
8686
  function patternSelects(pattern, targets) {
8481
8687
  const pieces = pattern.toLowerCase().split(/[\\^$.*+?()[\]{}|]+/).filter(Boolean);
8482
8688
  if (pieces.length === 0) return false;
@@ -9096,6 +9302,17 @@ async function evaluatePolicyCore(config, toolName, args, context = {}, hooks =
9096
9302
  checkId: "commands.eval-dynamic"
9097
9303
  });
9098
9304
  }
9305
+ const stopped = detectSystemProcessStop(shellCommand);
9306
+ if (stopped) {
9307
+ consider("commands.system-processes", {
9308
+ decision: "review",
9309
+ blockedByLabel: "Node9: System Service Stopped",
9310
+ reason: `The AI ${stopped.how} ${stopped.service}: ${stopped.shown}`,
9311
+ 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.",
9312
+ tier: 3,
9313
+ checkId: "commands.system-processes"
9314
+ });
9315
+ }
9099
9316
  const builtin = strictestVerdict(candidates);
9100
9317
  if (builtin) return builtin;
9101
9318
  {
@@ -10177,7 +10394,7 @@ function matchCanaryArgs(args, values) {
10177
10394
  return null;
10178
10395
  }
10179
10396
  }
10180
- var import_url, import_picomatch, import_safe_regex2, import_picomatch2, import_module, import_picomatch3, import_safe_regex22, import_crypto, import_crypto2, import_crypto3, import_crypto4, 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, 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, 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;
10397
+ var import_url, import_picomatch, import_safe_regex2, import_picomatch2, import_module, import_picomatch3, import_safe_regex22, import_crypto, import_crypto2, import_crypto3, import_crypto4, 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, 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, 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;
10181
10398
  var init_dist = __esm({
10182
10399
  "packages/policy-engine/dist/index.mjs"() {
10183
10400
  "use strict";
@@ -12063,6 +12280,11 @@ var init_dist = __esm({
12063
12280
  example: "/tmp/build-helper --serve",
12064
12281
  advice: "Keep Review. Malware often runs from /tmp."
12065
12282
  },
12283
+ "commands.system-processes": {
12284
+ 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.",
12285
+ example: "ps -eo pid,cmd | grep sshd | awk '{print $1}' | xargs kill -9",
12286
+ 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."
12287
+ },
12066
12288
  "commands.disk-destroy": {
12067
12289
  plain: "The agent formats, overwrites or securely erases a disk or file.",
12068
12290
  example: "dd if=/dev/zero of=/dev/sda",
@@ -12232,6 +12454,7 @@ var init_dist = __esm({
12232
12454
  "commands.sql-no-where": "log",
12233
12455
  "commands.temp-binary": "log",
12234
12456
  "commands.disk-destroy": "log",
12457
+ "commands.system-processes": "log",
12235
12458
  "commands.dangerous-word": "log",
12236
12459
  "files.system-dirs": "log",
12237
12460
  "files.shell-startup": "log",
@@ -12550,6 +12773,16 @@ var init_dist = __esm({
12550
12773
  defaultValue: "review",
12551
12774
  legacy: ["Manual Nuclear Protection"]
12552
12775
  },
12776
+ {
12777
+ id: "commands.system-processes",
12778
+ group: "commands",
12779
+ owasp: "ASI02",
12780
+ title: "Stops a system service",
12781
+ 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",
12782
+ values: ALL,
12783
+ defaultValue: "review",
12784
+ legacy: ["Node9: System Service Stopped"]
12785
+ },
12553
12786
  {
12554
12787
  id: "commands.dangerous-word",
12555
12788
  group: "commands",
@@ -13209,6 +13442,82 @@ var init_dist = __esm({
13209
13442
  )
13210
13443
  )
13211
13444
  }));
13445
+ INFRASTRUCTURE_SERVICES = [
13446
+ "init",
13447
+ "sshd",
13448
+ "dockerd",
13449
+ "docker-proxy",
13450
+ "containerd",
13451
+ "containerd-shim",
13452
+ "docker-containerd-shim",
13453
+ "runc",
13454
+ "systemd-journald",
13455
+ "journald",
13456
+ "systemd-logind",
13457
+ "systemd-udevd",
13458
+ "udevd",
13459
+ "dbus-daemon",
13460
+ "polkitd",
13461
+ "sssd",
13462
+ "kubelet",
13463
+ "kube-apiserver",
13464
+ "crond",
13465
+ "cron",
13466
+ "atd",
13467
+ "auditd",
13468
+ "rsyslogd",
13469
+ "syslogd",
13470
+ "chronyd",
13471
+ "ntpd",
13472
+ "NetworkManager",
13473
+ "wpa_supplicant",
13474
+ "dhclient",
13475
+ "avahi-daemon",
13476
+ "firewalld",
13477
+ "ufw",
13478
+ "cupsd",
13479
+ "snapd",
13480
+ "bluetoothd",
13481
+ "Xorg",
13482
+ "Xwayland",
13483
+ "gdm",
13484
+ "sddm",
13485
+ "lightdm"
13486
+ ];
13487
+ SERVER_SERVICES = [
13488
+ "nginx",
13489
+ "apache2",
13490
+ "httpd",
13491
+ "mysqld",
13492
+ "mariadbd",
13493
+ "postgres",
13494
+ "postgresql",
13495
+ "redis-server",
13496
+ "mongod"
13497
+ ];
13498
+ SYSTEM_SERVICES = [...INFRASTRUCTURE_SERVICES, ...SERVER_SERVICES];
13499
+ escape = (s) => s.replace(/[.*+?^${}()|[\]\\-]/g, "\\$&");
13500
+ SERVICE_WORD_RE = new RegExp(
13501
+ `(?:^|[^A-Za-z0-9_.-])(${SYSTEM_SERVICES.map(escape).join("|")})(?![A-Za-z0-9_.-])`,
13502
+ "i"
13503
+ );
13504
+ INIT_PATTERN_RE = /(?:["'*])init(?:["'*])/;
13505
+ UNIT_ALIASES = {
13506
+ docker: "dockerd",
13507
+ ssh: "sshd",
13508
+ mysql: "mysqld",
13509
+ mariadb: "mariadbd",
13510
+ redis: "redis-server",
13511
+ mongodb: "mongod",
13512
+ apache: "apache2",
13513
+ rsyslog: "rsyslogd",
13514
+ "systemd-networkd": "systemd-udevd",
13515
+ dbus: "dbus-daemon",
13516
+ avahi: "avahi-daemon",
13517
+ bluetooth: "bluetoothd",
13518
+ cups: "cupsd",
13519
+ chrony: "chronyd"
13520
+ };
13212
13521
  MAX_INLINE_CODE = 64 * 1024;
13213
13522
  WHAT = {
13214
13523
  deletes: "deletes files",
@@ -13220,7 +13529,15 @@ var init_dist = __esm({
13220
13529
  "builds-code": "runs code it builds at run time",
13221
13530
  permissions: "changes permissions or ownership",
13222
13531
  monitors: "captures the screen, the clipboard or the keyboard",
13223
- amplifies: "writes or sends in an endless loop"
13532
+ amplifies: "writes or sends in an endless loop",
13533
+ "kills-service": "stops a system service"
13534
+ };
13535
+ KILL_API = {
13536
+ python: /\bos\.kill(?:pg)?\s*\(|\.(?:kill|terminate)\s*\(|\bsignal\.SIGKILL\b/,
13537
+ node: /\bprocess\.kill\s*\(|\.kill\s*\(\s*['"`]?SIG/,
13538
+ perl: /\bkill\s+(?:-?\d+|['"]?[A-Z]+['"]?)\s*,/,
13539
+ ruby: /\bProcess\.kill\b/,
13540
+ php: /\bposix_kill\s*\(/
13224
13541
  };
13225
13542
  OUTSIDE = String.raw`(?:~|\.\.[\\/]|/(?!(?:tmp|var/tmp)/(?![^'"\n]*\.\.)|dev/(?:null|stdout|stderr)\b))`;
13226
13543
  pyImport = (mods) => new RegExp(String.raw`\b(?:import\s+(?:[\w.]+(?:\s+as\s+\w+)?\s*,\s*)*|from\s+)(?:${mods})\b`);
@@ -19119,6 +19436,7 @@ ${text}` : text);
19119
19436
  "commands.sql-no-where",
19120
19437
  "commands.temp-binary",
19121
19438
  "commands.disk-destroy",
19439
+ "commands.system-processes",
19122
19440
  "commands.dangerous-word",
19123
19441
  "commands.node9-disarm",
19124
19442
  "commands.reverse-shell",
@@ -19333,6 +19651,12 @@ ${text}` : text);
19333
19651
  const char = value[index] ?? "";
19334
19652
  return RUN_CHAR.test(char) || char !== "" && isInvisibleChar(char);
19335
19653
  };
19654
+ PRESCREEN_RE3 = /\b(?:kill|pkill|killall|systemctl|service|launchctl|xargs)\b/;
19655
+ KILL_SIGNAL_RE = /^-(?:\d+|s|SIG[A-Z]+|[A-Z]{2,})$/;
19656
+ SYSTEMCTL_STOP_VERBS = /* @__PURE__ */ new Set(["stop", "kill", "disable", "mask"]);
19657
+ LAUNCHCTL_UNLOAD_VERBS = /* @__PURE__ */ new Set(["unload", "bootout", "remove"]);
19658
+ LAUNCH_DAEMONS_RE = /(?:^|\/)(?:System\/)?Library\/LaunchDaemons\//;
19659
+ MAX_PAYLOAD_DEPTH5 = 3;
19336
19660
  RULE_NAME2 = "review-node9-disarm";
19337
19661
  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.";
19338
19662
  DAEMON_CMDLINES = [