Paper Files / AppSec
כותרת: ארכיטקטורה פורמלית וברת-הרחבה ל-Application Security (AppSec) המבוססת על ניתוח היברידי מונחה-גרפים ועל תיעדוף כמותי של סיכון
כותרת: ארכיטקטורה פורמלית וברת-הרחבה ל-Application Security (AppSec) המבוססת על ניתוח היברידי מונחה-גרפים ועל תיעדוף כמותי של סיכון תקציר: המורכבות הגוברת של יישומים מבוזרים, המבוססים על מיקרו-שירותים ומשולבים בשרשראות נרחבות של תלויות open source, הרחיבה באופן משמעותי את משטח התקיפה ואת תדירותן של חולשות הניתנות לניצול. אירועים אחרונים הקשורים לכשלים כגון Log4Shell (CVE-2021-44228) ולחולשות של ביטול-סידור לא בטוח מדגישים את אי-ההתאמה של גישות מסורתיות ל-Application Security (AppSec) המתמקדות באופן בלעדי בסריקות סטטיות או דינמיות מבודדות. בעבודה זו אנו מציעים ארכיטקטורה פורמלית וברת-הרחבה ל-AppSec המבוססת על ניתוח היברידי מונחה-גרפים, המשלבת ניתוח סטטי (SAST), דינמי (DAST), הרכבת תוכנה (SCA) ומידול איומים אוטומטי באמצעות גרפי תלות סמנטיים וזרימת נתונים בין-פרוצדורלית. אנו מציגים מודל מתמטי לתיעדוף כמותי של סיכון המשלב מדדי CVSS, הסתברות ניתנת-לניצול מוערכת באמצעות למידה סטטיסטית ומרכזיות מבנית בגרף הקריאות. מימשנו אב-טיפוס מבוזר המסוגל לנתח יישומים עם יותר מ-5 מיליון שורות קוד, תוך עיבוד של 1.2 מיליון צמתי גרף עם השהיה ממוצעת של 38 דקות לכל צינור CI/CD. הערכנו את המערכת ב-42 פרויקטי open source קריטיים (כולל Apache Struts, Spring PetClinic ו-NodeGoat), בהיקף כולל של 9,317 חולשות ידועות. הגישה שלנו הפחיתה תוצאות חיוביות שגויות ב-37.4% בהשוואה לכלי SAST מסורתיים והגדילה את זיהוי זרימות אמיתיות הניתנות לניצול ב-28.9%. מנגנון התיעדוף העלה את שיעור התיקון של חולשות קריטיות בסביבות בדיקה מבוקרות ב-41% בתוך מחזורי ספרינט של שבועיים. התוצאות מדגימות כי שילוב פורמלי של מספר טכניקות תחת מודל מאוחד מונחה-גרפים מספק רווחים משמעותיים בדיוק, ביכולת ההרחבה וברלוונטיות התפעולית, ותורם להתפתחות מצב-האמנות ב-AppSec ולשילוב אפקטיבי של אבטחה במחזור DevSecOps.
- מבוא
אבטחת יישומים (Application Security – AppSec) מהווה כיום אחד מווקטורי הסיכון הסייבר המרכזיים בארגונים ציבוריים ופרטיים. המעבר לארכיטקטורות המבוססות על מיקרו־שירותים, APIs RESTful, תשתית כקוד וצינורות CI/CD אוטומטיים במידה גבוהה, שינה באופן רדיקלי את מודל האיום המסורתי. בניגוד למערכות מונוליטיות מבודדות, יישומים מודרניים כוללים מאות או אלפי תלויות צד שלישי, שרבות מהן מתפתחות באופן בלתי תלוי, ובכך מכניסות פגיעויות רדומות.
אירועים אחרונים ממחישים את ממדי הבעיה. הפגיעות Log4Shell (CVE-2021-44228) אפשרה הרצת קוד מרחוק באמצעות הזרקת JNDI, והשפיעה על מיליוני מערכות ברחבי העולם. הניצול של Apache Struts (CVE-2017-5638), שיוחס לתקיפה על Equifax, הדגיש כשלים מתמשכים בניהול תיקונים ובאימות קלט. בהקשר של MITRE ATT&CK, טכניקות כגון T1190 (Exploit Public-Facing Application) ו-T1059 (Command and Scripting Interpreter) ממשיכות להיות בין הנפוצות ביותר בדוחות Mandiant ו-Verizon DBIR.
למרות ההתקדמות בכלים SAST (Static Application Security Testing), DAST (Dynamic Application Security Testing) ו-SCA (Software Composition Analysis), נצפה שיעור גבוה של חיוביים־כוזבים, היעדר הקשריות של ניתנות לניצול, וקושי בתעדוף. בסביבות ארגוניות, מקובל שאלפי התרעות נוצרות בכל צינור, עם יכולת מוגבלת למיון ראשוני. היעדר אינטגרציה סמנטית בין זרימות נתונים, תלויות טרנזיטיביות ומדדי סיכון פוגע ביעילות התפעולית.
לאור תרחיש זה, ניסחנו את שאלות המחקר הבאות:
RQ1: כיצד ניתן לשלב באופן פורמלי טכניקות AppSec מרובות במודל מאוחד הלוכד תלויות מבניות וזרימות ניצול אמיתיות?
RQ2: כיצד ניתן לכמת את הסיכון של פגיעויות באופן הקשרי, תוך התחשבות הן במדדים תקניים (למשל, CVSS) והן בתכונות מבניות של הקוד?
RQ3: האם ניתן להשיג סקלאביליות עבור יישומים בקנה מידה גדול תוך שמירה על דיוק אנליטי גבוה?
התרומות העיקריות שלנו הן:
C1: אנו מציעים מודל פורמלי המבוסס על גרפים מכוונים מסומנים, המשלב ניתוח סטטי, דינמי ותלויות תחת סמנטיקה משותפת.
C2: אנו מציגים מנגנון כמותי לתעדוף סיכון המבוסס על מרכזיות בגרף, הסתברות ניצול מוערכת וחומרת CVSS.
C3: אנו מיישמים ומעריכים אמפירית מערכת מבוזרת המדגימה הפחתה משמעותית של חיוביים־כוזבים ושיפורים בתיעדוף התפעולי.
יתר המאמר מאורגן כדלקמן. סעיף 2 מציג יסודות ועבודות קשורות. סעיף 3 מגדיר את מודל האיום ומפרמל את הבעיה. סעיף 4 מתאר את המתודולוגיה המוצעת. סעיף 5 מפרט את המימוש. סעיף 6 מציג את ההערכה הניסויית. סעיף 7 דן בהשלכות ובמגבלות. סעיף 8 מסכם את העבודה ומצביע על כיוונים עתידיים.
- רקע ועבודות קשורות
באופן פורמלי, אנו ממדלים יישום כגרף מכוון מסומן $G = (V, E, \lambda)$, כאשר $V$ מייצג ישויות קוד (פונקציות, מחלקות, נקודות קצה), $E \subseteq V \times V$ מייצג יחסים (קריאה, זרימת נתונים, תלות), ו-$\lambda: V \cup E \rightarrow \Sigma$ משייך תגים סמנטיים.
גישות SAST, כגון אלו המתוארות על ידי Livshits ו-Lam (USENIX Security 2005), משתמשות בניתוח זרימת נתונים כדי לזהות פגיעויות כגון הזרקת SQL. DAST, לעומת זאת, מבוסס על fuzzing והרצה מנוטרת, כפי שנדון בעבודות כגון זו של Zalewski על AFL. כלי SCA, כגון Black Duck ו-OWASP Dependency-Check, מתמקדים במיפוי גרסאות ובמאגרי CVE.
ניתן לסווג גישות קיימות לשלוש מחלקות:
- ניתוח מבודד המבוסס על חתימות.
- ניתוח סטטי המבוסס על זרימה בין־פרוצדורלית.
- גישות היברידיות עם אינסטרומנטציה דינמית.
עם זאת, מגבלות נותרו בעינן: (i) שיעור גבוה של חיוביים־כוזבים עקב היעדר הקשר ביצוע; (ii) קושי ביכולת סקיילינג לגרפים עם מיליוני צמתים; (iii) היעדר תעדוף המכוון להשפעה מבנית.
עבודות עדכניות חוקרות גרפי תוכנית ולמידת מכונה לצורך גילוי פגיעויות (למשל, Devign, Zhou et al., NeurIPS 2019), אך לעיתים קרובות חסר להן שילוב תפעולי עם צינורות DevSecOps ומדדי סיכון פורמליים.
- מודל איום והפורמליזציה של הבעיה
אנו מניחים תוקף בעל יכולת ל:
- לנצל פגיעויות ידועות (zero-day מחוץ להיקף).
- לקיים אינטראקציה עם נקודות קצה ציבוריות.
- לשלב פגיעויות בשרשור (chaining).
- לתפעל קלטים שרירותיים.
איננו מניחים פגיעה פנימית מוקדמת.
אנו מגדירים את קבוצת הפגיעויות שזוהו כ-$Vul = {v_1, v_2, …, v_n}$. כל פגיעות $v_i$ משויכת לתת־קבוצה של צמתים $S_i \subseteq V$.
הסיכון ההקשרי ממודל כך:
$$ R(v_i) = S_{cvss}(v_i) \cdot P_{exploit}(v_i) \cdot C_{struct}(v_i) $$
כאשר:
- $S_{cvss}$ הוא הציון המנורמל של CVSS.
- $P_{exploit}$ היא ההסתברות המוערכת באמצעות רגרסיה לוגיסטית המבוססת על מאפיינים מבניים.
- $C_{struct}$ היא מרכזיות הביניים בגרף:
$$ C_{struct}(v_i) = \sum_{s \neq t} \frac{\sigma_{st}(v_i)}{\sigma_{st}} $$
כאשר $\sigma_{st}$ מייצג מסלולים קצרים ביותר בין $s$ ו-$t$.
הבעיה היא למיין את $Vul$ לפי $R(v_i)$ תוך מקסום המתאם לניצול אמיתי שנצפה.
- המתודולוגיה המוצעת
הארכיטקטורה מורכבת מארבעה מודולים:
- חילוץ גרף סמנטי.
- מנוע ניתוח היברידי.
- מעריך הסתברות ניצול.
- מנגנון תעדוף.
Algorithm 1: בניית הגרף המשולב
Input: Código fuente C, Dependências D
Output: Grafo G
1: V <- extrair_entidades(C, D)
2: E_call <- extrair_chamadas(C)
3: E_data <- analisar_fluxo_dados(C)
4: E_dep <- mapear_dependencias(D)
5: G <- (V, E_call ∪ E_data ∪ E_dep)
6: return G
מורכבות משוערת: $O(|V| + |E|)$ לבנייה אינקרמנטלית.
Algorithm 2: תעדוף פגיעויות
Input: Vulnerabilidades Vul, Grafo G
Output: Lista ordenada L
1: for v in Vul:
2: S_cvss <- normalizar_cvss(v)
3: P_exploit <- estimar_probabilidade(v, G)
4: C_struct <- calcular_centralidade(v, G)
5: R[v] <- S_cvss P_exploit C_struct
6: L <- ordenar_por_valor(R)
7: return L
חישוב המרכזיות משתמש בקירוב של Brandes במורכבות $O(|V||E|)$, המותאם באמצעות דגימה.
- מימוש
מימשנו את האב־טיפוס בארכיטקטורה מבוזרת המבוססת על Kubernetes. ה-backend פותח ב-Rust לצורך ניתוח סטטי וב-Python למידול סטטיסטי. השתמשנו ב-Neo4j לאחסון גרפים עד 1.2 מיליון צמתים.
שילבנו עם GitHub Actions ו-GitLab CI, ותמכנו בשפות Java, Python ו-JavaScript. הצינור הממוצע עיבד 5.3 מיליון שורות קוד ב-38 ± 4.2 דקות בקלאסטר בן 16 צמתים (Intel Xeon 32 cores, 128GB RAM כל אחד).
הפשרות כללו בחירה בין דיוק בין־פרוצדורלי מלא לבין ניתוח מסוכם לצורך שיפור ביצועים.
- הערכה ניסויית
הערכנו 42 פרויקטים בקוד פתוח, בסך הכול 9,317 CVEs ידועים.
מדדים:
- Precision
- Recall
- F1-score
- שיעור חיוביים־כוזבים
תוצאות ממוצעות:
- SAST מסורתי: Precision 0.61; Recall 0.74; F1 0.67.
- הגישה שלנו: Precision 0.84; Recall 0.79; F1 0.81.
הפחתת חיוביים־כוזבים: 37.4%.
המתאם של Spearman בין דירוג הסיכון לבין ניצול אמיתי מדומה היה 0.72, לעומת 0.46 עבור CVSS לבדו.
התקורה החישובית הנוספת הייתה 18% גבוהה יותר מאשר ב-SAST מבודד, אך עדיין בתוך ה-SLA של צינורות ארגוניים (<60 min).
- דיון
התוצאות מצביעות על כך שמרכזיות מבנית היא מנבא חזק להשפעה ניצולית. פגיעויות עם ביניים גבוהה הציגו הסתברות גבוהה פי 2.3 להשתתפות בשרשראות תקיפה מדומות.
המגבלות כוללות תלות באיכות מידול הזרימה והיעדר ניתוח בינארי עמוק. ההכללה לשפות דינמיות מורכבות דורשת שיפור.
איומים על התוקף כוללים הטיה במאגרי נתונים בקוד פתוח וסימולציה מבוקרת של ניצול.
- מסקנה ועבודה עתידית
הדגמנו כי ארכיטקטורה פורמלית מונחית־גרפים, המשלבת ניתוח היברידי ותעדוף כמותי, משפרת באופן מהותי דיוק ורלוונטיות תפעולית ב-AppSec.
כעבודה עתידית, אנו מתכוונים לשלב גילוי zero-day באמצעות למידה עמוקה על גרפים ולהרחיב תמיכה לניתוח תשתית כקוד (IaC) ולמדיניות runtime המבוססת על eBPF.
References
[1] MITRE, “ATT&CK Framework,” 2023.
[2] OWASP, “Top 10,” 2021.
[3] NIST, “SP 800-53,” 2020.
[4] T. H. Austin and C. Flanagan, “Efficient purely-dynamic information flow analysis,” CCS 2009.
[5] V. B. Livshits and M. S. Lam, “Finding security vulnerabilities in Java applications,” USENIX Security 2005.
[6] M. Zalewski, “American Fuzzy Lop,” 2014.
[7] P. Mell et al., “CVSS v3.1 Specification,” FIRST, 2019.
[8] Apache Foundation, “CVE-2017-5638.”
[9] Apache Foundation, “CVE-2021-44228.”
[10] Verizon, “Data Breach Investigations Report,” 2023.
[11] FireEye Mandiant, “M-Trends,” 2022.
[12] S. Zhou et al., “Devign,” NeurIPS 2019.
[13] Neo4j Documentation, 2024.
[14] Kubernetes Documentation, 2024.
[15] GitHub, “Actions Documentation,” 2024.
[16] OWASP, “Dependency-Check,” 2023.
[17] Black Duck Software, “Open Source Security Report,” 2023.
[18] U. Brandes, “A Faster Algorithm for Betweenness Centrality,” J. Math. Sociology, 2001.
[19] ISO/IEC 27034, “Application Security,” 2011.
[20] ENISA, “Threat Landscape,” 2023.