מתקפת Deserialization¶
מבוא¶
חולשת Deserialization Attack היא מתקפה שבה תוקף מנצל תהליך של דיסריאלזציה (deserialization) של נתונים על מנת להריץ קוד זדוני או לשנות את ההתנהגות של האפליקציה. המתקפה נפוצה כאשר יישומים מקבלים קלט מהמשתמש, מסדרים אותו (serialize), ושומרים אותו או מעבירים אותו הלאה, ולאחר מכן מבצעים עליו ביטול סידור (deserialize) מבלי לוודא שהתוכן בטוח.
כיצד עובדת מתקפת Deserialization?¶
בשפות תכנות רבות, כולל PHP, Python ו-Java, קיימת פונקציונליות המאפשרת להמיר אובייקטים למחרוזות (serialize) ולהמיר אותם חזרה לאובייקטים (deserialize). כאשר הקלט שמתקבל מהמשתמש עובר תהליך של דיסריאלזציה מבלי בדיקה מספקת, תוקף יכול לשלוח אובייקט זדוני ולגרום להרצת קוד על השרת.
דוגמאות למתקפה ב-PHP¶
1. PHP - שימוש לא בטוח ב-unserialize()¶
<?php
class User {
public $isAdmin = false;
}
if (isset($_GET['data'])) {
$user = unserialize($_GET['data']);
if ($user->isAdmin) {
echo "You are an admin!";
} else {
echo "You are a regular user.";
}
}
?>
📌 הבעיה: התוקף יכול לשלוח אובייקט סידורי מותאם אישית ולשנות את הערך isAdmin ל-true:
📌 התוצאה: הגישה הופכת למנהל, למרות שהתוקף לא היה אמור להיות כזה!
2. הרצת קוד עם Magic Methods ב-PHP¶
<?php
class Evil {
public $cmd;
function __wakeup() {
system($this->cmd);
}
}
if (isset($_GET['data'])) {
unserialize($_GET['data']);
}
?>
📌 כיצד ניתן לתקוף?
📌 התוצאה: הפקודה id > /tmp/x תורץ על השרת!
🔴 הסיבה לכך:
-
המתודה
__wakeup()מופעלת אוטומטית בזמן הדיסריאלזציה. -
התוקף יכול להכניס פקודת מערכת דרך
$cmdולהריץ אותה.
כיצד להגן מפני מתקפות Deserialization?¶
✅ 1. הימנעות משימוש ב-unserialize() על נתונים שמגיעים מהמשתמש
✅ 2. שימוש ב-hash או חתימות דיגיטליות
$safe_data = base64_encode(serialize($user));
$signature = hash_hmac('sha256', $safe_data, 'secret-key');
✅ 3. שימוש ברשימה לבנה של מחלקות מותרות
$allowed_classes = ['User'];
$data = unserialize($_GET['data'], ['allowed_classes' => $allowed_classes]);
✅ 4. ביטול פונקציות מסוכנות ב-PHP 📌 בקובץ php.ini:
✅ 5. מעבר לפורמטים בטוחים כמו JSON במקום serialize/unserialize
סיכום¶
🔴 מתקפת Deserialization מאפשרת לתוקף:
-
לשנות ערכים פנימיים של אובייקטים ולשבור הרשאות.
-
להריץ קוד מרחוק באמצעות
__wakeup(),__destruct(), וכו'.
✅ כדי להגן:
-
לא להשתמש ב-
unserialize()על קלט מהמשתמש. -
להשתמש ב-JSON במקום serialize/unserialize.
-
להגדיר whitelist של מחלקות מותרות.
-
להשבית פונקציות PHP מסוכנות.