כותרת Penligent

אבטחת Nosql: הבנת סיכונים, התקפות הזרקת NoSQL והגנות

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

מהו NoSQL ומדוע הוא חשוב לאבטחה

מאגרי NoSQL (קיצור של "Not Only SQL" או "non-relational SQL") נוטשים את המודלים היחסיים המסורתיים לטובת מודלים גמישים יותר, כגון מאגרי ערך-מפתח, מאגרי מסמכים, משפחת עמודות ומאגרי גרפים. יישומים פופולריים כוללים: MongoDB, CouchDB, Redis, קאסנדרה, ו Neo4j. מערכות אלה מספקות מדרגיות וגמישות סכמטית, אך הן גם מציגות סמנטיקה חדשה של שאילתות ומלכודות אבטחה לא מוכר למהנדסים המורגלים במערכות SQL. vaadata.com

בניגוד ל-SQL, לכל מערכת NoSQL יש שפת שאילתות משלה (למשל, שאילתות מבוססות JSON ב-MongoDB) וסמנטיקה שונה של אופרטורים. אמנם גיוון זה משפר את הגמישות, אך הוא גם גורם ל וקטורי התקפה ייחודיים באמצעות הזרקה מכיוון שקלט המשתמשים לעתים קרובות מוחדר לשאילתות מסד נתונים ללא טיהור נאות. vaadata.com

הזרקת NoSQL: מה זה ומתי זה קורה

בעיקרו של דבר, הזרקת NoSQL מתרחשת כאשר תוקף שולח קלט מעוצב המשנה את המבנה המיועד של שאילתת מסד נתונים. בניגוד לדקדוק המסורתי המבוסס על טקסט של הזרקת SQL, הזרקת NoSQL לעתים קרובות עושה שימוש לרעה מטעני JSON או אופרטורי שאילתה כגון $ne, $gt, $lt, $regex, או $איפה לשלוט בהיגיון. vaadata.com

דוגמאות ותרחישים מהעולם האמיתי

הבה נבחן קטע קוד טיפוסי של Node.js + MongoDB לאימות, שבו מפתחים משתמשים ישירות בקלט של הלקוח כדי לשאול את פרטי ההזדהות:

javascript

// אימות פגיע

db.users.find({

דוא"ל: req.body.email,

סיסמה: req.body.password

});

תוקף יכול לספק ערך כמו:

json

{ "דוא"ל": { "$ne": null }, "סיסמה": { "$ne": null } }

שאילתה זו מחזירה מסמכים שבהם כתובת הדוא"ל היא לא null והסיסמה היא לא null, תוך עקיפת האימות ביעילות מבלי לדעת את פרטי הזיהוי התקפים. vaadata.com

מאגרי NoSQL טיפוסיים והיכן מתרחשת הזרקה

סוג מסד הנתוניםדוגמאותסיכון הזרקה
חנות מסמכיםMongoDB, CouchDBגבוה — שאילתות JSON וביצוע JS
ערך מפתחRedis, DynamoDBבינוני — הערכת סקריפט או פעולות מורכבות דורשות שימוש זהיר
משפחת עמודותקאסנדרה, HBaseסיכון אינטרפולציה בינוני
גרףNeo4jשפות שאילתה גבוהות כמו Cypher ניתנות למניפולציה

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

אבטחת Nosql

דוגמאות ל-CVE בעלות השפעה רבה הקשורות להזרקת NoSQL

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

  • CVE-2024-48573: הזרקת NoSQL ב-Aquila CMS אפשרה לתוקף לאפס סיסמאות חשבון מכיוון שהמסננים שסופקו על ידי המשתמשים לא עברו ניקוי, מה שאפשר הזרקת מפעיל זדוני. vaadata.com

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

כיצד ניתן לנצל הזרקת NoSQL

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

  • עקיפת לוגיקת האימות
  • חלץ רשומות רגישות
  • שינוי או מחיקה של נתונים קריטיים
  • העלאת הרשאות
  • הפעלת פגיעויות ביישומים משניים (לדוגמה, RCE באמצעות ביצוע JavaScript)

דוגמה: עקיפת אימות

javascript

// המטען של התוקף משנה את לוגיקת השאילתה

db.users.find({

דוא"ל: { $regex: ".*" },*

*סיסמה: { $regex: ".*" }

});

זה תואם לכל אישורים מכיוון ש .* הוא ביטוי רגולרי שמתאים לכל דבר — ובכך עוקף את בדיקות הכניסה. vaadata.com

איתור הזרקת NoSQL

בדיקת הזרקת NoSQL כוללת:

  • זיהוי נקודות שבהן קלט המשתמש מועבר ישירות לשאילתות מסד נתונים
  • טשטוש פרמטרי משתמש עם מקשי מפעיל כמו $ne, $gt, $lt
  • תצפית בשינויים בהתנהגות היישום (לדוגמה, עקיפת אימות, הבדלים בתוצאות שאילתות)
  • בדיקות באמצעות סורקים אוטומטיים וטכניקות בדיקה ידניות Indusface

מהנדסים מסתמכים לעתים קרובות על בדיקות ידניות וכלים אוטומטיים כדי לדמות מטענים זדוניים.

אסטרטגיות הגנה: אימות קלט וחיזוק שאילתות

המהות של ההגנה מפני הזרקת NoSQL היא טיפול כל קלט המשתמש כלא אמין ולמנוע כל אפשרות שהקלט ישנה את מבנה השאילתה.

איתור הזרקת NoSQL

שיטות עבודה מומלצות

  1. אימות קלט והוספה לרשימת הלבנים אפשר רק שדות וסוגי נתונים צפויים. דחה או נקה תווים מיוחדים ומפעילים JSON שעלולים לשנות את לוגיקת השאילתה. Indusface
  2. שאילתות פרמטריות/מוכנות למרות ש-NoSQL אינו כולל הצהרות מוכנות אוניברסליות, נהגים רבים תומכים בבוני שאילתות בטוחים יותר, המונעים שרשור מחרוזות.
  3. אימות סכימה השתמש בסכמות מסמכים או באימות מודלים (לדוגמה, סכמות Mongoose) כדי לאכוף צורות קלט צפויות.
  4. השבתת מפעילים מסוכנים השבת הערכה של $איפה, $eval, או ביצוע JavaScript בתצורות מסד נתונים. Indusface
  5. מדיניות הרשאות מינימליות הגבל את הרשאות המשתמשים בבסיס הנתונים כך שגם אם תתרחש הזרקה, טווח ההשפעה של הפעולות (קריאה/כתיבה) יהיה מוגבל.
  6. רישום וניטור תעד דפוסי שאילתות חריגים כדי לזהות ניסיונות הזרקה ולהפעיל התראות.

דוגמאות קוד: דפוסי התקפה לעומת הגנה

להלן קטעי קוד מעשיים הממחישים הן את הניצול והן את ההפחתה.

התקפת עקיפת אימות MongoDB

javascript

// לא בטוח: קלט ישיר של המשתמש בשאילתה

db.users.find({

שם משתמש: req.body.user,

סיסמה: req.body.pass

});

דפוס הגנה: רשימת לבנה וקלטות יציקה

javascript

const userInput = {

משתמש: מחרוזת (req.body.user || ""),

pass: מחרוזת (req.body.pass || "")

};

db.users.find({ username: userInput.user, password: userInput.pass });

שימוש לרעה בביטויים רגולריים בשאילתות

מטען התקפה:

json

{ "name": { "$regex": ".*" } }

הגנה (אל תאפשר Regex):

javascript

if (!/^[A-Za-z0-9_]+$/.test(req.body.name)) {

זרוק שגיאה חדשה ("תווים לא חוקיים");

}

מניעת ביצוע JavaScript ב-MongoDB

לא בטוח:

javascript

db.users.find({ $where: "this.age > 25" });

תצורה בטוחה:

לנזוף

# mongod.conf

setParameter:

javascriptEnabled: false

סימולציית שאילתה פרמטרית

לא בטוח:

javascript

collection.find({ filter: JSON.parse(req.body.filter) });

ניתוח בטוח עם ספריית טיהור

javascript

const sanitize = require('mongo-sanitize');

const filter = sanitize(req.body.filter);

collection.find(filter);

סינון קלט REST API

פגיע:

javascript

app.post("/search", (req, res) =>

db.collection("items").find(req.body).toArray()

);

ממוקדם:

javascript

const allowedFields = ["category", "price"];

const query = {};

allowedFields.forEach(f => {

if (req.body[f]) query[f] = req.body[f];

});

db.collection("items").find(query).toArray();

בדיקות אבטחה NoSQL אוטומטיות וקפדניות

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

  • יצירה והזרקה אוטומטית של מטעני NoSQL מתוחכמים כדי לאתר נקודות תורפה
  • קישור בין דפוסי שאילתות להתנהגויות בסיכון גבוה
  • שילוב עם צינורות CI/CD כדי לאתר רגרסיות בשלב מוקדם
  • הפקת דוחות לפי סדר עדיפויות בהתאם לסיווגים של OWASP ו-CWE

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

מסקנה: NoSQL אינו חסין — יש לתכנן בצורה מאובטחת

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

שתף את הפוסט:
פוסטים קשורים
he_ILHebrew