#!/usr/bin/env python3 # tool_validator.py - Плагин для контроля вызовов OpenClaw import sys import json import re def validate_tool_call(tool_name: str, tool_args: dict) -> dict: """Валидация каждого вызова инструмента перед выполнением.""" # Блокируем опасные вызовы чтения файлов if tool_name == "read_file": target_file = tool_args.get("file_path", "") sensitive_files = [".env", ".ssh/id_rsa", ".npmrc", "IDENTITY.md"] for sensitive in sensitive_files: if sensitive in target_file: return { "blocked": True, "reason": f"Доступ к файлу {target_file} запрещён политикой безопасности" } # Блокируем эксфильтрацию через web_fetch if tool_name == "web_fetch": url = tool_args.get("url", "") blocklist_patterns = ["webhook.site", "hookbin.com", "ngrok.io"] for pattern in blocklist_patterns: if pattern in url: return { "blocked": True, "reason": f"Исходящий запрос на {url} запрещён (риск эксфильтрации)" } # Блокируем выполнение произвольных команд в bash if tool_name == "execute_command": command = tool_args.get("command", "") if re.search(r'\|\s*(base64|sh|bash)', command) or re.search(r'curl.*\|\s*bash', command): return { "blocked": True, "reason": "Выполнение команд с передачей данных через пайп или bash запрещено" } return {"blocked": False} def main(): if len(sys.argv) < 3: print(json.dumps({"error": "Недостаточно аргументов"})) sys.exit(1) tool_name = sys.argv[1] try: tool_args = json.loads(sys.argv[2]) except json.JSONDecodeError: print(json.dumps({"error": "Неверный формат JSON для аргументов"})) sys.exit(1) result = validate_tool_call(tool_name, tool_args) print(json.dumps(result)) if __name__ == "__main__": main()