ידע מעשי של CyberFixCrew

איך מאבטחים webhook ומונעים טיפול כפול באירועים

כדי לאבטח webhook צריך לאמת את המסירה לפי מנגנון הספק, לבדוק שהאירוע שייך לחשבון ולפעולה המצופים, ולמנוע עיבוד עסקי כפול. HTTPS חשוב לתעבורה אך אינו מוכיח מי יזם כל בקשה. חיבור אמין מטפל גם בניסיונות חוזרים, בכשלים ובשמירת מידע מצומצמת, ולא רק באירוע ראשון שעבר בהצלחה.

ממפים את כיוון החיבור לפני בחירת ההגנה

Webhook הוא הודעת אירוע שנשלחת לכתובת שהוגדרה מראש. בחנות, לדוגמה, מערכת חיצונית יכולה להודיע שהשתנה מצב הזמנה; בחיבור אחר האתר הוא השולח אל CRM. קבלת הודעה ושליחה לכתובת שהלקוח מזין הן שתי נקודות בדיקה שונות, ולכן לא מסיקים שאישור החיבור בכיוון אחד מכסה את שניהם.

רשמו מי השולח, מי המקבל, אילו אירועים נחוצים ואיזו פעולה עסקית כל אחד מפעיל. הפרידו סביבת ניסיון וחשבונות אמת. הודעה שהתקבלה אינה אישור גורף לבצע פעולה על כל לקוח או הזמנה. כשמקור הנתונים או מזהה החשבון אינם ברורים, עוצרים לפני שינוי מצב במערכת עסקית.

אימות מסירה צריך להתאים לתיעוד הספק

ב-GitHub, לדוגמה, אימות המסירה משתמש בסוד משותף ובחתימת HMAC על תוכן ההודעה. המקבל מחשב ומשווה את החתימה בדרך שהספק מגדיר לפני עיבוד. אין להעתיק שם כותרת או אלגוריתם מספק אחד לאחר. יש לשמור על תוכן הבקשה הנדרש לאימות ולהשתמש בספרייה או במימוש נתמך ובהשוואה המתאימה.

בפועל חשוב לזהות אם המנגנון חותם על גוף הבקשה הגולמי או על מבנה אחר. שינוי סדר שדות או עיבוד JSON לפני האימות עלולים לשנות את החומר שנבדק. אחרי אימות בוחנים גם מבנה ושדות צפויים, גודל בקשה והגבלת עומס, בהתאם למוצר. אלו בדיקות נפרדות מתעודת TLS תקינה.

GitHub: אימות חתימות של מסירות webhook

בדקו חוזה, הרשאות וכפילויות בנפרד מהחתימה

גם אחרי אימות מקור צריך לוודא שסוג האירוע, החשבון והמזהה מתאימים לתהליך המורשה. חתימה תקינה אינה מבטיחה שהפעולה העסקית עדיין נחוצה. מסירה חוזרת יכולה להיות לגיטימית אחרי כשל, ולכן המערכת צריכה להבחין בין קבלת ההודעה לבין ביצוע הפעולה בפועל.

הטבלה היא רשימת קבלה מקורית לחיבור עסקי. משלימים אותה לפי חוזה המסירה של הספק, לרבות סדר אירועים וזמן תגובה. אישור קבלה לפני שהמידע נשמר באופן אמין עלול לאבד עבודה, ואישור רק אחרי עיבוד ארוך עלול לגרור ניסיונות חוזרים.

בדיקות לחיבור לפני מסירה
שכבהמה מאמתיםתוצאה צפויה בניסוי מורשה
זהות ושלמותמנגנון האימות של הספקמסירה שאינה מאומתת אינה מפעילה פעולה
תחום עסקיחשבון, סוג אירוע ומזהה משאבאירוע מחוץ להיקף אינו משנה נתונים
כפילויותמזהה אירוע וכלל עיבוד עקבימסירה חוזרת אינה יוצרת רשומה נוספת
כשל זמנישמירה, ניסיון חוזר ומעקבהפעולה ניתנת לבירור בלי לנחש
מידע אישישדות ולוגים הנחוצים לתפעולאין תיעוד מלא של סודות ותוכן לקוחות
GitHub: אירועים, מסירות חוזרות ומזהי מסירה

מסירה חוזרת, replay וסדר אירועים

מזהה אירוע או מסירה יכול לסייע בזיהוי חזרה, אך אופן השימוש תלוי בספק. ב-GitHub מתועד מזהה מסירה שנשאר זהה בשליחה חוזרת של אותה מסירה. אצל ספק אחר ייתכן מודל אחר. אם יש חותמת זמן חתומה וכלל תוקף נתמך, בודקים אותם לפי התיעוד; אין להמציא חלון שרירותי שעלול לפסול הודעות תקינות.

מניעת כפילות צריכה להיות עקבית גם כששני עיבודים מתחילים כמעט יחד. בתכנון בוחנים תיעוד מצב, תור או מנגנון שמונע ביצוע חוזר של אותה פעולה. אם הודעות יכולות להגיע בסדר שונה, קובעים איך מבררים את המצב העדכני. חתימה לבדה אינה פותרת replay, סדר אירועים או התאוששות מכשל.

מזהה שמגיע בכותרת שאינה מכוסה בחתימה אינו הוכחה קריפטוגרפית לייחוד האירוע. אין להציג שמירת מזהים בלבד כהגנת replay מלאה. משלבים מידע מאומת וכללי מצב של הפעולה, ובודקים את המגבלות של פרוטוקול הספק לפני שמבטיחים מה החיבור מונע.

GitHub: אירועים, מסירות חוזרות ומזהי מסירהOWASP: אבטחת קבלת ושליחת webhooks

דוגמה: אותה פנייה מגיעה ל-CRM פעמיים

בתרחיש להמחשה בלבד, טופס יוצר אירוע, המקבל שומר את הפנייה אך התשובה לשולח מתעכבת. הספק מנסה למסור שוב. בלי זיהוי עקבי נוצרים שני כרטיסים, ושני אנשי מכירות יכולים לפנות לאותו אדם. הבעיה אינה בהכרח תקיפה; היא יכולה לנבוע מתכנון חלקי של הטיפול החוזר.

בדיקת הקבלה משתמשת בנתוני ניסיון ובמנגנון בדיקה או מסירה חוזרת שהספק מאפשר. מצפים לפנייה עסקית אחת ולתיעוד מסירות שניתן לקשר אליה. לא משחזרים הודעת סליקה אמיתית ולא מפעילים חיוב כדי לבדוק כפילות. במקרה של אי התאמה משווים מזהים ופעולות לפני שמוחקים רשומות.

כתובות יעד, לוגים ותנאי סיום

אם המערכת שולחת הודעות לכתובות שמשתמשים מגדירים, יש לבחון גם SSRF, הגבלת יעדים, הפניות ורשתות פנימיות. אישור HTTPS של יעד אינו מוכיח שמותר לשרת לפנות אליו. זו בדיקה נפרדת מהחתימה על ההודעה שמתקבלת אצלכם.

לצורכי תפעול שמרו מזהה מעקב, זמן, מצב ותיאור שגיאה מצומצם, בלי סוד חתימה ובלי גוף הודעה מלא כברירת מחדל. הגדירו מי בוחן מסירות שלא הושלמו ואיך מתאמים ניסיון חוזר. טיפול אינו סגור עד שיש ראיה למסירה תקינה, למצב כפול ולכשל שניתן לברר, בהיקף הבדיקה המוסכם.

OWASP: אבטחת קבלת ושליחת webhooks
מקור מקצועי: GitHub: אימות חתימות של מסירות webhookמקור מקצועי: GitHub: אירועים, מסירות חוזרות ומזהי מסירהמקור מקצועי: OWASP: אבטחת קבלת ושליחת webhooks

תשובות ברורות

שאלות שעולות בנושא

כתובת webhook ארוכה וסודית מספיקה?

אין להסתמך עליה כאימות יחיד. כתובות עלולות להופיע בתיעוד ולוגים. משתמשים במנגנון האימות שהספק תומך בו ומגנים גם על כתובת הקצה.

חתימה תקינה מונעת עיבוד כפול?

לא, היא מסייעת לאימות המקור והשלמות בהתאם למנגנון. מניעת פעולה כפולה ובדיקת רלוונטיות האירוע הן בקרות נפרדות.

אפשר לחסום כל מסירה שנייה של אירוע?

צריך לתכנן לפי מצב הפעולה וחוזה הספק. ייתכן שהמסירה הראשונה נכשלה לפני השלמה. המטרה היא פעולה עסקית נכונה אחת, עם אפשרות התאוששות ותיעוד.

מתקדמים לפי הצורך

החיבור עובד אבל לא ברור איך הוא מטפל בכשל?

נגדיר יחד היקף, מנגנון אימות ובדיקות קבלה למסירות חוזרות ונתונים, בהתאם לספק ולמערכות שלכם.

לתיאום בדיקה וטיפול