דילוג לתוכן
New

DeepSeek V4.1 Flash free for 7 days: 10M tokens a day after a top-up of $10 or more. Until Nov 30.

How it works

Hashes של קבצים ב-DFIR והאתיקה של העלאה ל-VirusTotal

איך hashes מזהים קבצים, למה SHA-256 החליף את MD5, איך NSRL מסנן תוכנות מוכרות, ולמה העלאת קובץ ל-VirusTotal היא שיתוף שלו.

מתחילים8 דקות קריאהמאת NotHoly

מהו hash

פונקציית hash קריפטוגרפית מקבלת קלט בכל אורך ומחזירה ערך באורך קבוע שנקרא digest. SHA-256 מחזיר תמיד 256 ביט, שנקראים כ-64 תווים הקסדצימליים. אותו קלט נותן תמיד אותו digest. שינוי של תו אחד משנה את ה-digest לגמרי. NIST מגדיר את Secure Hash Standard ב-FIPS 180-4, שמכסה את SHA-256 ואת שאר אלגוריתמי SHA, ואומר ש-digests משמשים לזיהוי שינוי בהודעה.

עבור אנליסט, הרעיון השימושי פשוט. digest הוא תווית קצרה וחוזרת עבור רצף בתים מדויק. שני אנשים שמחשבים hash לאותו קובץ על שני מחשבים אמורים לקבל אותו digest. לכן hashes מופיעים בדוחות אירועים, בפידים של מודיעין איומים ובדפי הורדת תוכנה.

hash מזהה בתים ולא שם. לקובץ בשם invoice.pdf ולקובץ בשם setup.exe יש אותו digest אם הבתים שלהם זהים. שינוי שם של קובץ לא משנה כלום ב-digest שלו. שם הקובץ אומר איך מישהו קרא לקובץ. ה-digest אומר אילו בתים נמצאים אצלך בפועל.

למה SHA-256 החליף את MD5 לזיהוי

MD5 מפיק digest של 128 ביט, ובמשך שנים רבות השתמשו בו באופן נרחב ל-checksums. מאוחר יותר הראו חוקרים ש-MD5 פגיע להתקפות התנגשות, כלומר אפשר לבנות שני קלטים שונים שמפיקים אותו digest של MD5. ל-SHA-1 יש בעיה דומה במבנה אחר.

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

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

קבוצות hash: לסנן את מה שכבר מוכר

חוקר לא קורא כל קובץ בדיסק. השאלה המועילה הראשונה היא אילו קבצים כבר מוכרים. National Software Reference Library ‏(NSRL), ש-NIST מתחזק, אוספת תוכנות ויוצרת פרופילי קבצים שנכנסים ל-Reference Data Set ‏(RDS). ה-RDS הוא אוסף של חתימות דיגיטליות של אפליקציות תוכנה מוכרות שאפשר להתחקות אחריהן. הוא כולל hashes של תוכנות לגיטימיות, וגם של כמה אפליקציות שעשויות להיות זדוניות, כמו כלי סטגנוגרפיה וסקריפטים של האקינג. חוקרים משתמשים בו כדי להתאים קבצים ממחשבים שנתפסו מול פרופילים מוכרים, וכך מפרידים תוכנה שגרתית מקבצים שאולי חשובים.

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

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

התאמת hash לא אומרת כלום על קובץ ששונה

התאמת hash היא מדויקת. אם בית אחד משתנה, ה-digest משתנה. מכאן שלושה כללים.

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

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

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

לאותה תוכנית יכולים להיות גם digests שונים בין גרסאות. Notepad של Windows הוא דוגמה טובה. ה-digest שלו יכול להשתנות מ-build אחד של Windows לאחר. hash בלי גרסה לידו אומר מעט מאוד, ולכן רושמים את הגרסה בכל פעם שרושמים digest.

חיפוש hash מול העלאת קובץ

VirusTotal מאפשר לחפש קובץ לפי ה-hash שלו. מדביקים ערך SHA-256, ‏MD5 או SHA-1 בתיבת החיפוש, ו-VirusTotal מציג דף לכל קובץ שהוא כבר מכיר עם ה-digest הזה. חיפוש hash שולח לשירות את ה-digest. הוא לא שולח את הקובץ.

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

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

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

גם לחיפוש hash יש השלכות. השירות מקבל את ה-digest, ו-digest של קובץ לקוח יכול לחשוף מה מחפשים. כדאי לבדוק את המדיניות גם לגבי חיפושי hash, במיוחד בתיק פעיל.

מעבדה מעשית: hash לקבצים שלך

צריך מחשב עם טרמינל. מחשבים hash לתוכניות מערכת ולקובץ שיוצרים, ואז מחפשים digest תמים ומוכר אחד ב-VirusTotal. לא מעלים שום דבר. משתמשים רק בקבצים שנמצאים על המחשב שלך.

שלב 1: hash לתוכנית מערכת

ב-Linux מריצים:

bash
sha256sum /bin/ls

ב-macOS מריצים:

bash
shasum -a 256 /bin/ls

ב-Windows פותחים PowerShell ומריצים:

powershell
Get-FileHash C:\Windows\System32\notepad.exe -Algorithm SHA256

ב-Windows עם Git Bash אפשר להריץ את אותה בדיקה גם מהטרמינל:

bash
sha256sum /c/Windows/System32/notepad.exe

במחשב שעליו בדקנו את המאמר, Windows 11 עם Git Bash, אלה התוצאות שהתקבלו:

text
$ sha256sum /bin/ls
b45981580702029cfeeffc8ca69e2a4d1e9c68914009e94c31ffec9cbc544aa5 */bin/ls
text
Algorithm : SHA256
Hash      : 468FFE129C395ABF6B21A09EFDF261910A95FB98AA982EAD73CAA7B2B684577E
Path      : C:\Windows\System32\notepad.exe
text
$ sha256sum /c/Windows/System32/notepad.exe
468ffe129c395abf6b21a09efdf261910a95fb98aa982ead73caa7b2b684577e */c/Windows/System32/notepad.exe

ה-digest של ls מגיע מהעותק של ls ש-Git Bash מביא איתו, ולכן הוא לא יתאים לפקודה ls במחשב Linux או macOS שלך. ה-digest של notepad זהה בשני ה-shells, כי ההבדל היחיד הוא רישיות ההקסדצימלי. משווים digests בלי תלות ברישיות. אותו מחשב דיווח גם על גרסת הקובץ 10.0.26100.9949 ועל אורך של 360448 בתים עבור notepad.exe. כדאי לרשום את הפרטים האלה ליד ה-digest, כי build אחר של Windows ייתן digest אחר לאותו שם תוכנית.

שלב 2: איך תו אחד משנה את ה-digest

מריצים את זה ב-Git Bash או בכל shell של POSIX:

bash
echo 'lab' > a.txt && sha256sum a.txt && echo 'lab.' > a.txt && sha256sum a.txt

הפלט שהתקבל:

text
b76025a9ca630b026d630d59a18cf414f5724d2bbf5dc4b11dd165c9c1ea8e01 *a.txt
d233123b7c71a1b7234066f700e03452959ce5bb0b4802f0cbd2c2437004a879 *a.txt

השינוי היחיד היה נקודה אחת. שני ה-digests באורך 64 תווים, ואין ביניהם דפוס נראה לעין. הפקודה echo מוסיפה גם תו שורה חדשה, כך שהקובץ הראשון מחזיק את lab ואחריו מעבר שורה, והשני מחזיק את lab. ואחריו מעבר שורה. אפשר לבדוק את הבתים המדויקים עם od -c a.txt. סיומות שורה הן סיבה נפוצה לכך ששני עותקים של "אותו טקסט" נותנים digests שונים. קובץ שנשמר ב-Windows עם סיומות שורה CRLF מפיק digest שונה מאותו טקסט שנשמר עם LF.

שלב 3: חיפוש digest תמים ומוכר ב-VirusTotal

פותחים דפדפן ונכנסים לכתובת https://www.virustotal.com/gui/search/ ואחריה ה-digest של SHA-256 של Notepad משלב 1. אפשר גם להדביק את ה-digest בתיבת החיפוש באתר VirusTotal. לא גוררים קובץ לדף ולא לוחצים על שום פקד העלאה.

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

כשהדף נטען, רושמים בהערות ארבעה דברים:

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

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

טעויות נפוצות

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

התייחסות ל-MD5 או ל-SHA-1 כהוכחה. לזיהוי משתמשים ב-SHA-256. digests ישנים שומרים רק כמפתחות חיפוש.

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

אמון בשם הקובץ. קל לשנות שמות. ה-digest הוא המזהה, והשם הוא רק תווית.

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

שכחת הגרסה. אותו שם תוכנית יכול להפיק digests רבים. רושמים את הגרסה וה-build ליד כל digest, אחרת ה-digest לא יגיד הרבה בהמשך.

איך ממשיכים

מחשבים digests לכל קובץ בתיקייה ושומרים אותם כ-manifest, כדי לזהות שינויים בהמשך. ב-Linux או ב-macOS מריצים sha256sum * > manifest.txt בתוך התיקייה. שומרים את ה-manifest עם הראיות ומחשבים מחדש את ה-digests מאוחר יותר כדי לראות מה השתנה. הפקודה הזאת סטנדרטית, אבל לא הרצנו אותה במעבדה של המאמר הזה, ולכן כדאי לבדוק את הפלט שלה על המחשב שלך.

FIPS 180-4 נותן את ההגדרות המדויקות של אלגוריתמי SHA ואת גודלי הפלט שלהם. דף ה-NSRL מראה איך בונים מערך נתוני ייחוס ואיך משתמשים בו בפועל. את התיעוד של VirusTotal על הטיפול בקבצים שנשלחים כדאי לקרוא לפני שימוש בסורק ציבורי כלשהו בעבודה.

השלב הבא הוא לכתוב לוגיקת זיהוי מול קובץ שבשליטתך. המאמר כתיבת חוק YARA מול קובץ בדיקה תמים מראה איך להתאים דפוסים ולא digests שלמים, וזה מכסה את המקרים ש-hash מדויק לא מכסה.

מקורות

לקריאה נוספת: השוואה בין הצפנה, קידוד ו-hashing והמאמר הקודם בסדרה, ניתוח ראשון ב-Ghidra עם בינארי שמקמפלים לבד.

מקורות

  1. FIPS 180-4, Secure Hash Standard (NIST)
  2. National Software Reference Library (NIST)
  3. How VirusTotal works (VirusTotal documentation)

עוד בנושא נוזקות ופורנזיקה

נוזקות ופורנזיקה

למה להשתמש ב-NotHoly לניתוח malware

triage סטטי ב-sandbox שלעולם לא מריץ את הדגימה, ומודל שמסביר ומוביל ל-ATT&CK בלי לסרב. הדטונציה נשארת במעבדה שלכם.

ביניים2 דקות קריאה

נוזקות ופורנזיקה

כתיבת חוק YARA מול קובץ בדיקה תמים

לכתוב חוק YARA ראשון, להתאים לקובץ בדיקה לא מזיק אחד ולא לאחר, ולהבין למה כל חוק צריך בדיקות חיוביות ושליליות.

מתחילים8 דקות קריאה