eebb193fd30a253b099300feb1f2200de9ef8784
ב-stdio ההגנה היא הצינור עצמו: רק תהליך שכבר רץ כמשתמש הזה יכול לדבר עם השרת. streamable-http מבטל את התכונה הזו לחלוטין — כל מי שמגיע ל-socket יכול לקרוא לכל אחד מ-108 הכלים, ובמרשם יש case_delete, precedent_library_delete, document_upload וכל כלי כתיבת-הבלוקים. מאזין לא-מאומת הוא, הלכה למעשה, endpoint למחיקת תיקים. מימוש דרך ה-TokenVerifier של ה-SDK ו-BearerAuthBackend שלו — לא middleware משלנו. מסלול-אימות אחד, של המסגרת (G2). ההחלטות שקובעות את בטיחות הפיצ'ר: - **מסרב לעלות בלי טוקן.** MissingTokenError קטלנית. החלופה המפתה — לעלות ולרשום warning — מייצרת מאזין שנראה בריא ועונה על כל קריאה הרסנית. סירוב-אתחול הוא הכשל הבטוח (§6). - הבנייה בזמן-import ולא בתוך main(): FastMCP מקבל token_verifier ו-auth כארגומנטי-בנאי, ולכן טוקן חסר חייב להיכשל *לפני* שה-listener קיים. - **stdio לא נוגע.** דרישת טוקן שם הייתה שוברת כל סשן אינטראקטיבי בלי שום רווח אבטחתי — הגבול שם הוא הצינור. - השוואה בזמן-קבוע (hmac.compare_digest); == נאיבי מדליף את הטוקן בייט-בייט לתוקף שמודד זמנים. - verify_token מחזיר None ולא זורק — זה אות ה"דחייה" של הפרוטוקול ומניב 401 נקי במקום 500 שנקרא ככשל-שרת. - סף אורך 32 תווים; טוקן קצר נדחה באתחול ולא מתגלה מ-access log. - הטוקן נקרא מ-env (שיאוכלס מ-Infisical), לא מוטמע, ולא נרשם ללוג. אומת בהרצה חיה: HTTP בלי טוקן → סירוב לעלות, exit 1 stdio בלי טוקן → עולה כרגיל, auth כבוי POST בלי Authorization → 401 POST עם טוקן שגוי → 401 POST עם הטוקן הנכון → 200 claude דרך HTTP+Bearer → 108 כלים, mcp__legal-ai__case_get מופעי הטוקן בלוג → 0 invariants: G2 — מקיים (מסלול-אימות יחיד, של ה-SDK). G12 — מקיים; המודול נקי מסמלי-פלטפורמה, leak_guard ירוק. INV-AG3 — לא נגוע, השער ירוק. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Description
AI Legal Decision Drafting System — MCP server, web upload, RAG search
Languages
Python
66%
TypeScript
31.9%
JavaScript
1.1%
Shell
0.7%
CSS
0.2%