אחד החסרונות בלהיות דוברי עברית היא שכל התאמה של ערכת עיצוב מצריכה הרבה יותר עבודה עבור כתיבה מימין לשמאל. למרבה המזל יש בישראל לא מעט מפתחים שהחליטו להצטרף למאמץ ולתרגם את הערכות לטובת הקהילה. מצד שני, מסתבר שיש מספר מפתחים שהחליטו לתרגם ערכות על מנת לנצל אותן לטובתם האישית. אחד מהם הוא אתר מאסטרגייט אשר הזריק לכל הערכות בכל האתרים שלו קוד זדוני ומסוכן המאפשר לו להשתלט על הבלוג שלכם ולהכניס לשם תוכן משל עצמו.
חשוב להבין – מדובר בקוד מסוכן שמקבל גישה אל השרת שלכם ויכול (ואף עושה בפועל) לעשות בו כרצונו. היות והערכות יכולות להכיל פונקציות מלאות הוא אפילו יכול בעיקרון לקבל גישה מלאה אל הבלוג שלכם.
לכן, ולפני הכל – אם הבלוג שלכם מריץ ערכת עיצוב שהגיע מאחד האתרים הבאים – הסירו אותה עכשיו במידי ואז חיזרו לקרוא.
mastergate.co.il
themeland.co.il
themes.org.il
wpstore.co.il (הערה, פה נמכרות תבניות בתשלום ולכן לא בדקתי את הקוד בפועל, אם קניתם דרך האתר ערכת עיצוב, אנא צרו איתי קשר על מנת שאוכל לבדוק)
הכל התחיל כשמיטל מבלוג הלקים גילתה שבפוטר של הערכה שלה, שהורדה מהאתר של מאסטרגייט, הופיעו לינקים שהיא לא שמה ולא רצתה בהם. ניסיון להסיר את הלינקים הללו הקפיץ הודעה שהאתר מפר זכויות יוצרים. זו, הייתה יריית הפתיחה – שכן מדובר בערכה המופצת תחת קוד GPL ולא רק שמותר לשנות בה את הקוד כאוות נפשנו, אלא שוודאי וודאי שאין למאסטרגייט שום זכויות יוצרים על הערכה.
התקנתי את הערכה על שרת מקומי והתחלתי לחפש את ההתערבויות, היות ומדובר בערכה די נרחבת קיים סיכוי סביר שלא מצאתי את הכל, אבל פה יש תיעוד של מה שמצאתי.
ההתחלה הייתה בקוד ה footer שם נמצא קוד ה PHP הבא:
eval(base64_decode("d3BfY2FjaGUoKTs="));
כאשר פתחנו את הקידוד נמצאה בתוכו הפונקציה
wp_cache();
לא ראינו שום סיבה להעלים את פונקציית ה cache אך ברגע שזו הוסרה הופיעה לפתע הודעה המכריזה כי האתר מפר זכויות יוצרים.
המקום הבא לחפש בו היה קובץ ה functions.php, זהו קובץ שנטען ביחד עם הערכה ומיועד לפונקציות יעודיות של המפתח. ואכן, בתוך הקובץ הלז, נמצאה שורה דומה:
eval(stripslashes(base64_decode(קוד זדוני ארוך פה));
לא סתם ציינתי כי מדובר בקוד זדוני, בוריס טרח לפרק את הקוד ולנתח אותו ויעלה פוסט בהקדם, נגיד רק שמדובר בקוד שמבצע גישה אל הדאטה בייס ואל הקבצים של הערכה, הוא ניגש אל השרת של מאסטרגייט ומוריד ממנו עידכונים אשר משוכתבים אל תוך הערכה עצמה. בפועל זה משמש להתקנת לינקים פירסומיים, בפועל, ניתן להשתמש בזה כדי להכניס כל קוד זדוני אחר.
לאחר שהשוותי את קבצי הפונקציה אל קבצי הערכה המקורית ראיתי שמדובר בתוספת שלא הוכנסה במקור על ידי המפתח המקורי. הסרתי את הפונקציה וטענתי את הבלוג מחדש – הפעם, כלום לא עבד.
יש שתי דרכים לפתור את הבעיה הזו, האחת ארוכה ויסודית ושולחת את המפתח לפתוח את הדחיסה ולקרוא את תכולת הקובץ. השניה, קלה יותר ומהירה יותר – להציץ בדוח השגיאות של שרת ה apache.
על אובונטו עושים את זה על ידי שימוש ב:
tail -f /var/log/apacge/error.log
הפונקציה tail “מציצה" למעשה אל סוף הקובץ הנקוב והפרמטר f אומר לפונקציה לעקוב אחרי שינויים בקובץ ולהדפיס אותם אל המסך. התוצאה אגב היא – בכל פעם שיש הודעת שגיאה היא תודפס בטרמינל.
לאחר הקלדת הפקודה וריענון העמוד קיבלתי את הודעת השגיאה הבאה:
Fatal error: Call to undefined function wp_get_header() in /home/nitzan/www/wordpress/wp-content/themes/des/index.php on line 1
אכן, הקובץ index.php הכיל קריאה לפונקציה wp_get_header רק שזו אינה פונקציה של וורדפרס. הפונקציה של וורדפרס היא get_header – החלפתי את הפונקציה ב get_header והמשכתי הלאה.
הודעת השגיאה הבאה שהתקבלה היא:
Fatal error: Call to undefined function wp_loaded() in /home/nitzan/www/wordpress/wp-content/themes/des/header.php on line 1
הפונקציה הזו אינה מוכרת לי אבל אכן בקובץ ה header.php נמצאה בדיקה בנוסח הבא:
<?php if (wp_loaded() === true) { ?>
הודעת השגיאה הבאה הייתה
Parse error: syntax error, unexpected '}' in /home/nitzan/www/wordpress/wp-content/themes/des/header.php on line 72
ואלו היו הסוגריים המסולסלים שסוגרים את הבדיקה של הפונקציה הקודמת.
לאחר ההסרה, חזר הבלוג לעבוד אבל ה footer לא הופיע יותר. בדיקה בקובץ index.php הראתה קריאה אל
wp_get_footer();
שבדיוק כמו במקרה הראשון – זו אינה הפונקציה המקורית אלא הסוואה שלה שכן הפונקציה המקורית היא
get_footer();
לאחר שינוי הפונקציה חזרה הערכה לעבוד בשלמותה בעמוד הראשי אבל דפים פנימיים חזרו להקפיץ הודעות שגיאה.
לצורך כך, על מנת להימנע מבדיקה של כל הערכה, הוספתי אל קובץ functions.php את הפונקציות הבאות:
function wp_get_header(){get_header();} function wp_get_footer(){get_footer();} function wp_loaded(){return true;}
ובכך הסתכם הטיפול בערכה. והיא חזרה לעבוד מבלי הקוד הזדוני שהושתל על ידי מאסטרגייט.
מדגימה של מספר ערכות באתר של מאסטרגייט ובאתר themes.org.il עלה כי בכולן הושתל קוד זדוני שכזה או דומה. ראוי לציין כי גם האתר wpstore.co.il הוא בבעלותו של מאסטרגייט, ואני מניח כי את אותם הקודים ניתן למצוא גם שם.
לסיכום
הזכויות לתרגום ערכה נגזרות מהיותה GPL ולכן מחייבות הפצה כ GPL, אם הוכנס "כל הזכויות שמורות" זה כבר דגל שאמור להחשיד. ככלל, ערכות עדיף ורצוי תמיד להוריד ממקורות בטוחים. רצוי תמיד לחפש את שם הערכה בגוגל, ברוב המקרים זה יוביל אתכם אל המקור. רצוי להוסיף שמאסטרגייט לא המציא את הגלגל, ראיתי קודים כאלה גם קודם באתרים אחרים ולפחות ערכה אחת שמצויה באתרו היא ערכה שבמקור הכילה קוד הגנה על זכויות יוצרים של המפתח – שהוסר והוחלף על ידי הקוד של מאסטרגייט.
הנוהג של השתלת לינקים על זכויות העברות הוא לא גם יחודי למאסטרגיט, ראיתי את זה במספר אתרים אחרים, מה שבטוח, כולם טוענים שהסרה של הקודים הן הפרה של זכויות היוצרים, רצוי לזכור שהתרגום נעשה מתוקף היות הערכה GPL ולכן, כחלק מהחוקים של GPL אין שום מניעה ואיסור וזו אף זכותכם המלאה להסיר את התוספות הללו מהקוד.
קריאה לפעולה
אם קניתם ערכה אצל אחת מחנויות הערכות הישראליות – אנא צרו איתי קשר למייל nitzanb (at) gmail.com – אני רוצה לבדוק עד כמה הנוהג הזה נפוץ ולעדכן.
עידכון – 16:10 – למרות שלמיטב ידיעתי האתר מסטרגייט שייך ליחיאל סימן טוב, הרי שעל פי רישום ה DNS הוא שייך כרגע לאדם אחר בשם ערן מיטל. אי לכך אין ביכולתי לדעת בוודאות באיזה תאריך בוצעה החלפת הבעלות ולכן אין ביכולתי לדעת האם הקוד הוא תורשה של יחיאל או תוספת של ערן.
זהירות ערכות בחינם מסוכנות – מאסטרגייט טימלנד
כתיבת תגובה