63 lines
2.3 KiB
Python
63 lines
2.3 KiB
Python
#!/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()
|