הזרקת XML היא מניפולציה של קלט XML כדי לשנות את האופן שבו יישום מפרש או מפרש נתונים. היא מתרחשת כאשר קלט הנשלט על ידי המשתמש מוחדר למסמך XML ללא אימות נאות, מה שמאפשר לתוקפים להזריק צמתים, תכונות, ישויות או מטענים המשנים את זרימת הבקרה, עוקפים את ההיגיון או מפעילים התנהגויות מסוכנות של המפרש. במערכות האקולוגיות של ימינו, הכבדות ב-API ומונעות אינטגרציה, הזרקת XML נותרת איום ממשי שצוותי האבטחה אינם יכולים להתעלם ממנו.
בניגוד לחבלה פשוטה בקלט, הזרקת XML מנצלת את כוח הביטוי של XML עצמו, ומשפיעה על מערכות מורכבות, כולל SOAP, SAML, מכשירי IoT, אינטגרציות ארגוניות ומערכות פיננסיות מסורתיות.
מדוע הזרקת XML עדיין חשובה
למרות ש-JSON שולט ביישומים מודרניים, XML מוטמע עמוק בתוכנות ארגוניות, בפרוטוקולי אימות ובאינטגרציות אחוריות. תוקפים יכולים לנצל לרעה מבני XML כדי:
- לשנות את הלוגיקה העסקית
- הזרקת צמתים לא מורשים
- לערוך שאילתות XPath
- הפעלת חשיפת קבצים בסגנון XXE
- שבירת אימות סכימה
- גורם למניעת שירות מבוססת XML
הגמישות של XML הופכת את השימוש הבלתי נאות בו למסוכן במיוחד.
דוגמה אמיתית ל-CVE: CVE-2025-13526
CVE-2025-13526 מדגים כיצד תצורה שגויה של ניתוח XML פשוט עלולה להוביל לחשיפת קבצים מלאה. המערכת אפשרה העלאת קבצי תצורה XML, אך לא הצליחה להשבית את פתרון הישויות החיצוניות.
דוגמה למטען זדוני:
xml
<!DOCTYPE data [
]>
&xxe;
השרת החזיר את התוכן של /etc/passwd, המדגים כיצד הזרקת XML בשילוב עם XXE עלולה לחשוף קבצים קריטיים.
משטחי תקיפה של הזרקת XML
התוקפים מנצלים לרעה:
- הזרקת צומת
- הזרקת תכונות
- מניפולציה של שאילתות XPath
- מניפולציה של סכמה (XSD)
- מטעני XXE
- הרחבת ישויות עבור DoS
- עקיפת לוגיקה בתוך זרימות עבודה מבוססות XML
כל קטגוריה משפיעה על שכבה אחרת של המערכת.
דוגמאות להתקפה (אותה כמות נשמרה)
- מניפולציה של הזרקת צמתים
xml
מוצר Aפריט>הזמנה>
מטען מוזרק:
pgsql
true
ה-XML שנוצר נפגם מבחינה מבנית ועשוי להעניק הרשאות לא מורשות.
הזרקת XPath
פייתון
שאילתה = f"//users/user[username/text()='{user}']"
קלט זדוני:
לנזוף
' או '1'='1
זה חושף רשומות משתמשים לא מורשים.
מטען XXE
xml
<!DOCTYPE foo [
]>&payload;
מניפולציה של סכמות
xml
<xs:element name="amount" type="xs:string"/>
פעולה זו מבטלת את התנהגות האימות הצפויה.
מיליארד צחוקים DoS
xml
<!ENTITY a "ha"><!ENTITY b "&a;&a;"><!ENTITY c "&b;&b;">
התרחבות מסיבית מעמיסה על המנתח.
טכניקות הגנה
השבת פתרון ישויות
פייתון
parser = etree.XMLParser(resolve_entities=False, no_network=True)
השתמש בספריות בטוחות
פייתון
ייבא defusedxml.ElementTree כ-ET
אימות סכמה חזק
פייתון
schema.validate(input_xml)
לעולם אל תחבר מחרוזות XML
גישה בטוחה יותר:
פייתון
el = Element("user") name_tag.text = user_input
טבלה השוואתית
| סוג | יעד | חומרה | השפעה |
|---|---|---|---|
| הזרקת XML | מניפולציה של מבנים | בינוני-גבוה | עקיפת לוגיקה |
| הזרקת XPath | בקרת שאילתות | גבוה | גישה לא מורשית |
| XXE | שימוש לא נכון ב-Parser | גבוה | קריאת קובץ / SSRF |
| הזרקת סכמה | עקיפת אימות | בינוני | סיכוני יושרה |

הזרקת XML בבדיקות חדירה אוטומטיות
פלטפורמות בדיקת חדירה מודרניות המונעות על ידי בינה מלאכותית, כגון Penligent, מבצעות מוטציה מבנית, פוזינג XML, בדיקת מטען XPath וזיהוי תצורה שגויה של מפרש. פלטפורמות אלה:
- גלה משטחי תקיפה מבוססי XML
- זהה נקודות הזרקה
- התנהגות סכימה של למידה אוטומטית
- יצירת מטענים אדפטיביים
- אמת את התנהגות המנתח תחת תצורות מרובות
זה מרחיב באופן משמעותי את כיסוי הזיהוי.
קווי בסיס אבטחה והמלצות לתיקונים אוטומטיים
פלטפורמות אוטומטיות יכולות גם לספק:
- ביקורות תצורת המנתח
- איתור ספריות XML לא בטוחות
- אימות הגדרות פתרון ישויות
- אכיפת אימות XSD קפדני
- חסימת CI/CD של פעולות XML לא מאובטחות
זה הופך את הזיהוי לתיקון בר-ביצוע.
תסריט לדוגמה
כללי Semgrep — הזרקת XML ב-Python / XXE / ניתוח לא בטוח
צור קובץ:
semgrep-rules/python-xml-injection.yaml
yaml
`כללים:
כלל 1: שימוש לא בטוח ב-xml.etree – מפרש ברירת המחדל פגיע ל-XXE
- id: python-unsafe-xml-etree חומרה: שגיאה הודעה: | xml.etree.ElementTree אינו בטוח עבור XML שאינו מהימן. הוא אינו מבטל את הרחבת הישויות החיצוניות כברירת מחדל. השתמש ב-defusedxml במקום. מטא-נתונים: cwe: "CWE-611" owasp: "A04:2021 ישויות חיצוניות ב-XML" תבניות:
- תבנית: | ייבוא xml.etree.ElementTree כ-ET שפות: [python]
כלל 2: שימוש ישיר ב-xml.dom.minidom – מפרש XML לא בטוח
- id: python-unsafe-xml-minidom חומרה: שגיאה הודעה: | xml.dom.minidom אינו מבטל DTDs או הרחבת ENTITY. אל תשתמש בו עבור XML שאינו אמין. מטא-נתונים: cwe: "CWE-611" תבנית: | import xml.dom.minidom שפות: [python]
כלל 3: lxml XMLParser מסוכן עם resolve_entities=True
- id: python-lxml-resolve-entities-enabled חומרה: ERROR הודעה: | lxml XMLParser() עם resolve_entities=True מאפשר XXE. הגדר resolve_entities=False ו-load_dtd=False. מטא-נתונים: cwe: “CWE-611” תבנית: | XMLParser(resolve_entities=True, …) שפות: [python]
כלל 4: lxml עם load_dtd=True – מסוכן
- id: python-lxml-load-dtd חומרה: אזהרה הודעה: | load_dtd=True מאפשר עיבוד DTD ועשוי לאפשר הרחבת ישויות. יש להשבית אלא אם כן הדבר נחוץ בהחלט. מטא-נתונים: cwe: "CWE-611" תבנית: | XMLParser(load_dtd=True, …) שפות: [python]
כלל 5: תצורת מפרש בטוחה חסרה בעת שימוש ב-lxml.fromstring()
- id: python-lxml-fromstring-no-safe-config חומרה: אזהרה הודעה: | lxml.fromstring() נקרא ללא XMLParser מחוזק. ודא ש-resolve_entities=False, no_network=True. מטא-נתונים: cwe: “CWE-611” תבניות:
- תבנית: | מ-lxml ייבוא etree – תבנית: | etree.fromstring($XML) שפות: [python]
כלל 6: אי שימוש ב-defusedxml בעת ניתוח XML חיצוני
- id: python-defusedxml-not-used חומרה: INFO הודעה: | שימוש חסר ב-defusedxml, מומלץ לניתוח XML מאובטח ב-Python. מטא-נתונים: cwe: “CWE-611” pattern-either:
- תבנית: | ET.parse($X) – תבנית: | etree.parse($X) שפות: [python]
כלל 7: xmltodict ללא אילוץ מפרש מנוטרל
- id: python-xmltodict-unsafe חומרה: אזהרה הודעה: | xmltodict יכול להפעיל מפרש XML בסיסי המאפשר XXE. השתמש
defusedxmlבמקום זאת, משתמשים במנתח תחבירי. תבנית: | xmltodict.parse($X) שפות: [python]
כלל 8: שימוש מסוכן ב-eval() בקלט שמקורו ב-XML
- id: python-eval-from-xml חומרה: קריטית הודעה: | eval() על קלט שמקורו ב-XML עלול להוביל ל-RCE. לעולם אל תעריך ערכי XML מפורשים ישירות. מטא-נתונים: cwe: "CWE-95" owasp: "A03:2021 הזרקה" תבניות:
- תבנית: | $VAL = $XML.xpath(…) – תבנית: | eval($VAL) שפות: [python]
כלל 9: עומסים לא בטוחים על נתונים שמקורם ב-XML
- id: python-pickle-on-xml חומרה: קריטית הודעה: | pickle.loads() על קלט שמקורו ב-XML עלול להוביל לביצוע קוד שרירותי. הימנע משימוש ב-pickle על נתוני משתמש. מטא-נתונים: cwe: "CWE-502" תבניות:
- תבנית: | $DATA = etree.fromstring(…) – תבנית: | pickle.loads($DATA) שפות: [python]`
סורק SAST מלא ב-Python
זה משלים את Semgrep על ידי סריקה אחר תבניות מסוכנות, כולל:
- ייבוא לא בטוח של מפרש XML
- שימוש ב-ENTITY / DOCTYPE
eval,exec,מלפפון חמוץ,מרשל,yaml.loadדפוסים- XXE מפעיל ב
.xml,.xsd,.wsdlקבצים
צור: python_sast_scanner.py
פייתון
`#!/usr/bin/env python3″”” python_sast_scanner.py סורק SAST קל משקל ומהיר המיועד במיוחד ל-Python ומתמחה ב:
- הזרקת XML / XXE
- שימוש לא בטוח ב-parser
- פונקציות מסוכנות (eval, exec, pickle.loads, yaml.load) בטוח עבור CI; אינו מבצע כל קוד. פלט JSON ויציאה שאינה אפסית על ממצאים. “””import os, re, json, sys PATTERNS = {# XML / XXE "xml_etree": r"import\s+xml\.etree\.ElementTree","xml_minidom": r"import\s+xml\.dom\.minidom","lxml_resolve_entities": r"resolve_entities\s*=\sTrue", "lxml_load_dtd": r"load_dtd\s=\s*True”,”doctype_in_xml”: r”<!DOCTYPE”,”entity_in_xml”: r”<!ENTITY”,

פונקציות מסוכנות
"eval_usage": r"\\beval\\s*\\(","exec_usage": r"\\bexec\\s*\\(","pickle_loads": r"pickle\\.loads\\s*\\(","marshal_loads": r"marshal\\.loads\\s*\\(","yaml_unsafe_load": r"yaml\\.load\\s*\\(",
} IGNORED = {".git", "venv", "env", "pycache", "dist", "build", "node_modules"} def scan_file(path): findings = []try:with open(path, "r", encoding="utf-8", errors=”ignore”) as f:for i, line in enumerate(f, 1):for rule, regex in PATTERNS.items():if re.search(regex, line): findings.append({“rule”: rule,”line”: line.strip(),”lineno”: i, })except Exception:pass return findings def walk(root=”.”): results={}for dp, dirs, files in os.walk(root): dirs[:] = [d for d in dirs if d not in IGNORED]for f in files:if f.endswith((“.py”,”.xml”,”.xsd”,”.wsdl”)): full = os.path.join(dp, f) hits = scan_file(full)if hits: results[full] = hitsreturn results def main(): root = sys.argv[1] if len(sys.argv)>1 else “.” results = walk(root)print(json.dumps({“results”: results, “file_count”: len(results)}, indent=2))if results: sys.exit(3) sys.exit(0) if name == “main”: main()`
מה זה מכסה – היקף SAST ב-Python
הזרקת XML / XXE
✔ מפרשי XML לא בטוחים ✔ lxml עם resolve_entities=True ✔ טעינת DTD (עלולה להיות מסוכנת) ✔ סמני XXE בקבצי XML מאוחסנים
הזרקת קוד
✔ eval() ✔ exec()
דה-סריאליזציה לא בטוחה
✔ pickle.loads() ✔ marshal.loads() ✔ לא בטוח yaml.load()
דפוסים מסוכנים אחרים
✔ ENTITY / DOCTYPE ב .xml, .xsd, .wsdl ✔ xmltodict ללא מפרש מחוזק
סיכום
הזרקת XML נותרה קטגוריה רלוונטית ומסוכנת של פגיעות. השפעתה נעה מעקיפת לוגיקה עסקית ועד חשיפת קבצים ומניעת שירות. הבנת התנהגות XML, אבטחת מפרסים, אימות מבנה ושילוב בדיקות חדירה אוטומטיות הם צעדים חיוניים להבטחת אבטחת יישומים חזקה.

