#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ПРОВЕРКА ACL ОПЕРАЦИОННОГО TG-БОТА. Вопрос один: может ли ЧУЖОЙ человек выполнить необратимую команду. Публичные кнопки на витрине ведут в этого бота, а у него в меню /kill и /pause. Скрипт НЕ печатает токены и содержимое сообщений — только структуру защиты. """ import ast, os, re, sys PATH = sys.argv[1] if len(sys.argv) > 1 else "/opt/arena/tg_bot.py" DANGER = ["kill", "pause", "resume", "promote", "stop", "restart", "disable"] ACL_MARKERS = ["ADMIN", "OWNER", "ALLOWED", "WHITELIST", "is_admin", "user_id", "from_user", "AUTHORIZED"] src = open(PATH, encoding="utf-8", errors="replace").read() lines = src.splitlines() print(f"файл: {PATH}") print(f"строк: {len(lines)}") # 1. какие команды бот вообще понимает cmds = sorted(set(re.findall(r'["\']/([a-z_]{2,20})["\']', src))) print(f"\nкоманд распознано: {len(cmds)}") print(" " + " ".join("/" + c for c in cmds)) risky = [c for c in cmds if any(d in c for d in DANGER)] print(f"\nНЕОБРАТИМЫЕ: {' '.join('/'+c for c in risky) if risky else 'нет'}") # 2. есть ли вообще признаки ACL hits = {m: len(re.findall(r"\b" + m + r"\b", src)) for m in ACL_MARKERS} hits = {k: v for k, v in hits.items() if v} print(f"\nмаркеры ACL в коде: {hits if hits else 'НИ ОДНОГО'}") # 3. сравнивается ли отправитель с чем-то cmp_chat = re.findall(r"(chat|CHAT|sender|user)\s*(==|!=|\bin\b|\bnot in\b)", src) print(f"сравнений отправителя: {len(cmp_chat)}") # 4. главное: стоит ли проверка ПЕРЕД опасной командой verdict = "НЕИЗВЕСТНО" if risky: guarded, unguarded = [], [] for c in risky: for i, ln in enumerate(lines): if re.search(r'["\']/' + c + r'["\']', ln): window = "\n".join(lines[max(0, i - 25):i + 3]) if any(m in window for m in ACL_MARKERS): guarded.append("/" + c) else: unguarded.append("/" + c) break print(f"\nс проверкой рядом : {' '.join(sorted(set(guarded))) or '—'}") print(f"БЕЗ проверки : {' '.join(sorted(set(unguarded))) or '—'}") verdict = "ДЫРА" if unguarded else ("похоже закрыто" if guarded else "НЕИЗВЕСТНО") else: verdict = "необратимых команд нет" print(f"\n=== ВЕРДИКТ: {verdict} ===")