3 min. read

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

אחרי יותר מ-4 חודשים של מלחמת חרבות ברזל אני יכול להוציא מאמר מקצועי שמדבר על נושא מאוד חשוב - חולשות.


אתם מתיישבים על יד המחשב,
היד על העכבר,
אתה מזיזים אותו מצד לצד,
ומה מגלים?

עוד פעם עדכון אבטחה.

אז הלכתם לפלאפון,
ואתם רוצים לצפות בחתולים,
ואז ההתראה מגיעה - יש עדכון.

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

מה קורה פה?

עדכוני אבטחה

עדכוני אבטחה הם דבר הכרחי בגלל - חולשות.
מהן חולשות?

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

בסרטים מתוארים לנו אינספור דוגמאות של קירות-אש (Firewall) בלתי שבירים
שהאקר בן 15 מצליח לפרוץ ב-3 שניות.

לא כך המצב - חולשה יכולה להיות סדק מאוד גדול.
למשל גם לשים סיסמא 123456 זוהי חולשה גדולה.
כי אם פורץ יכול “לנחש” את הסיסמא שלכם - אז בשביל מה הסיסמא?

כל מקרה כזה תדמיינו את האנלוגיה לדלת והחלון.
עצם זה שיש סיסמא זה הדלת - המערכת סגורה ואי אפשר להיכנס סתם ככה.
אבל אם אפשר “לנחש” זה החלון שלכם - פורץ בלי מאמץ יכול להיכנס למערכת.

  • מפה והלאה הטרמינולוגיה תלך ותהיה יותר מקצועית.

התנהגות החולשות

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

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

וכאן נתחיל לדבר גם על - התקפות.

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

אך זה לא המצב, היום מצב האבטחה הולך ומדרדר,
חברות מחליטות להוציא מוצרים ללא בדיקות מקיפות, ללא אנשים למודי ניסיון שזו המומחיות שלהם - לברור את החולשות.

וזה גורם להרבה נזק.
אחד הנזקים הגדולים שרצים היום אצל בעלי חברות וגופים ציבוריים הוא ה- Ransom attack.

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

מהי החולשה הדרושה לכך?

כדי לבצע כזה דבר בסופו של יום צריך:

  • גישה למידע
  • סקריפט/קוד שיירוץ וייבצע את ההתקפה.
  • הרשאות לביצוע ההתקפה.

שימו לב שלא כתבתי “גישה רשתית” - יש התקפות שאיננו נדרשים אפילו לרשת כדי לתקוף.

באחד מהפוסטים כתבתי על למה אסור לסמוך על תמונות:

למה לא לסמוך על תמונות

בכ”מ אסור לסמוך על שום קובץ שמגיע ממקור בלתי ידוע.
קוד יכול להתחבא, יכול להיות מפוצל להרבה רכיבים כדי שהאנטי וירוס לא ייתחקה אחריו או חוקרי אבטחה לא יימצאו את כל פיסות המידע.

אז נסתכל במבט אנליטי - מהן החולשות הפוטנציאליות כדי שתוקף ייקבל את אחד מהמטרות למעלה?
איך תוקף פוטנציאלית יכול לקבל גישה למידע, להריץ על זה קוד ולבצע התקפה?

  • מערכת לא מוגנת שמקבלת קבצים ללא חסימה.
  • סיסמאות חלשות
  • גישה פיזית, מה ייקרה אם פורץ פשוט ייכנס למחשב פיזית?
  • ע”י שימוש במערכות החברה אשר יכולות להימצא שם באגים!

רגע, איך באגים בתוכנה שלנו יכולים לגרום לזה?
הרי התוכנה תרוץ, גם אם היא תקרוס אפשר לעלות אותה מחדש וזהו…

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

תוקפים עוינים בדרך כלל יירצו להוריד את השירות שלא יהיה זמין.

  • לא תוכלו להתקשר למשטרה.
  • קבלה ידנית בבתי החולים במקום המערכות.
  • אתם רוצים לקנות מוצר אבל השירות לא זמין.

תוקפים מיומנים יותר שיש להם מטרה ספציפית יכולים לגרום לנזק.
למשל אם שירות שאיננו מוגן רשאי להביא רק מפרמטרים, הקלאסי זה שימוש ב-url parameters:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import parse_qs, urlparse
import os

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
parsed_url = urlparse(self.path)
query_params = parse_qs(parsed_url.query)

if 'id' in query_params:
file_id = query_params['id'][0]
filename = f"file_{file_id}.txt"

if os.path.exists(filename):
with open(filename, 'rb') as file:
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
self.wfile.write(file.read())
else:
self.send_response(404)
self.end_headers()
self.wfile.write(b'File not found')
else:
self.send_response(400)
self.end_headers()
self.wfile.write(b'Missing ID parameter')

def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler, port=8000):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print(f"Server running on port {port}")
httpd.serve_forever()

if __name__ == "__main__":
run()

בדוגמת השרת הפשוט הזה כתבנו שירות שנותן לנו קבצים ע”פ ה-id שניתן בשרת.
מהי הבעיה?
חסרה לנו הזדהות!
איך אנחנו יודעים מי ניגש לקובץ ולשם איזו מטרה?
צריך הזדהות וצריך ניהול הרשאות.

למשל עם בחירות בישראל - יש כל הזמן סביב זה אותם הדיונים - האם המידע שלנו באמת זמין כל כך?
כתבה:
https://www.globes.co.il/news/article.aspx?did=1001320254

או הפרצת האבטחה למערכת ניהול הבחירות של ש”ס:
https://www.calcalist.co.il/calcalistech/article/bj7j2covj

איך אני בתור מפתח תוכנה יכול להכיר את זה?

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

למשל בשרת למעלה, ע”י בדיקת תוכנה מקיפה היינו ישר מתריעים על CWE-322: Key Exchange Without Entity Authentication.
אתר:

https://cwe.mitre.org/data/definitions/322.html


קטלוג Known exploits vulnerabilities

אתר הקלטוג:
https://www.cisa.gov/known-exploited-vulnerabilities-catalog

חוקרי אבטחה - כמו כל החוקרים בתחומים אחרים - משתפים מידע ביניהם על מנת לדעת להגן.

בקטלוג אתם יכולים למצוא שלל של בעיות בחברות הכי גדולות.

בואו נסתכל על דוגמא ספציפית שעתה נוספה:
https://nvd.nist.gov/vuln/detail/CVE-2024-21762

במערכת ההפעלה Fortinet FortiOS גילו ששליחה מסוימת של בקשות גורמת למשהו שנקרא - Out-of-bounds Write.
אוקיי אז אתם שואלים, מה אכפת לי מזה?

אז כאן ניתן לקרוא על החולשה הזו:
https://cwe.mitre.org/data/definitions/787.html

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

הכי קלאסי פה - אם הזליגה הזו מביאה לקריסת המערכת, תחשבו שתוקף היה יכול ליצור בקשה ייחודית שגורמת לקריסות ולשלוח אותה פעם ב-10 דקות? המערכת שלכם תהיה מושבתת.

10 הגדולים של 2023

https://cwe.mitre.org/top25/archive/2023/2023_kev_list.html

  • Use After Free
    CWE-416Analysis score: 73.99# CVE Mappings in KEV: 44Avg. CVSS: 8.54
  • Heap-based Buffer Overflow
    CWE-122Analysis score: 56.56# CVE Mappings in KEV: 32Avg. CVSS: 8.79
  • Out-of-bounds Write
    CWE-787Analysis score: 51.96# CVE Mappings in KEV: 34Avg. CVSS: 8.19
  • Improper Input Validation
    CWE-20Analysis score: 51.38# CVE Mappings in KEV: 33Avg. CVSS: 8.27
  • Improper Neutralization of Special Elements used in an OS Command (‘OS Command Injection’)
    CWE-78Analysis score: 49.44# CVE Mappings in KEV: 25Avg. CVSS: 9.36
  • Deserialization of Untrusted Data
    CWE-502Analysis score: 29.00# CVE Mappings in KEV: 16Avg. CVSS: 9.06
  • Server-Side Request Forgery (SSRF)
    CWE-918Analysis score: 27.33# CVE Mappings in KEV: 16Avg. CVSS: 8.72
  • Access of Resource Using Incompatible Type (‘Type Confusion’)
    CWE-843Analysis score: 26.24# CVE Mappings in KEV: 16Avg. CVSS: 8.61
  • Improper Limitation of a Pathname to a Restricted Directory (‘Path Traversal’)
    CWE-22Analysis score: 19.90# CVE Mappings in KEV: 14Avg. CVSS: 8.09
  • Missing Authentication for Critical Function
    CWE-306Analysis score: 12.98# CVE Mappings in KEV: 8Avg. CVSS: 8.86

לכל מפתחי ה-C/C++ או Low level אנחנו יכולים לראות ששלושת הבעיות הכי גדולות קשורות לזיכרון.

Use after free

ניקח את מקום ראשון - שימוש אחרי שמשתנה כבר נמחק.
בעיה גדולה שנוצרת ממנו זה -Dangling pointers,
מחזקנו את ההקצאה אך המידע והפוינטר עדיין קיימים.

1
2
3
4
5
6
7
// Returns "mongodb://admin:admin@myMongoDB:6324/db"
char* dbConn = getDbConnection();

saveConn(dbConn);

// New developer added deldetion of connection string:
delete[] dbConn;

אחרי הקוד הזה חשבנו שהזיכרון נמחק אך ה-dbConn עדיין נשאר.
אם הקוד עדיין יינסה לקרוא מהזיכרון הזה במקרה הטוב תיזרק שגיאה ובמקרה הרע המידע לקישור ל-DB יהיה חשוף לתוקף!


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

אחר יבוא אלינו מתחת לעץ הטין, ויקרוץ אותנו קרץ.

תודה על הקריאה!


אהבתם? מוזמנים להביע תמיכה כאן: כוס קפה