ניסיון VPN שגוי: איזו קטגוריית אישורים חצתה את הגבול?
ניסיון כושל אולי לא שלח דבר, או מסר סיסמה למי שהשיב. מיינו את הממצא לפני שאתם מחליטים מה לבטל.
התחברתם ל־VPN שגוי, והלקוח דיווח על כשל. אם היה לכך משמעות תלוי במה שחצה את הקו לפני הכשל, והמילה עצמה אינה אומרת לכם זאת. יש לחיצות ידיים שאינן נושאות סוד כלל, ואחרות מוסרות סיסמה לכל מי שהשיב לכתובת. קבעו איזה משני המקרים התרחש לפני שתבטלו משהו.
עצרו ושמרו את הראיות
שמרו את יומן הלקוח, את הפרופיל שנבחר, את הכתובת שהקלדתם ואת הזמן המשוער. כתבו אותם במקום מחוץ ללקוח, כי עריכת פרופיל או התקנה מחדש משמידה את הרשומה שתהיה לכם דרושה. עצרו כל ניסיון נוסף עד שהנקודה הקצה תאומת בנתיב שאתם שולטים בו.
לעולם אל תפרסמו פרופיל או יומן בלי מחיקה בפורום ציבורי בזמן שאתם שואלים אם הניסיון היה בטוח. מסמכים אלה מכילים לעתים קרובות נתיב למפתח פרטי, שם מארח פנימי או אסימון, לכן מחקו תחילה ושתפו עם מנהל המערכת שבבעלותו הנקודה הקצה.
מה יכול לחצות את הגבול
רוב הבלבול נובע מהתייחסות לכל כשל כאל סוג אחד של אירוע. ארבעה דברים שונים יכולים להגיע לצד השני: תעודה ציבורית, חתימה המוכיחה שמפתח שימש, סיסמה או קוד חד־פעמי, וקובץ שבחרתם בעצמכם. לכל אחד תוצאה משלו ותיקון משלו. מיון הממצא הוא השלב שמכריע את כל מה שאחריו.
מקרה התעודה הוא הקל ביותר, משום שמה שנוסע הוא ציבורי מלכתחילה ושדות הזיהוי שלו כבר גלויים לכל מי שמתחבר. חתימה על אתגר אומרת שהמפתח שימש, לא שהוא נשלח. סיסמה היא המקרה ההפוך: מי שמקבל אותה יכול לנסות אותה במקום אחר, ושירות שנבנה לאימות סיסמאות הוא הנמען המיועד של בדיוק אותו ערך.
הוכחת מפתח אינה העלאת מפתח
TLS מודרני מפריד בין שני הרעיונות האלה בכוונה. RFC 8446 מתאר את הודעת CertificateVerify, שבה הלקוח חותם על אתגר עם המפתח הפרטי המתאים לתעודה שלו. החתימה מוכיחה בעלות בלי לשאת את המפתח, ולכן ניסיון שאומת בתעודה אינו בהכרח פגיעה במפתח.
להרגעה הזו יש גבול שראוי לציין. ההוכחה מראה שהמפתח השתתף בחילופין האלה, והיא אינה אומרת דבר על מה שתוכנה מקומית במכונה אולי כבר קראה. היא גם אינה אומרת דבר על כמה רחוק הגיע ניסיון לא ידוע בפועל, ולכן היומן עדיין חשוב מן התיאוריה.
סיסמאות פועלות לפי מודל אמון שונה לגמרי. מרכז המגדיר מאמת חיצוני עשוי להעביר הלאה את הערך שהוגש, ולכן קבלתו היא התפקוד המיועד ויעד שגוי הוא חשיפה אמיתית ולא תאורטית.
שחזרו את הניסיון מן היומן
ארבע עובדות משחזרות את הניסיון: הכתובת שאליה נוצר קשר בפועל, אם זהות השרת אומתה, איזו שיטת אימות נבחרה, והיכן התהליך נעצר. כל אחת מהן מופיעה ביומן לקוח, וכל אחת שוללת סיפור אחר. שגיאה בנוגע לנתיבים או לכתובת שהוקצתה אינה אומרת דבר על מה שכבר היה על הקו, משום שהאימות עשוי היה להסתיים לפני שהגדרת המנהרה נכשלה.
חלצו את העובדות האלה מן היומן של הלקוח עצמו ולא מן הזיכרון. מסנן צר משאיר את הפלט קצר מספיק למחיקה ולשיתוף:
grep -n -i -E 'verify|authentication|certificate|error|timeout' client.log | tail -30
אל תחליפו את שם המארח באף אחד מאלה. שם מוכר, תשובת DNS נוכחית ואזהרת תעודה שהתוכנה מציגה מתארים את ההווה ולא את החיבור הקודם. גם בקשת סיסמה אינה ראיה שמשהו נשלח, שכן ייתכן שהלקוח נכשל לפני שהגיש אותה.
החליטו ואז פעלו
ההחלטה נובעת מן הממצא, לא מן המידה שבה הכשל נראה מדאיג. קראו את ארבע השורות מול העובדות ששחזרתם:
| Decision | Evidence that puts you here | Evidence that rules it out |
|---|---|---|
| Change the password now | A password was submitted and a server reply arrived | The log stops before any submission |
| Review active sessions | A one-time code was accepted by the wrong endpoint | The code was never sent, or was rejected before use |
| Revoke and reissue | The file you selected contained key material, not just settings | The upload was a profile with no embedded key |
| No further action | The attempt ended before any authentication value was offered | You later find an earlier attempt you had forgotten |
אם סיסמה הגיעה לשירות לא־מכוון, החליפו אותה דרך ערוץ ניהול החשבון ובדקו היכן עוד נעשה בה שימוש חוזר. קוד חד־פעמי שפג תוקפו סוגר את הנתיב הזה, אבל הפעלה שנוצרה איתו לא, לכן בקשו ממנהל הזהויות לבדוק הפעלות. אם קובץ מפתח הועלה בפועל, פעלו לפי תהליך הביטול של הארגון המנפיק במקום להמתין לראיה לשימוש לרעה.
אחר כך כתבו את התוצאה המוגבלת: מה נשלח, מה נותר לא ידוע ואיזה אישור דורש פעולה. הרשומה הזאת היא מה שבדיקה מאוחרת תבקש, והיא שימושית יותר מכל אחת משתי המסקנות הנוחות.