@node9/proxy 2.54.1 → 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
@@ -1728,6 +1728,26 @@ function collectShellFileAccesses(command, context = {}) {
1728
1728
  }
1729
1729
  return out;
1730
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
+ }
1731
1751
  function inlineLanguageOf(interp) {
1732
1752
  const i = interp.toLowerCase();
1733
1753
  if (/^python[\d.]*$/.test(i)) return "python";
@@ -1802,6 +1822,15 @@ function judgeInlineCode(language, code, isProtected) {
1802
1822
  return { outcome: "unreadable", what: "is too long for node9 to read" };
1803
1823
  }
1804
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
+ }
1805
1834
  for (const [category, re] of TABLES[language]) {
1806
1835
  const m = re.exec(text);
1807
1836
  if (!m) continue;
@@ -8457,6 +8486,118 @@ function scanArgumentSecrets(args) {
8457
8486
  severity: "review"
8458
8487
  } : null;
8459
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
+ }
8460
8601
  function patternSelects(pattern, targets) {
8461
8602
  const pieces = pattern.toLowerCase().split(/[\\^$.*+?()[\]{}|]+/).filter(Boolean);
8462
8603
  if (pieces.length === 0) return false;
@@ -9076,6 +9217,17 @@ async function evaluatePolicyCore(config, toolName, args, context = {}, hooks =
9076
9217
  checkId: "commands.eval-dynamic"
9077
9218
  });
9078
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
+ }
9079
9231
  const builtin = strictestVerdict(candidates);
9080
9232
  if (builtin) return builtin;
9081
9233
  {
@@ -10154,7 +10306,7 @@ function matchCanaryArgs(args, values) {
10154
10306
  return null;
10155
10307
  }
10156
10308
  }
10157
- 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;
10158
10310
  var init_dist = __esm({
10159
10311
  "packages/policy-engine/dist/index.mjs"() {
10160
10312
  "use strict";
@@ -12029,6 +12181,11 @@ var init_dist = __esm({
12029
12181
  example: "/tmp/build-helper --serve",
12030
12182
  advice: "Keep Review. Malware often runs from /tmp."
12031
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
+ },
12032
12189
  "commands.disk-destroy": {
12033
12190
  plain: "The agent formats, overwrites or securely erases a disk or file.",
12034
12191
  example: "dd if=/dev/zero of=/dev/sda",
@@ -12198,6 +12355,7 @@ var init_dist = __esm({
12198
12355
  "commands.sql-no-where": "log",
12199
12356
  "commands.temp-binary": "log",
12200
12357
  "commands.disk-destroy": "log",
12358
+ "commands.system-processes": "log",
12201
12359
  "commands.dangerous-word": "log",
12202
12360
  "files.system-dirs": "log",
12203
12361
  "files.shell-startup": "log",
@@ -12516,6 +12674,16 @@ var init_dist = __esm({
12516
12674
  defaultValue: "review",
12517
12675
  legacy: ["Manual Nuclear Protection"]
12518
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
+ },
12519
12687
  {
12520
12688
  id: "commands.dangerous-word",
12521
12689
  group: "commands",
@@ -13175,6 +13343,82 @@ var init_dist = __esm({
13175
13343
  )
13176
13344
  )
13177
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
+ };
13178
13422
  MAX_INLINE_CODE = 64 * 1024;
13179
13423
  WHAT = {
13180
13424
  deletes: "deletes files",
@@ -13186,7 +13430,15 @@ var init_dist = __esm({
13186
13430
  "builds-code": "runs code it builds at run time",
13187
13431
  permissions: "changes permissions or ownership",
13188
13432
  monitors: "captures the screen, the clipboard or the keyboard",
13189
- 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*\(/
13190
13442
  };
13191
13443
  OUTSIDE = String.raw`(?:~|\.\.[\\/]|/(?!(?:tmp|var/tmp)/(?![^'"\n]*\.\.)|dev/(?:null|stdout|stderr)\b))`;
13192
13444
  pyImport = (mods) => new RegExp(String.raw`\b(?:import\s+(?:[\w.]+(?:\s+as\s+\w+)?\s*,\s*)*|from\s+)(?:${mods})\b`);
@@ -19077,6 +19329,7 @@ ${text}` : text);
19077
19329
  "commands.sql-no-where",
19078
19330
  "commands.temp-binary",
19079
19331
  "commands.disk-destroy",
19332
+ "commands.system-processes",
19080
19333
  "commands.dangerous-word",
19081
19334
  "commands.node9-disarm",
19082
19335
  "commands.reverse-shell",
@@ -19291,6 +19544,12 @@ ${text}` : text);
19291
19544
  const char = value[index] ?? "";
19292
19545
  return RUN_CHAR.test(char) || char !== "" && isInvisibleChar(char);
19293
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;
19294
19553
  RULE_NAME2 = "review-node9-disarm";
19295
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.";
19296
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.1",
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",