«בלינוקס לא צריך אנטי-וירוס» היא דעה רווחת, ובצורתה המקורית היא נכונה: וירוסים שמדביקים קובצי מערכת של לינוקס כמעט אינם קיימים. אבל ל-ClamAV בשרת יש עבודה אחרת, והיא מנוסחת כך: למצוא את מה שהועלה דרך האתר שלכם. ובראש ובראשונה web shells.

מה בדיוק אנחנו מחפשים

web shell הוא קובץ PHP קטן שמאפשר להריץ פקודות דרך הדפדפן. הוא מגיע דרך טופס העלאה, דרך תוסף פגיע או דרך סיסמת מנהל שנוחשה, מתיישב בין התמונות בתיקיית ההעלאות וחי שם חודשים. לא חומת האש ולא Fail2ban יראו אותו: הבקשות אליו נראות כמו בקשות רגילות לאתר.

מלבד זאת, ClamAV מוצא:

  • קבצים זדוניים שמשתמשים העלו ושמוגשים הלאה מהשרת שלכם — בדרך כלל על זה מדובר במכתב מהספק;
  • קבצים מצורפים לדואר, אם השרת מטפל בדואר;
  • תוכנות זדוניות של Windows במאגר קבצים — לשרת עצמו לא אכפת, אבל ייפגע העובד שיוריד את הקובץ.

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

התקנה והגדרה אחת שחשובה

sudo apt install clamav clamav-daemon
sudo systemctl status clamav-freshclam

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

sudo ls -l /var/lib/clamav/*.c?d
sudo freshclam

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

זיכרון: דמון או הרצה חד-פעמית

יש שתי דרכי שימוש, והבחירה צריכה להיות מודעת.

clamd הוא דמון שרץ ברציפות ומחזיק את המאגרים בזיכרון. הוא עונה מהר אבל תופס כג׳יגה-בייט של RAM. ב-VPS עם ג׳יגה-בייט או שניים זה בלתי קביל: הדמון ידחוק את מסד הנתונים ואת PHP-FPM, והשרת יתחיל לזחול בלי סיבה נראית לעין. מאובחן עם free -m ולפי אזור החלפה פעיל.

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

sudo clamscan -r -i --exclude-dir='^/(proc|sys|dev|run)' /var/www

הדגל -i מדפיס רק את מה שנמצא; אחרת הפלט מגיע למאות אלפי שורות.

סרקו תיקיות, לא את הדיסק

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

0 3 * * * ionice -c3 nice -n19 clamscan -r -i --move=/var/quarantine /var/www/uploads

שלושה דברים בשורה הזאת חשובים. ionice ו-nice מסלקים את ההשפעה על האתר. --move במקום --remove — הקובץ הולך להסגר במקום להימחק: התראות שווא קורות, וקובץ של לקוח שנמחק בטעות אינו ניתן לשחזור משום מקום. והתיקייה לסריקה היא זו שאליה מעלים קבצים, לא השורש.

חתימות ל-web shells

המאגרים הסטנדרטיים של ClamAV חלשים מול דלתות אחוריות ב-PHP — הם מכוונים בעיקר לתעבורת דואר. Linux Malware Detect (maldet) טוב כאן במידה ניכרת: יש לו ערכת חתימות משלו שנבנתה בדיוק סביב web shells, והוא סורק במנוע של ClamAV אם הוא מותקן. הצירוף הרגיל הוא ClamAV כמנוע וכמאגר שמתעדכן, ו-maldet כמקור לחתימות ייעודיות.

מה לעשות עם ממצא

web shell שנמצא אינו סוף החקירה אלא תחילתה. קובץ בתיקיית ההעלאות פירושו שמישהו הצליח לכתוב שם, ומחיקת הקובץ אינה מסירה את היכולת הזאת.

  1. אל תמחקו מיד — שמרו עותק ורשמו את שעת השינוי של הקובץ.
  2. בעזרת אותה שעה מצאו ביומני שרת האתר איזו בקשה הניחה אותו שם. זו הפרצה.
  3. חפשו שכנים: דלת אחורית כמעט אף פעם אינה מושארת בעותק אחד.
  4. בדקו מה עוד השתנה בדיסק באותה תקופה והאם הופיעו משימות cron ומפתחות SSH חדשים.

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

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