docs(patterns): K14 — סוד בשורת שאילתה ש-SDK הניטור מתעד בעצמו

Merged
AM
2mo ago
+288-7

דפוס חדש מ-CodeBot PR #3270 — מפתח Gemini הופיע במלואו ב-Sentry.

למה זה לא K13

ב-K13 הקוד שלך מרכיב את המחרוזת ושולח אותה ל-sink, וכלל הזיהוי הוא source-to-sink בקוד שלך. כאן אין sink בקוד שלך לעקוב אליו: הקוד העביר params={"key": ...} — צורה שמופיעה בתיעוד של ספקים רבים — ואינטגרציית ה-HTTP של sentry-sdk קראה את הכתובת ורשמה אותה בעצמה.

שתי תכונות מחריפות את זה:

  • האינטגרציה נמצאת ב-_AUTO_ENABLING_INTEGRATIONS ונדלקת לבד כשהספרייה מותקנת. היעדרה מ-integrations=[...] שב-init אינו ראיה שהיא כבויה — וזה בדיוק מה שמכשיל סקירה.
  • הרישום קורה בכל בקשה מוצלחת, לא רק בכשל.

הראיה, מהרצה על URL בצורה הזו:

sanitize=False  →  key=AIza...        (מה שהאינטגרציה עושה)
sanitize=True   →  key=[Filtered]     (המנקה המובנה שקיים ולא נקרא)

והחצי השני: "המצב המומלץ" של K13 היה מיושם — ובכל זאת נכשל

בפרויקט הייתה נקודת ניקוי מרכזית מתועדת ככזו בקוד, hook על before_send_transaction עם הערה שמסבירה שה-spans נושאים כתובות מלאות, ומעבר עמוק על מבנה האירוע שנכשל-סגור ומטפל במעגלים, ב-bytes וב-repr של אובייקטים זרים. עבודה טובה.

הפגם היחיד: רשימת הדפוסים הייתה בגודל אחד. מי שכתב את זה הבין את הערוץ במדויק וסגר אותו לספק אחד; הספק השני עבר דרכו בלי לגעת בדפנות. K13 אינו דורש שהרשימה תהיה חסינת-ספק, ולכן זה החצי השני של K14: רשימת דפוסי-צורה היא רשימה שחורה שמתעדכנת רק אחרי דליפה.

תיקון לכלל קיים

bugbot-rules/secret-in-derived-text.md העניק ב-false-positives פטור להרכבת URL מקומית, על סמך ההנחה שהסיכון הוא חריגות בלבד — "ספריית ה-HTTP לא מדליפה את ה-URL בחריגות שלה". ההנחה שגויה, והכלל הקיים היה אומר לריוויוור שהמקרה הזה הוא false positive. הפטור צומצם, עם הפניה לכלל החדש.

מה נוסף

קובץמה
docs/source-projects/codebot-patterns.mdPattern 8 — מסמך המקור
CRITICAL-PATTERNS.mdK14
bugbot-rules/secret-in-url-query.mdכלל חדש
claude-md-snippets/critical.mdכלל 13
INTEGRATION.mdשורת טריגר + שורה בבלוק "תמיד, בכל פרויקט"
bugbot-rules/secret-in-derived-text.mdתיקון — צמצום ה-false-positive

שורת הטריגר המקבילה נוספה גם ל-CLAUDE.md של CodeBot, באותו PR של התיקון — לפי הכלל ש"דפוס בלי שורת טריגר = דפוס שלא ייקרא".

שתי נקודות מהאירוע ששוות תשומת לב

כלל לפי-שם חייב לטפל בשם כמקטע. הניסוח הראשון דרש התאמה מדויקת מהמפריד, ולכן auth_token, oauth_token, id_token, private_key, x-api-key ו-session_token כולם דלפו — שמות סטנדרטיים לגמרי. ריוויוור תפס את זה. התיקון הנכון אינו הוספתם לרשימה (זו אותה רשימה שחורה בגלגול נוסף) אלא תחילית-מקטע.

ההרצה תפסה מה שקריאת הקוד לא. הדפוס עוגן תחילה ל-?/&, ואימות מול מבנה ה-span האמיתי הראה שהוא מפספס בדיוק את השדה שדלף: http.query הוא מחרוזת עירומה, בלי ? מוביל. זה נכנס ככלל זיהוי מספר 4.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GrAPatY7VmTTVxUJjxHBKi


Generated by Claude Code