
ערוצים מיקרוארכיטקטוניים הם היבט קריטי, אך לעיתים קרובות לא מובן, בתחום אבטחת הסייבר המודרנית. בניגוד לערוצים צדדיים מסורתיים ברשתות, ערוצים מיקרוארכיטקטוניים מנצלים את ההתנהגויות החומרתיות הנמוכות של מעבדים מודרניים כדי להדליף מידע רגיש. פוסט זה בבלוג חוקר לעומק מה הם ערוצים אלו, כיצד הם פועלים, מדוע הם מסוכנים, ומה צעדים מעשיים ניתן לנקוט כדי לזהות ולמנוע אותם, כולל דוגמאות מעולם האמיתי ודגימות קוד.
תוכן העניינים
- הקדמה לערוצים מיקרוארכיטקטוניים
- ערוצים צדדיים לעומת ערוצים סמויים: הגדרות והבדלים
- כיצד פועלים ערוצים סמויים מיקרוארכיטקטוניים
- ניצולים ודוגמאות מעולם האמיתי
- טכניקות זיהוי לערוצים סמויים מיקרוארכיטקטוניים
- אסטרטגיות מניעה והפחתה
- התנסות מעשית: סריקה וזיהוי התקפות מיקרוארכיטקטוניות
- דוגמאות בפייתון ובש: ניתוח אירועי חומרה ועיתוי
- מסקנה
- מראי מקום
מעבדים מודרניים הם פלאי הנדסה, מותאמים למהירות, יעילות ופרלליזם. עם זאת, מתחת להפשטה של תוכנה קיימת מערכת מורכבת שבה תהליכים משתפים משאבים פיזיים כמו זיכרון מטמון, בקרי זיכרון ויחידות ביצוע. ערוצים מיקרוארכיטקטוניים הם נתיבי תקשורת המנצלים את המשאבים המשותפים הללו, שכאשר אינם מתמתנים, עלולים לשמש להדלפת סודות על פני גבולות תהליך — ולפגוע בהנחות יסוד בטוחות.
ערוץ צדדי הוא נתיב להדלפת מידע שאינו מנצל ישירות פגיעויות תוכנה, אלא מתבונן בהבדלים בהתנהגות מערכות (כמו שימוש בכוח, עיתוי, פגיעות/החמצות במטמון) כדי להסיק סודות. לדוגמה, תוקף עשוי להסיק מפתחות קריפטוגרפיים על ידי התבוננות בזמן שנדרש לפעולות מסוימות.
ערוץ סודי הוא נתיב תקשורת המשמש להעברת מידע בצורה המפרה את מדיניות האבטחה של המערכת. בניגוד לערוצים צדדיים, ערוצים סמויים משמשים לרוב בכוונה להחליף מידע בין שני צדדים משתפים פעולה.
ההבדל המרכזי:
ערוצים מיקרוארכיטקטוניים פועלים בעומק החומרה, תוך ניצול האופן שבו משאבים משותפים בין תהליכים, בעוד ערוצים ברשת משתמשים באמצעי העברת נתונים.
בואו נבחן כיצד תוקפים בונים ערוצים סמויים (וצדיים) מיקרוארכיטקטוניים באמצעות משאבי CPU משותפים.
// שלבים פשוטים עבור Prime+Probe
1. Prime: לגשת לשורות מטמון כדי למלא ערכת מטמון מסוימת
2. לתת לקורבן לבצע
3. Probe: לגשת שוב לאותן שורות מטמון ולמדוד זמני הגישה
4. חוסר יכולים להצביע על החלפה, ככל הנראה עקב גישת הקורבן
התקפות אלה מנצלות ביצוע ספקולטיבי, שבו מעבדים מנחשים הוראות עתידיות לשיפור ביצועים. ניחושים שגויים מוחזרים אחורה, אך לאפקטים צדדיים במיקרוארכיטקטורה (כמו מצב המטמון) נשארים, מה שמוביל הדלפת סודות.
באמצעות היסטוריה בטבלאות תחזיות סניפים, תוקפים יכולים להסיק החלטות זרימת בקרה בקוד הקורבן.
אם שני תהליכים משתפים יחידות ביצוע פיזיות, מחלוקה גורמת לשינויי תזמונים מדידים.
נניח שתהליך A (התוקף) ותהליך B (הקורבן) פועלים על אותה מכונה, ומשתפים משאבי מטמון.
ערוצים סמויים מיקרוארכיטקטוניים אינם תיאורטיים בלבד—הם אפשרו כמה מההתקפות המעשיות המשמעותיות ביותר על תשתית מחשוב מודרנית.
בסביבות ענן, תוקפים המחליקים על אותו חומרה עם מטרה יכולים להשתמש בהתקפות מטמון כדי להדליף מידע מ-VMים שכנים.
קוד JavaScript יכול למדוד זמני שלבים ולהשתמש במצב מטמון משותף, להוציא סיביות מידע רגיש מההקשר של הדפדפן של המשתמש.
זיהוי ערוצים אלו מהווה אתגר, אך מספר גישות מעשיות קיימות.
מעבדים מודרניים מספקים מונים לאירועים כמו חמצות מטמון, תחזיות סניפים שגויות, עצירות ביצוע. קפיצות או דפוסים לא רגילים יכולים לרמוז על התקפה.
דוגמאות לאירועים רלוונטיים:
cache-referencescache-missesbranch-instructionsbranch-missesמערכות הפעלה מתקדמות (והיפרווייזרים) יכולות לנטר, לרשום ולנתח אנומליות בעיתוי תהליכים כדי לזהות התנהגות חשודה.
מחקר עדכני משלב למידת מכונה כדי להבחין בין שימושי חומרה מרעים והמדות, מודל את הדפוסים הנורמלי ומסמן חריגות.
מניעת ערוצים סמויים מיקרוארכיטקטוניים כרוכה לעיתים קרובות בגישות גם חומרתיות וגם תוכנתיות.
הורדת גרנולריות שעון זמינה או הוספת רעש/רעידות מפחיתה את יעילות התקפה, במיוחד עבור התקפות מבוססות JavaScript.
כתיבת קוד שזמן הביצוע שלו אינו תלוי בנתונים סודיים מכשלו והתכונות הטכנולוגיות רבות אחרות.
מעבדים מסוימים כעת כוללים עיצובים "עמידים לערוץ צד", עם מחסומים במטמונים או מנגנוני התקדמות הספקולטיבית מחוזקים.
בואו נעבור דרך כיצד אנשי מקצוע יכולים לסרוק את אנומליות מיקרוארכיטקטוניות באמצעות כלים פתוחים וקוד.
perf בלינוקס לאיסוף נתוני ביצועיםperf list | grep cache
<pid> עם PID בפועל)sudo perf stat -e cache-references,cache-misses -p <pid>
104,212 הפניות למטמון
12,342 החמצות מטמון
sudo perf record -e cache-misses -p <pid> -- sleep 10
sudo perf report
sudo perf stat -a --per-socket -e cache-misses sleep 5 | grep "cache-misses"
או לכל תהליך:
ps -eo pid,comm | while read pid comm; do
sudo perf stat -p $pid -e cache-misses -I 1000 -- sleep 1 2>&1 | grep cache-misses
done
נניח שאתה רוצה לאוטומט סריקה של תהליכים מרובים או לנתח תוצאות perf עבור זיהוי אנומליות.
perf stat עבור חמצות מטמון חשודותimport subprocess
import re
def get_cache_misses(pid):
cmd = ["perf", "stat", "-p", str(pid), "-e", "cache-misses", "--", "sleep", "2"]
result = subprocess.run(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
match = re.search(r"([\d,]+)\s+cache-misses", result.stderr)
if match:
count = int(match.group(1).replace(",", ""))
return count
else:
return None
# סרוק את כל התהליכים
import psutil
for proc in psutil.process_iter(attrs=['pid', 'name']):
pid = proc.info['pid']
name = proc.info['name']
try:
misses = get_cache_misses(pid)
if misses and misses > 100000:
print(f"חשוד: PID {pid} ({name}) יש לו {misses} חמצות מטמון")
except Exception:
continue
#!/bin/bash
THRESHOLD=100000
for pid in $(ps -e -o pid=); do
MISS=$(sudo perf stat -p $pid -e cache-misses -- sleep 1 2>&1 | grep cache-misses | awk '{print $1}' | tr -d ',')
if [ ! -z "$MISS" ] && [ "$MISS" -gt "$THRESHOLD" ]; then
echo "אזהרה: PID $pid חמצות מטמון גבוהות ($MISS)"
fi
done
לסיבות אתיות וחוקיות, נסה רק בסביבה בטוחה, מבודדת ומאפשרת נסויים.
// אזהרה: להדגמה בלבד. אין להשתמש במערכות ייצור.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <x86intrin.h>
#include <unistd.h>
#define CACHE_LINE_SIZE 64
#define PROBE_COUNT 100000
volatile char *array;
void prime_cache() {
for (int i = 0; i < 4096; i += CACHE_LINE_SIZE)
_mm_clflush(&array[i]);
}
int probe_cache() {
int sum = 0;
uint64_t start, end;
for (int i = 0; i < 4096; i += CACHE_LINE_SIZE) {
start = __rdtscp(&i);
volatile char x = array[i];
end = __rdtscp(&i);
sum += (end - start);
}
return sum;
}
int main() {
array = malloc(4096);
for (int i = 0; i < PROBE_COUNT; i++) {
prime_cache();
usleep(1); // Let "victim" run
int timing = probe_cache();
printf("%d\n", timing);
}
free((void *)array);
return 0;
}
הסבר:
קוד זה מודד זמני גישה למטמון לפני ואחרי ש-"הקורבן" יכול לפעול, מסיק האם המטמון שומש על ידי תהליך אחר—הרעיון הבסיסי מאחורי התקפות מיקרוארכיטקטוניות רבות.
ערוצים מיקרוארכיטקטוניים מייצגים איום ייחודי וחשוב באבטחת מידע בעידן המעבדים מרובי הליבות והעננים. בניגוד לערוצי צד רשתיים מסורתיים, התקפות אלו מנצלות את השיתוף המורכב של משאבי חומרה פיזיים. התחום מתפתח במהירות, וכל איש מקצוע חייב להבין את היסודות ואת ההשלכות המתקדמות כאחד.
נקודות סיכום:
perf), חיזוקי מערכת הפעלה ופרקטיקות קידוד לצורך זיהוי והגנה.לסביבות קריטיות מבחינה אבטחתית—עננים, דפדפנים, אפליקציות קריפטוגרפיות—מתן תשומת לב לאבטחה מיקרוארכיטקטונית אינו אופציונלי יותר.
מאמר זה מיועד למטרות חינוכיות. תמיד עקוב אחר הנחיות אתיות ותקנות מקומיות בעת ביצוע חקר אבטחה.
אם מצאתם את התוכן הזה בעל ערך, תארו לעצמכם מה תוכלו להשיג עם תוכנית ההכשרה המקיפה והאליטיסטית שלנו בת 47 שבועות. הצטרפו ליותר מ-1,200 סטודנטים ששינו את הקריירה שלהם בעזרת טכניקות יחידה 8200.