fix(security): מניעת דליפת טוקן הבוט להודעות שגיאה, לוגים ו-Sentry

Merged
AM
2mo ago
+626-18

✨ תיאור קצר

כתובות ה-API של טלגרם נבנות כ-https://api.telegram.org/bot<TOKEN>/method, והכתובת המלאה נדחפה לתוך הודעת החריגה של TelegramAPIError וגם לשדה url שלה. כתוצאה מכך כל שגיאה בקריאה לטלגרם נשאה את הטוקן במלואו, ומשם הוא זלג ל-Sentry וללוגים. ה-PR מרכז את הניקוי בנקודה אחת ומחיל אותה בכל שכבה שבה הטקסט הזה יוצא החוצה.

📦 שינויים עיקריים

  • קוד (Backend)
  • בוט טלגרם
  • מסד נתונים/מיגרציות
  • תיעוד (docs/)
  • DevOps/CI/CD

פירוט:

  • telegram_api.py — נוספו redact_bot_token (טקסט בודד) ו-redact_bot_token_deep (מבנה מקונן). זו נקודת הניקוי היחידה, וכל השאר נשענים עליה.
  • TelegramAPIError — מנקה את ה-url ואת ה-description לפני ההשמה, כך שגם str(e) וגם e.url נקיים. זה מכסה את כל שמונה מקומות הקריאה בקוד בלי לגעת באף אחד מהם.
  • observability.py — ה-_before_send ניקה עד היום רק את event["extra"] לפי שמות מפתחות, ולא נגע בגוף החריגה או ב-breadcrumbs. עכשיו הוא סורק את כל האירוע. רשימת שדות קבועה תמיד תפספס אחד, ולכן הסריקה מלאה ולא ממוקדת.
  • webapp/app.py — נוסף before_send ל-sentry_sdk.init, שלא היה שם כלל. ה-filter על ה-logging handlers לא מכסה חריגות ש-FlaskIntegration תופסת ישירות.
  • utils.py — SensitiveDataFilter ניקה טוקני GitHub ו-Bearer אבל לא של טלגרם. הושלם דרך אותה נקודת ניקוי.

🧪 בדיקות

  • Unit
  • Integration
  • Manual

נוסף tests/test_telegram_token_redaction.py עם 13 בדיקות שכולן עוברות. הן נועלות את המסלולים שדרכם הטוקן היה יוצא:

  • הודעת החריגה והתכונות e.url / e.description
  • require_telegram_ok ו-parse_telegram_json_from_response, כולל המסלול שבו ה-URL נשלף מאובייקט התגובה במקום להיות מועבר במפורש
  • ניקוי עומק על אירוע בצורת Sentry (exception / logentry / breadcrumbs / extra), כולל שמירה על מבנה הנתונים ועל טיפוסים
  • מבנה מעגלי — כדי לוודא שהמסנן לא נתקע, שכן הוא רץ על כל אירוע לפני שליחה
  • SensitiveDataFilter על טוקן טלגרם, ובמקביל אימות שניקוי טוקני GitHub הקיים לא נשבר

בדיקה ידנית נוספת: הופעל הניקוי על אירוע Sentry מלא ואומת שה-request_id שנשמר כתג ממשיך לעבור, ושה-before_send בוובאפ מחווט ל-init.

tests/test_observability_sentry_bridge.py עובר. חלק מהטסטים בסביבה המקומית נכשלים בגלל cryptography/_cffi_backend שבורים בהתקנה — לא קשור לשינוי הזה, וה-CI יריץ על סביבה נקייה.

🧪 בדיקות נדרשות ב‑PR

  • 🔍 Code Quality & Security
  • Unit Tests (3.11)
  • Unit Tests (3.12)

📝 סוג שינוי

  • fix: תיקון באג

✅ צ'קליסט

  • הקוד עוקב אחרי הסגנון
  • בדיקות רצות ועוברות
  • אין סודות/מפתחות בקוד (הטוקן שבטסטים בדוי ונועד לוודא שהוא לא שורד בפלט)
  • אין מחיקות מסוכנות/פעולות על root
  • הודעת הקומיט תואמת Conventional Commits
  • תיעוד עודכן — לא נדרש, אין שינוי בהתנהגות כלפי המשתמש
  • לא נוספו משתני סביבה, ג'ובים או טוקני עיצוב

🧩 השפעות/סיכונים

השינוי משפיע על אבטחה ועל קריאוּת דיבוג. אחרי המיזוג, כתובות שמופיעות בהודעות שגיאה ובאירועי Sentry יציגו bot<REDACTED>/sendMessage במקום הטוקן. שם המתודה, error_code, description ו-http_status נשמרים, ולכן יכולת האבחון לא נפגעת.

הסיכון נמוך: אין שינוי בזרימת הקוד או בערכי החזרה, רק בתוכן מחרוזות. ה-before_send החדש בוובאפ עטוף ב-try/except שמחזיר את האירוע כמות שהוא אם הניקוי נכשל, כדי שדיווח שגיאות לא ייפול בגלל המסנן.

הערה: ניקוי עומק רץ על כל אירוע Sentry לפני שליחה. העלות זניחה ביחס לשליחת האירוע עצמו, והעומק חסום ב-12 רמות כדי למנוע היתקעות.

🔗 קישורים

🧯 סיכון / החזרה לאחור (Rollback)

git revert לקומיט הבודד מחזיר את המצב הקודם במלואו. אין מיגרציות, אין שינויי תצורה ואין תלות בין הקבצים שנגעתי בהם — כל שכבה מייבאת את הניקוי בעצלתיים (lazy) ומדלגת עליו אם הייבוא נכשל.


Generated by Claude Code

Summary by Sourcery

Prevent Telegram bot tokens from being exposed in error reporting and diagnostic output.

Bug Fixes:

  • Prevent Telegram bot tokens from leaking through API errors, log messages, tracebacks, and Sentry events.

Enhancements:

  • Centralize token redaction across errors, observability, logging, and nested event data while preserving diagnostic context and handling complex or circular structures safely.

Tests:

  • Add comprehensive unit coverage for Telegram token redaction across errors, payloads, logs, Sentry-shaped events, nested structures, and existing sensitive-token filters.