איור טכני מופשט על רקע אפור־חם חיוור: פאנל הגדרות גבוה בגוון לבן־שבור נמצא משמאל למרכז, ולו שורות דקות ומסורגות, והשדה התחתון ביותר שלו מכיל שני סימני סוגריים זוויתיים קטנים ומקוננים בציאן, אחד בתוך השני. קו ציאן דק עובר מהפאנל אל בלוק שרת שטוח בצבע צפחה מימין; קו ענבר שני יוצא מהסימנים המקוננים, חוצה את גבול הפאנל ומגיע לאותו בלוק, וריבוע ענבר קטן מסמן את נקודת המפגש שבה שני הנתיבים מתפצלים. בלוק שרת שני ועמום יותר נמצא מאחורי הראשון. היצירה היא גאומטריית וקטור שטוחה עם צללים רכים ושוליים נדיבים; אין בה טקסט, אותיות, מספרים, אנשים או לוגואים של ארגונים. הלוגו של OrcaRouter מורכב בפינה הימנית התחתונה של רצועה לבנה מתחת ליצירה.
AI Safety Incidents

RCE בסוכן ה-AI של Zammad: תג תבנית מקונן ותיקון של אות אחת

מחבר

Alistair Wren

תאריך פרסום

מודלים אחרונים · 20צפו בכל המודלים →
בנצ'מרקים: Artificial Analysis · מתעדכן יומית
חזרה לכל הפוסטים

Zammad, מערכת מוקד התמיכה בקוד פתוח, שחררה את גרסה 7.1.2 ב-4 באוגוסט 2026 עם שמונה עשרה תיקוני אבטחה; הראשון ברשימה סוגר פרצת הרצת קוד מרחוק בשדות התצורה של תכונת AI Agent שלה. החולשה היא CVE-2026-84462, שנחשפה בהודעת GitHub GHSA-gp3x-9xm8-rcj6 באותו יום, וטווח ההשפעה שלה הוא כל התקנה באחסון עצמי בגרסה עד 7.1.1 כולל. מנהל שיכול ליצור או לערוך AI Agent יכול היה להזין טקסט שנבנה במיוחד באחד משדות הסוכן, לעקוף את המסנן שנועד לנטרל אותו, ולהריץ פקודות שרירותיות בשרת שמארח את Zammad — עם הפוטנציאל, בלשון ההודעה, "לקרוא, לשנות או להשמיד את כל הנתונים המאוחסנים בשרת הזה". אין צורך שמשתמש אחר יפעל: בהודעה נאמר כי "הקוד הזדוני פועל אוטומטית בפעם הבאה שה-AI Agent הפגוע מעבד פנייה". GitHub מדרגת אותה כגבוהה ב-8.6 לפי CVSS 4.0. הרשומה, תגי החומרה והנזק שלה, והרשומות שנרשמו סביבה נשמרים בthe Orca AI Incident Archive, שמפרט את התקרית הזו לצד שאר הסדרה.

מה שההנחיה קובעת

הייעוץ של GitHub, שפורסם ב-4 באוגוסט 2026, קצר ומפורט באופן יוצא דופן בנוגע למנגנון ולתנאים המקדימים. הוא מתאר "מסנן אבטחה שמגן על תצורת ה-AI Agent של Zammad" אשר "ניתן לעקוף על ידי הזנת טקסט שנבנה במיוחד לאחד מהשדות של AI Agent", והוא מציין את הגורם במדויק: "מנהל מערכת עם הרשאה ליצור או לערוך AI Agents יכול לנצל זאת כדי להריץ פקודות שרירותיות בשרת שמארח את Zammad." הטווח המושפע מתועד עד וכולל גרסה 7.1.1, והגרסה המתוקנת היא 7.1.2. המדווח שזוכה הוא colinthebomb1; חשבון המפרסם הוא fliebe92. הייעוץ אינו מפרסם הוכחת היתכנות או פרטי ניצול.

GitHub מדרג את הפגם כגבוה, 8.6 לפי CVSS 4.0, עם הווקטור AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H וללא שינוי היקף. בקריאה מילולית, זה אומר שהפגם נגיש דרך הרשת במורכבות נמוכה, ללא דרישות תקיפה וללא אינטראקציית משתמש, על ידי תוקף שכבר מחזיק בהרשאות גבוהות בתוך היישום, עם השפעה גבוהה על הסודיות, השלמות והזמינות של מופע ה-Zammad עצמו. הודעת הייעוץ מונה שלוש חולשות: CWE-20, אימות קלט לא תקין; CWE-94, הזרקת קוד; ו-CWE-1336, מחלקת מנוע התבניות ש-MITRE מגדיר ככישלון בנטרול תחביר מיוחד "שיכול להתפרש כביטויי תבנית או כהוראות קוד אחרות כאשר הוא מעובד על ידי המנוע."

התיקון שינה אות אחת

התיקון הציבורי הוא הקומיט e3b0c8df91ad2108c8305be23e8fe6f73fb9718d, שנשלח עם ההודעה "תחזוקה: שיפור ה-ERB sanitizer." GitHub רושם תאריך מחבר של 7 ביולי 2026 ותאריך קומיט של 3 באוגוסט 2026, יום אחד לפני ההתראה והשחרור. הוא נוגע בשני קבצים: שורה אחת של lib/erb_sanitizer.rb, וארבעה עשר שורות מפרט שנוספו.

השורה האחת היא כל התיקון. המתודה escape_tag השתמשה ב-sub של Ruby, שמחליף את ההתאמה הראשונה של תבנית במחרוזת; כעת היא משתמשת ב-gsub, שמחליף כל התאמה. בשתי הגרסאות ההחלפה זהה: פותח שנכתב כ-<% הופך ל-<%%, הצורה המוכפלת ש-ERB, מנוע התבניות של Ruby, מציג כטקסט מילולי במקום להעריך. הודעת הייעוץ לא מציינת איזה שדה ב-AI Agent נושא את התבנית; הקומיט מזהה את המסנן שהיה אמור להפוך את התבנית הזו ללא-פעילה.

A dark HTML card titled 'One line, one letter', kicker 'Zammad fix commit e3b0c8f', subtitle 'lib/erb_sanitizer.rb, method escape_tag, authored 7 July 2026 and committed 3 August 2026 - one day before disclosure'. Two code panels: BEFORE, in amber, shows a red minus beside tag.sub with the opener arguments and the note 'Replaces the first opener only'; AFTER, in cyan, shows a green plus beside tag.gsub and the note 'Replaces every opener'. A second panel headed 'WHY ONE LETTER MATTERED' shows the payload, a literal opener followed by an evaluating tag, arrowed to the same string with the first opener doubled, and explains that the inner tag is never touched. A third row headed 'REGRESSION SPEC, SAME COMMIT' shows the two nested payloads the added tests cover, with the note 'Both must render as literal text, not evaluate'. A footer names commit e3b0c8df91ad2108c8305be23e8fe6f73fb9718d and says the card was rendered by OrcaRouter with no vendor logos. The OrcaRouter logo is composited in the bottom-right corner.

באמצעות sub, רק הפותח הראשון במחרוזת נוטרל. מטען שמציב פותח שני מיד לאחר הראשון שורד את הסינון: <%<%= 1 + 1 %> הופך ל-<%%<%= 1 + 1 %>, כאשר ERB פולט את הפותח המוביל כטקסט ואז מעריך את התג הפנימי. מפרט הרגרסיה שנוסף באותו קומיט מכנה את התחבולה בפשטות — "עם פותח מקונן שהוברח בתוך תג יחיד (עקיפת escape-all-openers)" — וקובע שגם <%<%= 1 + 1 %> וגם <%<%<%= 1 + 1 %> המקונן פעמיים חייבים להיות מוצגים כטקסט מילולי. המפרט הזה הוא התיאור הציבורי הברור ביותר של האופן שבו עקפו את הסינון, משום שהייעוץ עצמו אינו מספק שום תיאור.

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

שבעה שבועות מהתראה ל-NVD

NVD פרסמה את הרשומה שלה עבור CVE-2026-84462 ב-25 בספטמבר 2026, שבעה שבועות לאחר הייעוץ, ועדכנה אותה לאחרונה ב-28 בספטמבר. הרשומה מסומנת "Deferred", כלומר הסוכנות לא פרסמה ניתוח משלה, ובלוק המדדים שלה מייחס את הציון 8.6 לכתובת security-advisories@github.com כמדד משני — הניקוד של GitHub כרשות המספור של CVE, ולא הערכה עצמאית של NVD. באותה רשומה אין כלל תצורת CPE, ולכן היא אינה ממפה את הפגיעות למזהה מוצר עם גרסה.

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

A dark HTML timeline card titled 'From commit to CVE record', kicker 'Zammad 7.1.2 - CVE-2026-84462', subtitle 'Five dated points, taken from the fix commit, the GitHub advisory, the Zammad release note and the NVD API'. Five rows: 7 July 2026, fix authored in commit e3b0c8f with the message 'Maintenance: Improve ERB sanitizer'; 3 August 2026, fix committed one day before disclosure; 4 August 2026, GitHub advisory GHSA-gp3x-9xm8-rcj6 published and Zammad 7.1.2 shipped the same day with 18 security fixes; 25 September 2026, NVD publishes CVE-2026-84462 with status Deferred and no CPE configuration, 52 days after disclosure; 29 October 2026, FIRST EPSS read at 0.28 percent probability in 30 days, 20th percentile. An amber rule below reads 'The advisory and the CVE record describe the same flaw. The first was actionable on 4 August; the second arrived as a machine-readable record 52 days later.' A footer credits GitHub, Zammad, NVD and FIRST, and says the card was rendered by OrcaRouter. The OrcaRouter logo is composited in the bottom-right corner.

מה מבוסס, ומה לא

מבוסס: ייעוץ האבטחה, הגרסה המתוקנת, ציון CVSS ושינוי הקוד — כולם מגיעים מ-Zammad וממאגר ייעוצי האבטחה של GitHub, והם תואמים זה לזה. הרשומה של NVD משחזרת את התיאור של רשות המספור בלי להוסיף ניתוח משלה. הארכיון מדרג את הערך ברמת ביטחון A על בסיס זה, כאשר האירוע אינו שנוי במחלוקת.

לא הוכח, או לא תועד: אין הוכחת היתכנות בהודעת האבטחה ואין דיווח על ניצול בשטח. ה-EPSS של FIRST מעניק ל-CVE-2026-84462 הסתברות של 0.28 אחוז לניצול בשלושים הימים הבאים, באחוזון ה-20, בציון שפורסם ב-29 באוקטובר 2026. הארכיון אינו מתעד נזק ממשי, ומסווג את הרשומה בחומרה בינונית — מתחת לרצועת High של הודעת האבטחה עצמה. אלה כלים נפרדים העונים על שאלות שונות — מה הפגם יאפשר לעומת מה שידוע שהתרחש — והכתבה הזו מדווחת על שניהם במקום ליישב ביניהם.

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

מי יכול היה להפעיל את זה, ומה השתנה

הערות השחרור של Zammad עבור 7.1.2, dated 4 באוגוסט 2026, מפרטות את שמונה עשרה הפגיעויות שתוקנו בגרסה זו ומציבות את עקיפת התבנית של AI Agent במקום הראשון. ללקוחות מתארחים נאמר: "אין צורך בפעולה. המופעים שלכם כבר תוקנו ומאובטחים על ידי הצוות שלנו." עבור התקנות באחסון עצמי זה חד יותר: "אנו ממליצים בחום לשדרג לגרסה העדכנית ביותר של Zammad באופן מיידי כדי להבטיח שהמערכת שלכם מוגנת." הייעוץ אינו מציע פתרון חלופי, והרשומה אינה כוללת שום הקלה מעבר לשדרוג.

A dark HTML card titled 'Who can pull the trigger', kicker 'CVE-2026-84462 - preconditions', subtitle 'From the GitHub advisory and the Zammad 7.1.2 release note; the score and exploitation figure are labelled separately'. Left column headed 'THE ATTACKER MUST' lists three conditions: hold administrator rights inside Zammad, specifically permission to create or edit AI Agents; reach the agent configuration over the network; supply no interaction from any other user. Right column headed 'THE PAYLOAD THEN' lists three consequences: runs on the server that hosts Zammad, not in a browser; fires the next time the agent processes a ticket; can read, modify or destroy all data on that server, according to the advisory. A statistics strip reads 8.6 CVSS 4.0 High, PR:H high privileges required, UI:N no user interaction, C:H I:H A:H all three impacts high, and 0.28 percent EPSS on 29 October 2026. Three flags below read Affected: Zammad up to and including 7.1.1; Fixed: 7.1.2, released 4 August 2026; Stated remedy: upgrade, no workaround published. A closing panel notes that the advisory publishes no proof of concept and that the regression spec in the fix commit is the clearest public description of the bypass. A footer says hosted instances were already patched and self-hosted installations must reach 7.1.2. The OrcaRouter logo is composited in the bottom-right corner.

דרישת ההרשאה ראויה לבחינה מדוקדקת יותר מזו שהווקטור מעניק לה. PR:H משמעו שהתוקף זקוק לגישה משמעותית לפני שהפגם שמיש, וכאן הגישה הזו היא הרשאת admin.ai_agent שלדברי התיעוד של Zammad נדרשת בכלל כדי לעבוד עם AI Agents. בדלפק שירות, מדובר לרוב באחראי צוות שירות שמכוונן מסווגים, מתייגים ומחלצי טקסט — לא בהכרח האדם שמנהל את השרת. הניסוח של הודעת הייעוץ עצמה, "מנהל עם הרשאה ליצור או לערוך AI Agents", צר יותר מ"כל אחד" ורחב יותר מ"root". אם לא ניתן לבצע שדרוג מיידית, צמצום מי שמחזיק בהרשאה הזו מקטין את מאגר האנשים שיכולים להגיע לנתיב הקוד; זו הסקה מהווקטור ומהתיעוד, ולא תיקון שהספק פרסם.

אף אחד מהמסמכים העיקריים אינו מציב מודל שפה בנתיב הניצול. הפקודה פועלת בתוך תהליך ה-Ruby של Zammad כאשר התצורה של הסוכן מעובדת; שום דבר בהודעת הייעוץ, בקומיט או בהערת השחרור אינו מתאר שהמודל מייצר את ה-payload. תכונת AI Agent מספקת את השדה הניתן לכתיבה על ידי מנהל המערכת ומעובד כתבנית, וה-AI הוא משטח החשיפה ולא המנגנון. זהו הדפוס שהרשומה מצביעה עליו: הגדרת הסוכן — ההוראות, התבניות והמסננים שלה — היא תצורה ניתנת להרצה, שנערכת בידי אנשים שעבודתם היא עבודת תמיכה, ולא ביקורת אבטחה.

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