""" Контракт барьера системных команд (Shell-Barrier Contract). Блокирует выполнение деструктивных системных вызовов в Bash / PowerShell / CMD: - rm -rf / и удаление корневых каталогов - Форматирование дисков (mkfs, dd, format) - Отключение системного аудита и журналирования (auditd, syslog, wevtutil) - Скачивание и слепое исполнение скриптов из сети (curl | bash, IEX) - Отключение межсетевых экранов (iptables -F, ufw disable) - Форк-бомбы и DoS """ import re from typing import Any, Dict, List from .base import BaseSecurityContract, ContractVerdict SHELL_TOOL_NAMES = {"bash", "sh", "shell", "run_command", "execute_command", "terminal", "powershell", "cmd"} SHELL_ARG_KEYS = {"command", "cmd", "commandline", "script"} DANGEROUS_SHELL_PATTERNS = [ # Удаление корня или системных каталогов (re.compile(r"\brm\s+(-[a-zA-Z]*r[a-zA-Z]*f?[a-zA-Z]*\s+)?(\/|\/\*|~\/|~|\$HOME)(\s|$|;)", re.IGNORECASE), "DESTRUCTIVE_RM_ROOT"), (re.compile(r"\b(del|rd|rmdir)\s+\/[sS]\s+\/[qQ]\s+[cC]:\\", re.IGNORECASE), "DESTRUCTIVE_WIN_DEL"), # Дисковые операции (re.compile(r"\b(mkfs|fdisk|parted)\b", re.IGNORECASE), "DISK_FORMAT"), (re.compile(r"\bdd\s+if=\/dev\/(zero|urandom|null)\s+of=\/dev\/[shv]d[a-z]", re.IGNORECASE), "DISK_WIPE"), # Отключение аудита и удаление логов (re.compile(r"\b(systemctl\s+stop\s+(auditd|rsyslog|syslog)|auditctl\s+-e\s+0)\b", re.IGNORECASE), "DISABLE_AUDIT"), (re.compile(r"\brm\s+.*\/var\/log\/", re.IGNORECASE), "WIPE_SYSTEM_LOGS"), (re.compile(r"\bwevtutil\s+(cl|clear-log)\b", re.IGNORECASE), "WIPE_EVENT_LOGS"), # Скачивание и исполнение в пайпе (RCE) (re.compile(r"\b(curl|wget)\s+[^|]+\|\s*(ba|z|da)?sh\b", re.IGNORECASE), "PIPE_TO_SHELL"), (re.compile(r"\b(Invoke-Expression|IEX)\s*\(?(New-Object\s+Net\.WebClient|Invoke-WebRequest|irm|iwr)", re.IGNORECASE), "POWERSHELL_DOWNLOAD_EXEC"), # Отключение защиты (re.compile(r"\b(iptables\s+-F|ufw\s+disable|Set-NetFirewallProfile\s+-Enabled\s+False)\b", re.IGNORECASE), "DISABLE_FIREWALL"), # Форк-бомбы (re.compile(r":\(\)\s*{\s*:\|:&\s*};\s*:", re.IGNORECASE), "FORK_BOMB"), ] class ShellBarrierContract(BaseSecurityContract): name = "shell_barrier" rule_id = "SEC-SH-001" def _extract_commands(self, tool_name: str, arguments: Dict[str, Any]) -> List[str]: cmds = [] is_shell_tool = any(st in tool_name.lower() for st in SHELL_TOOL_NAMES) for k, v in arguments.items(): if isinstance(v, str): if is_shell_tool or k.lower() in SHELL_ARG_KEYS: cmds.append(v) elif isinstance(v, dict): cmds.extend(self._extract_commands(tool_name, v)) return cmds def check_tool_call(self, tool_name: str, arguments: Dict[str, Any]) -> ContractVerdict: commands = self._extract_commands(tool_name, arguments) for cmd in commands: clean_cmd = cmd.strip() for pattern, threat_type in DANGEROUS_SHELL_PATTERNS: if pattern.search(clean_cmd): return ContractVerdict( allowed=False, rule_id=f"SEC-SH-{threat_type}", reason=f"Unsat Core: Обнаружена деструктивная системная команда [{threat_type}]: '{clean_cmd}'", details={"command": clean_cmd, "threat_type": threat_type} ) return ContractVerdict(allowed=True, reason="Shell-Barrier check passed", rule_id=self.rule_id)