Skip to content

פשרה של תחנת עבודה למפתחים: תלות זדונית או תגובת הרחבת IDE

מספרי חירום שונים לפי מדינה. דף זה משתמש ב-911, המספר של ארצות הברית וקנדה. מדינות רבות אחרות משתמשות ב-112, 999 או מספר אחר. מצא את המספר עבור המדינה שלך.

מגלה כי חבילת תוכנה שהתקנת דרכה זה עתה npm install, pip install, cargo build, gem install, או go get, או תוסף Visual Studio Code, Cursor או JetBrains IDE שעודכן לאחרונה, הוא שגיאת הקלדה זדונית, מטען בלבול תלות או שחרור במעלה הזרם שנחטף מייצג מצב חירום של תשתית קריטית. בניגוד למחשבי צרכנים סטנדרטיים, מהנדס תוכנה, ארכיטקט DevOps או תחנת עבודה של מדען נתונים מחזיק מפתחות הצפנה ישירים לסביבות ענן ייצור, מאגרי קוד מקור, רישום מיכלים, צינורות CI/CD ומסדי נתונים של לקוחות. כאשר זדון preinstall או postinstall תסריט בפנים package.json, כלי נשק setup.py בגלגל פייתון, או בגלגל נפוץ .vsix ההרחבה מופעלת במחשב הנייד שלך, היא פועלת עם הרשאות המשתמש המלאות שלך וקוצרת מיד -/.aws/credentials, -/.ssh/id_ed25519, -/.npmrc, -/.pypirc, -/.kube/config, מקומי .env קבצים, macOS Keychain או Linux libsecret ערכים, וקובצי Cookie פעילות דפדפן בתוך שניות.

אם זה עתה הבנת שביצעת תלות זדונית בקוד פתוח, שיבטת ובנית מאגר נשק (כגון פרויקט ראיון טכני מזויף מהונאת מגייסים), או התקנת סיומת IDE בטרויאנית, כל שנייה שהמכונה שלך נשארת מחוברת לרשת מאפשרת למטען להסתובב לתוך הענן הארגוני שלך או לפרסם את תולעי הרישום של החבילות המפיצות את עצמו. אם המתקפה כרוכה בסחיטה, איומים פיזיים או הפרעה קריטית לתשתית ציבורית, התקשר למספר החירום המקומי שלך (911 בארצות הברית ובקנדה, 112 ברחבי האיחוד האירופי, 999 בבריטניה) או להתייעץ עם הבינלאומי שלנו מספרי חירום מַדרִיך. בצע את הליכי הבלימה, הניסויים הפורנזיים וסיבוב מפתחות קריפטוגרפיים באופן מיידי.

תעשה את זה עכשיו

  1. נתק את כל חיבורי הרשת בתחנת העבודה של המפתחים באופן מיידי (כבה את ה-Wi-Fi, נתק את ה-Ethernet, והרוג מנהרות VPN או SSH פעילות), אך אל תכבה או אתחל את המכשיר עדיין: ניתוק ה-Ethernet והחלפת Wi-Fi מונעת מפגז הפוך פעיל, משואה C2 או תולעת אוטומטית להשתמש באסימונים זדוניים או מסננים מקומיים נוספים שלך. השאר את המכונה מופעלת במצב לא מקוון (או השהה אותו רק לאחר לכידת רשימות תהליכים נדיפים) כדי שתוכל לבדוק תהליכי צאצא פועלים, שקעי רשת פתוחים, היסטוריית מעטפת, ואיזה בדיוק .env וקבצי אישורים נמצאים בדיסק ברגע הביצוע.
  2. השתמש במכשיר נפרד ונקי (כגון הטלפון החכם שלך על נתונים סלולריים או מחשב נייד שלא נגע) כדי להודיע ​​למרכז התפעול האבטחה שלך (SOC) ולבטל את הפעלות של כניסה יחידה (SSO) ו-Cloud IAM: לעולם אל תכנס ל-AWS, GCP, Azure, GitHub או Okta מתחנת העבודה הנגועה כדי לסובב מפתחות. אם גונב תושב זיכרון, תוסף IDE זדוני או פגז צופה במסוף ובדפדפן שלך, כל אסימון חדש שאתה יוצר במחשב הזה נקלט באופן מיידי.
  3. בטל וסובב את אסימוני המפתחים שלך ברדיוס הפיצוץ הגבוה בסדר עדיפות קפדני בתוך 15 הדקות הראשונות:
  4. עדיפות 1 (ענן ו-Kubernetes): השבת את כל מפתחות הגישה המקומיים של AWS IAM (AKIA...), לבטל את אישורי ברירת המחדל של Google Cloud Application (gcloud auth application-default revoke), לבטל אסימוני Azure CLI (az account clear + ביטול הפעלה של Entra ID), וסובב את Kubernetes kubeconfig אישורי לקוח או אסימוני חשבון שירות.
  5. עדיפות 2 (קוד מקור ו-CI/CD): מחק את כל המפתחות הציבוריים של GitHub, GitLab ו-Bitbucket SSH, אסימוני גישה אישיים (ghp_..., github_pat_..., glpat-...), ואסימוני OAuth CLI (-/.config/gh/hosts.yml), ובדוק את הגדרות ה-webhook של מאגר ופעולות GitHub / GitLab CI סודות.
  6. עדיפות 3 (רישום ומכולות של חבילות): בטל אוטומציה של npm ופרסם אסימונים (-/.npmrc), אסימוני API של PyPI (-/.pypirc), אסימוני התחברות של Docker Hub / GHCR / ECR (-/.docker/config.json), ואסימוני Terraform Cloud (-/.terraform.d/credentials.tfrc.json).
  7. בדוק את npm, PyPI, Cargo ו-GitHub ממש עכשיו כדי לוודא שהתוכנה הזדונית לא השתמשה כבר באסימונים המקומיים שלך כדי לפרסם גרסה נגועה בתולעת של החבילות שלך או לדחוף התחייבויות זדוניות: עומסי שרשרת אספקה מודרניים (כגון ua-parser-js, coa, rc, ctx, lottie-player, ו ultralytics פשרות) מנתחים אוטומטית את המפתחים של הקורבן -/.npmrc, -/.pypirc, ו -/.gitconfig לפרסם מיד גרסאות תיקון בדלת אחורית של כל קוד פתוח או חבילה פנימית שהמפתח שומר, או ליצור זרימות עבודה נסתרות של GitHub Actions במאגרים של המפתח.
  8. סרוק כל ספריית פרויקט בתחנת העבודה כדי לבנות מלאי שלם של חשופים .env קבצים, מחרוזות חיבור למסד נתונים ומפתחות API מקודדים: לפני מחיקת תחנת העבודה, הרץ סקריפט לא מקוון במחשב המבודד כדי לרשום כל .env, .env.local, terraform.tfstate, ו application.yml קובץ בכונן הקשיח שלך כדי שתוכל לסובב כל סוד צד שלישי (Stripe, Twilio, SendGrid, OpenAI, Anthropic, Datadog, Slack, Postgres, MongoDB ואישורי Redis) שהיה ניתן לקריאה על ידי חשבון המשתמש שלך.
  9. הפסק את כל הפעלות הדפדפן וחיבורי ארנק החומרה: מכיוון שמפתחים מתפשרים פורסים לעתים קרובות גונבי מידע על סחורות (כגון Lumma, RedLine או Atomic macOS Stealer) לצד אוספי אישורים ספציפיים למפתחים, עקוב אחר שלנו מדריך לחטיפת קובצי Cookie ו-Infostealer לביטול אסימון ואם אתה עוסק בפיתוח Web3 או מחזיק בנכסים דיגיטליים, בצע את שלנו מדריך לניקוז ארנק מטבע קריפטוגרפי ומשפט זריעה.

Danger

למה לרוץ npm uninstall <package> או pip uninstall <package> לא מנקה את תחנת העבודה שלך: ב-Node.js (npm, yarn, pnpm) ופייתון (pip) מערכות אקולוגיות, קוד זדוני כמעט אף פעם לא מחכה לך import או require() הספרייה בקוד היישום שלך. במקום זאת, התוקפים מניחים את המטען בתוך ווי מחזור החיים של החבילה (preinstall, install, או postinstall ב package.json, או ביצוע ברמה העליונה בפנים setup.py במהלך בניית גלגל הפצת מקור). הרגע שבו לחצת Enter על npm install או pip install, סקריפט המעטפת השרירותי או הבינארי של התוקף שבוצע במערכת ההפעלה שלך, העתיק את -/.ssh, -/.aws, ו .env קבצים לשרת חיצוני, ולעתים קרובות הזרימו דלת אחורית מתמשכת לתוכו -/.bashrc, -/.zshrc, crontab, או -/Library/LaunchAgents. הסרת ההתקנה של החבילה לאחר מכן רק מוחקת את התיקיה שבתוכה node_modules או site-packages תוך השארת המפתחות הגנובים בידי התוקף ואת מנגנון ההתמדה הפועל במערכת ההפעלה שלך.


עץ החלטות: ניסוי פשרה של תחנת עבודה של מפתח שרשרת האספקה

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

flowchart TD
    Detect["חשד לזדוני npm / PyPI / Cargo Package, הרחבת IDE טרויאנית או ריפו מגייס מזויף בוצע"] --> Isolate["שלב 1: נתק מיידית Wi-Fi ו-Ethernet של תחנת עבודה (השאר את המכונה מופעלת עבור טריאג' לא מקוון)"]

    Isolate --> ScopeCheck{"האם הביצוע התרחש במערכת ההפעלה המארח או בתוך מיכל מבודד / VM?"}
    ScopeCheck -->|"מערכת הפעלה מארח (Mac / Linux / Windows / WSL2)"| FullCompromise["נניח ש-100% ממדריך הבית (-/.aws, -/.ssh, -/.npmrc, .env, קובצי Cookie של דפדפן) הוחלפו"]
    ScopeCheck -->|"DevContainer / Docker"| MountCheck["בדוק תקינות נפח (-v -/.ssh, -v -/.aws, Docker Socket /var/run/docker.sock או Host Network)"]
    MountCheck --> FullCompromise

    FullCompromise --> CleanDevice["שלב 2: ממכשיר ניקוי נפרד, התריע על SOC ובטל ענן IAM, SSO, GitHub/GitLab ואסימוני רישום"]

    CleanDevice --> WormCheck["שלב 3: ביקורת על התחייבויות GitHub, זרימות עבודה של CI/CD ו-npm/PyPI שפורסמו גרסאות להפצה אוטומטית של תולעים"]

    WormCheck --> OfflineAudit["שלב 4: בתחנת עבודה לא מקוונת, מלאי את כל קבצי ה-.env, קבצי Terraform State ודלתות אחוריות של התמדה"]

    OfflineAudit --> RotateEnv["שלב 5: סובב כל סיסמת מסד נתונים, סוד Webhook, מפתח חתימת GPG ומפתח API שנמצאו בקבצי .env / State"]

    RotateEnv --> RebuildOS["שלב 6: מחק את תחנת העבודה באמצעות התקנה מחדש של מערכת ההפעלה נקייה -> אכיפת מפתחות SSH מגובי חומרה, OIDC ו--ignore-scripts"]

הבנה כיצד פועלים וקטורי שרשרת האספקה של מפתחים ו-IDE

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

1. וויסי מחזור חיים של חבילה זדונית (npm, pnpm, yarn, pip, cargo, gem)

  • Node.js (package.json סקריפטים): כברירת מחדל, פועל npm install מבצע אוטומטית כל פקודת מעטפת שהוגדרה ב- "preinstall", "install", או "postinstall" שדות של package.json, לא רק עבור החבילה ברמה העליונה שהקלדת, אלא עבור כל תלות טרנזיטיבית בעץ. תוקפים משתמשים ב-הקלדה (למשל, reqeusts, crossenv, lodahs), בלבול תלות (פרסום חבילה ציבורית ב-npm או PyPI עם אותו שם בדיוק ומספר גרסה גבוה יותר, כגון 99.99.9, בתור החבילה הפרטית הפנימית של החברה שלך), או השתלטות על חשבון מנהל כדי להחליק שורה אחת כמו "postinstall": "node index.js" לתוך חבילה.
  • Python (setup.py ו .pth קבצים): מתי pip מתקין הפצת מקור (sdist .tar.gz), זה מבוצע setup.py עם הרשאות מתורגמן מלאות של Python. גם בעת התקנת גלגלים בינאריים מהודרים מראש (.whl) שאינם מבוצעים setup.py במהלך ההתקנה, התוקפים כוללים זדוני .pth (תצורת נתיב) קבצים נפל ישירות לתוך site-packages/. כל קו בתוך א .pth קובץ שמתחיל ב import מבוצע אוטומטית על ידי מתורגמן Python בכל פעם python מופעל על המערכת הזו.
  • חלודה (build.rs) וגו: ב-Rust, Cargo מבצע קומפילציה וביצוע אוטומטית build.rs לא רק במהלך cargo build או cargo run, אבל מיד כאשר rust-analyzer (בתוך VS Code או IntelliJ) פותח תיקיית פרויקט לאינדקס סוגי. רק פתיחת מאגר Rust משובט ב-IDE שלך rust-analyzer Enabled מבצע קוד שרירותי בפנים build.rs לפני שאתה מקליד פקודת מסוף.

2. הרחבות IDE זדוניות או חטופות (VS Code Marketplace, OpenVSX, JetBrains)

  • הרחבות Visual Studio Code, Cursor, Windsurf ו- VSCodium (.vsix) הפעל בתהליך הראשי של Node.js Extension Host בתחנת העבודה שלך עם אפס ארגז חול. לכל תוסף מותקן יש גישת קריאה/כתיבה מלאה לכל מערכת הקבצים שלך, יכולה להוליד תהליכי צאצא שקטים (child_process.exec), יכול לקרוא כל מאגר עורך פתוח ו .env קובץ, ויכול לחבר את המסוף המשולב שלך.
  • שחקני איום מפרסמים באופן שגרתי הרחבות נושא מזויפות (Darcula Official), עוזרי קידוד בינה מלאכותית מזויפת, או תוספים עם שגיאות הקלדה/הרחבות יפות יותר שמורידות בשקט גנב מידע שלב שני או מעטפת הפוכה ברגע שה-IDE מושק.

3. מאגרי Git עם נשק וביצוע אוטומטי של סביבת עבודה של IDE ("מלכודות מגייס מזויף / מבחן קח הביתה")

  • קבוצות בחסות מדינה צפון קוריאנית (Contagious Interview / Lazarus Group) ושחקני איומים ממוקדי קריפטו פונים באופן שגרתי למפתחים בלינקדאין, Upwork או GitHub כשהם מתחזים למגייסים או ל-CTO המציעים תפקידים מרוחקים בשכר גבוה. הם מבקשים מהמפתח לשכפל מאגר Bitbucket או GitHub עבור "הערכה של 15 דקות באגים" או "סקירת MVP של Web3 gaming."
  • מאגרים אלה מכילים מלכודות ביצוע נסתרות המופעלות בעת פתיחה ב-IDE או במהלך בנייה:
  • .vscode/tasks.json עם "runOn": "folderOpen": מפעיל אוטומטית סקריפט מעטפת רקע ברגע שאתה לוחץ על "כן, אני סומך על המחברים" בקוד VS.
  • זדוני .git/hooks/ או .gitmodules: מנצל את תצורת תת-מודול Git או בניית סקריפטים (Makefile, webpack.config.js, next.config.js, vite.config.ts) שטוענים מטענים מעורפלים של JavaScript (לעתים קרובות מרופדים באלפי רווחים מחוץ למסך כדי להסתתר בעמודה 2,000+) הקוראים לשרת C2 חיצוני.

שלב 1: השלם אישורי מפתח ומטריצת סיבוב סודי

באמצעות מחשב נייד או סמארטפון משני נקי, עבדו באופן שיטתי דרך מלאי האישורים של מפתחים זה בן 12 נקודות. נניח שכל קובץ הניתן לקריאה על ידי חשבון המשתמש שאינו של מערכת ההפעלה הבסיסית שלך (chmod 600 או 644 בבעלות המשתמש שלך) הועלה לשרת של התוקף תוך 3 שניות מביצוע המטען.

קטגוריית אישורים נתיב קבצים מקומיים מדויקים שנאספו בתחנת עבודה פעולת ביטול וסיבוב חובה (ממכשיר נקי)
1. AWS IAM & SSO -/.aws/credentials
-/.aws/config
-/.aws/sso/cache/*.json
-/.aws/cli/cache/*.json
1. ב-AWS IAM Console, מיד בטל ומחק את כל מפתחות הגישה הסטטיים (AKIA...) מאוחסן באותו מחשב נייד.
2. ב-AWS IAM Identity Center (SSO), בטל הפעלות משתמש פעילות ומחק אסימוני מכשירי לקוח רשומים של OIDC.
3. ביקורת AWS CloudTrail עבור GetCallerIdentity, CreateUser, CreateAccessKey, AssumeRole, ListBuckets, ו SecretsManager:GetSecretValue שיחות שמקורן בכתובות IP חריגות או סוכני משתמש (Boto3, aws-cli, Go-http-client).
2. Google Cloud (GCP) ו-Firebase -/.config/gcloud/credentials.db
-/.config/gcloud/access_tokens.db
-/.config/gcloud/application_default_credentials.json
-/.config/configstore/firebase-tools.json
*-service-account.json
1. עבור אל myaccount.google.com/permissions ובטל גישה עבור Google Cloud SDK וFirebase CLI.
2. ב-GCP Console > IAM & Admin > Service Accounts, מחק כל מפתח JSON של חשבון שירות (private_key_id) שהורד אל הכונן הקשיח של תחנת העבודה.
3. בדוק את יומני הביקורת בענן עבור קישורי IAM לא מורשים או יצירת Compute Engine.
3. Microsoft Azure & Entra ID -/.azure/msal_token_cache.bin
-/.azure/accessTokens.json
-/.azure/azureProfile.json
1. יש להפעיל Entra ID Admin Revoke-MgUserSignInSession -UserId <your-user-id> כדי לבטל את כל אסימוני הרענון ואסימוני הרענון הראשיים (PRT).
2. מחק כל סודות או אישורים של הלקוח של מנהל השירות המאוחסנים באופן מקומי.
4. Kubernetes & Helm -/.kube/config
-/.kube/cache/
-/.config/helm/registry/config.json
1. אם -/.kube/config הכיל אישורי לקוח סטטיים (client-certificate-data / client-key-data) או אסימוני נושאי חשבון שירות ארוכי טווח, בטל את האישור באמצעות ה-CA שלך באשכול (CSR / הסרת RBAC) או מחק וצור מחדש את ServiceAccount סוד מיד.
2. בדוק את יומני הביקורת של Kubernetes API Server עבור exec, pods, או secrets רשום/קבל פעלים.
5. GitHub, GitLab וביטבוקט -/.ssh/id_ed25519, -/.ssh/id_rsa
-/.config/gh/hosts.yml
-/.git-credentials, -/.netrc
-/.gitconfig
1. עבור אל github.com/settings/keys (ומקבילות ל-GitLab/Bitbucket) ו-מחק את המפתח הציבורי של SSH ומפתח החתימה על התחייבות GPG/SSH מהמחשב הנגוע.
2. עבור אל github.com/settings/tokens וgithub.com/settings/applications כדי לבטל את כל אסימוני הגישה האישיים (ghp_, github_pat_), אפליקציות OAuth (GitHub CLI, VS Code, Git Credential Manager), והפעלות אינטרנט פעילות.
3. סמן את יומן האבטחה (github.com/settings/security-log) עבור repo.clone, org.Invite_member, או hook.create.
6. מפתחות GPG ומפתחות חתימת קוד -/.gnupg/private-keys-v1.d/
-/Library/Keychains/login.keychain-db (מזהה מפתח אפל / .p12)
1. אם המפתח הפרטי שלך GPG נשמר בדיסק ללא כרטיס חומרה חכם (YubiKey OpenPGP) ומשפט הסיסמה נשמר במטמון gpg-agent או הקלד לאחרונה, צור ופרסם אישור ביטול GPG באופן מיידי והסר את מפתח GPG מ-GitHub/GitLab.
2. בטל כל מפתח מיוצא של Apple .p12 או חנות המפתחות של אנדרואיד .jks אישורי חתימת קוד המאוחסנים במכשיר.
7. רישום חבילות (npm, PyPI, Cargo, RubyGems, NuGet) -/.npmrc (_authToken=...)
-/.pypirc
-/.cargo/credentials.toml
-/.gem/credentials
1. היכנס אל npmjs.com > Access Tokens, pypi.org > הגדרות חשבון > API tokens, crates.io > Account Settings > API Tokens, ו-rubygems.org, ובטל את כל האסימונים הפעילים באופן מיידי.
2. בדוק את החבילות שפורסמו (ראה שלב 2 להלן) כדי לוודא שהתוקף לא דחף מהדורה בדלת אחורית בשעות האחרונות.
8. דוקרים ומיכלים -/.docker/config.json (Base64 auths עבור Docker Hub, GHCR, ECR, GCR, Quay) 1. זכור את זה "auth" ב -/.docker/config.json (כשלא משתמשים credsStore: osxkeychain או wincred) הוא רק לא מוצפן Base64 username:password_or_token.
2. בטל אסימוני גישה אישיים ב- Docker Hub (hub.docker.com/settings/security), GitHub Container Registry ו- Quay.io.
9. תשתית כקוד (Terraform / Pulumi / Ansible Vault) -/.terraform.d/credentials.tfrc.json
**/terraform.tfstate (קבצי מדינה מקומית)
-/.pulumi/credentials.json
-/.vault-token
1. בטל את אסימוני ה-API של משתמשי Terraform / Enterprise ואסימוני HashiCorp Vault.
2. קריטי: כל מקומי terraform.tfstate הקובץ בדיסק שלך מכיל סיסמאות טקסט רגיל, אישורי ראשי RDS, מפתחות TLS פרטיים ומפתחות סודיים של IAM עבור כל משאב המנוהל על ידי מדינה זו. סובב כל סוד שמתייחס אליו בתוך מקומי .tfstate קבצים.
10. מסדי נתונים והיסטוריות CLI של מטמון -/.psql_history, -/.pgpass
-/.mysql_history, -/.my.cnf
-/.rediscli_history
-/.mongodb/mongosh/
תצורות DBeaver / TablePlus / DataGrip
1. מנהלי מסדי נתונים של ממשק משתמש (TablePlus, DBeaver, DataGrip, Postico, pgAdmin, MongoDB Compass) מאחסנים סיסמאות מסד נתונים מוצפנות או מעורפלות באופן מקומי שגונבים מפענחים באופן שגרתי.
2. סובב סיסמאות משתמש של מסד נתונים עבור כל מסד נתונים בימוי או ייצור הנגיש באמצעות VPN, בסטיון או IP ציבורי מתחנת העבודה שלך.
11. יישום .env קבצים ומפתחות SaaS של צד שלישי **/.env, **/.env.local, **/.env.production, **/.env.development סובב כל מפתח API המאוחסן בתוך הפרויקט המקומי .env קבצים: פס (sk_live_...), OpenAI (sk-...), אנתרופית (sk-ant-...), Twilio, SendGrid, AWS SES, Slack Bot Tokens (xoxb-...), Discord Bot Tokens, Datadog, Sentry, Supabase (service_role), סודות החתימה של Firebase ו-JWT.
12. מארחים ידועים של SSH ושרתי Bastion Jump -/.ssh/config
-/.ssh/known_hosts
-/.zsh_history, -/.bash_history
התוקפים מנתחים מיד -/.ssh/config ו -/.zsh_history כדי למצוא כל שרת פנימי, מארח מארח ושם משתמש שאליהם אתה מתחבר, ולאחר מכן השתמש בגנוב שלך -/.ssh/id_ed25519 מפתח להתחבר ישירות לשרתים האלה. הסר את המפתח הציבורי הישן שלך מ-/.ssh/authorized_keys בכל שרת לינוקס מרוחק ובדוק /var/log/auth.log בשרתים אלה עבור כניסות SSH לא מורשות.

שלב 2: בדיקת התפשטות אוטומטית של תולעת שרשרת אספקה (GitHub, CI/CD ורישומי חבילות)

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

  1. בדוק את מאגרי GitHub / GitLab שלך עבור דלתות אחוריות שקטות וזרימות עבודה זדוניות:
  2. בדוק .github/workflows/*.yml בכל המאגרים שיש לך גישת כתיבה אליהם: תולעי שרשרת אספקה אחרונות (Shai-Hulud, tj-actions/changed-files פשרות, ו ultralytics ניצול) להשתמש באופן אוטומטי באסימוני מפתחים גנובים כדי לבצע זרימת עבודה זדונית של GitHub Actions או לשנות זרימת עבודה קיימת ל-dump ${{ toJSON(secrets) }} (מסננת את סודות פריסת הייצור של הארגון שלך מהרצים של GitHub Actions).
  3. אמת התחייבויות אחרונות לפי חותמת זמן של מחבר ומתחייב: זכור שכל אחד יכול לזייף שם וחותמת זמן של מחבר Git (git commit --date="..." --author="..."). ב-GitHub, בדוק את אירועי הדחיפה במאגר תצוגת פעילות או בארגון יומן ביקורת (repo.push), אשר מתעדים את חותמת הזמן האמיתית בצד השרת ואת אסימון האימות המדויק (oauth_application_id או ssh_key_fingerprint) שדחף את הקוד.
  4. בדוק את Repository Webhooks, Deploy Keys, and Collaborators: עיין בקטע הגדרות > Webhooks, Settings > Deploy keys, ו-Settings > Collaborators and Teams במאגרים שלך כדי לוודא שהתוקף לא הוסיף מפתח פריסת קריאה/כתיבה מתמשך או שרת אינטרנט חיצוני המפנה לשרת חיצוני.
  5. Audit npm, PyPI, Cargo ו-Docker Hub לשחרור חבילות לא מורשות:
  6. אם אתה מתחזק או משתף פעולה בכל חבילה ציבורית או פרטית ב-npm, PyPI, RubyGems או Crates.io, בדוק את הכרטיסייה גרסאות / היסטוריית שחרורים עבור כל חבילה בחשבונך.
  7. אם גרסת תיקון (לדוגמה, 1.4.2 לאחר השחרור הלגיטימי האחרון שלך 1.4.1) פורסם במסגרת הזמן של התפשרות על תחנת העבודה שלך, בטל מיידית או דחף את הגרסה הזו (npm deprecate <pkg>@<version> "CRITICAL: Compromised version, do not use" או למשוך את PyPI) וצור קשר עם התמיכה של npm (security@npmjs.com / GitHub Security) או PyPI Security (security@pypi.org) כדי להסיר את החפץ הזדוני והגרסאות המושפעות מהסגר.
  8. בדוק את סוד TruffleHog / Git Clone Exfiltration:
  9. גונבי שרשרת אספקה מתקשרים לעתים קרובות ל-GitHub/GitLab API באמצעות האסימון הגנוב שלך כדי לשכפל כל מאגר ארגוני פרטי שיש לך גישה אליו ולהפעיל סורקים סודיים אוטומטיים (TruffleHog או Gitleaks) כנגד כל היסטוריית ההתחייבויות של החברה שלך. אם הארגון שלך אי פעם ביצע סוד בטעות להיסטוריית Git של מאגר פרטי מבלי לסובב אותו, סובב את הסודות ההיסטוריים האלה עכשיו.

שלב 3: בדיקה משפטית לא מקוונת בתחנת העבודה שנפגעה

כאשר תחנת העבודה שלך מנותקת לחלוטין מ-Wi-Fi ו-Ethernet, פתח חלון מסוף כדי לבצע בדיקה לא מקוונת. המטרה שלך כפולה: (A) לאתר כל .env וקובץ תצורה בדיסק כדי שתדע אילו סודות לסובב, ו-(B) ללכוד עדויות למה שהחבילה הזדונית או ההרחבה הזדונית ביצעו בפועל לפני מחיקת מערכת ההפעלה.

שלב 1: מלאי כל חשיפה .env, מפתח פרטי וקובץ מצב בדיסק שלך

הפעל את הפקודה לקריאה בלבד בתחנת העבודה הלא מקוונת שלך ב-macOS, Linux או WSL2 כדי ליצור רשימת בדיקה מלאה של כל קובץ מקומי המכיל סודות שהתוכנה הזדונית הייתה יכולה לקרוא:

# Create an offline audit list of all .env files, Terraform states, kubeconfigs, and private keys in your home directory:
find ~ -maxdepth 5 \( \
    -name ".env" -o \
    -name ".env.*" -o \
    -name "*.tfstate" -o \
    -name "*.tfstate.backup" -o \
    -name "*.pem" -o \
    -name "*.key" -o \
    -name "*.p12" -o \
    -name "*.pfx" -o \
    -name "*service-account*.json" -o \
    -name "credentials.json" -o \
    -name ".npmrc" -o \
    -name ".pypirc" -o \
    -name ".netrc" \
\) -not -path "*/node_modules/*" -not -path "*/.git/*" -not -path "*/Library/Caches/*" 2>/dev/null > ~/exposed_secrets_inventory.txt

cat ~/exposed_secrets_inventory.txt

סקירה -/exposed_secrets_inventory.txt שורה אחר שורה ופתח כל אחד .env או .tfstate קובץ במצב לא מקוון כדי שתוכל לסובב כל מפתח API, סיסמת מסד נתונים וסוד ה-webhook הרשומים בתוכם מהמכשיר הנקי שלך.

שלב 2: בדוק מה בוצעה החבילה הזדונית או הרחבת IDE

לפני מחיקת התיקיה הפוגעת, בדוק את המטען המדויק ובדוק היכן הוא התקינה התמדה במערכת ההפעלה שלך:

# 1. Inspect package.json lifecycle scripts in the suspect project and its node_modules:
grep -rnE '"(preinstall|install|postinstall|prepublish|prepare)"' ./package.json ./node_modules/*/package.json ./node_modules/@*/*/package.json 2>/dev/null

# 2. Check Python site-packages for malicious .pth startup hook files:
find . -path "*/site-packages/*.pth" -exec head -n 20 {} + 2>/dev/null

# 3. Inspect recently installed or modified VS Code / Cursor / Windsurf Extensions:
ls -lt ~/.vscode/extensions/ ~/.cursor/extensions/ ~/.windsurf/extensions/ 2>/dev/null | head -n 30

# 4. Check for persistence injected into your Shell RC profiles and Git global hooks:
tail -n 30 ~/.zshrc ~/.bashrc ~/.bash_profile ~/.zprofile ~/.profile 2>/dev/null
git config --global --list | grep -E "core.hooksPath|alias|credential|filter"

שלב 3: ציד אחר התמדה ברמת מערכת ההפעלה שנפלה על ידי תוכנה זדונית למפתחים (macOS, Linux ו-Windows)

תלות זדונית ומאגרים של "מגייס מזויף" מפילים לעתים קרובות סוכני רקע מתמשכים המחופשים לעדכוני מערכת, דמוני צומת או אינדקסים של Spotlight:

  • ב-Apple macOS:
    # 1. Check user and system LaunchAgents / LaunchDaemons for recently added .plist files:
    ls -laht ~/Library/LaunchAgents /Library/LaunchAgents /Library/LaunchDaemons
    
    # 2. Check active cron jobs and running background node/python/curl/nohup processes:
    crontab -l
    ps aux | grep -iE "node|python|osascript|curl|wget|nc|bash -i|/tmp/|/var/tmp/|Library/Application Support"
    
  • ב-Linux / Ubuntu / Fedora / WSL2:
    # 1. Check user systemd services, cron jobs, and SSH authorized_keys:
    ls -la ~/.config/systemd/user/ /etc/systemd/system/
    crontab -l
    cat ~/.ssh/authorized_keys
    
    # 2. Check running processes executing out of /tmp, /dev/shm, or ~/.cache:
    ls -la /proc/*/exe 2>/dev/null | grep -E "/tmp/|/dev/shm/|\.cache|\.local"
    
  • ב-Windows (מקורי או מארח של WSL2):
  • זכור שסקריפט זדוני npm או Python הפועל בתוך WSL2 (Windows Subsystem for Linux) יכול לגשת ישירות לכל מארח Windows שלך C:\ סע דרך /mnt/c/Users/<username>/ ויכול להפעיל powershell.exe או cmd.exe ישירות מתוך מעטפת לינוקס כדי להדביק את רישום המארח של Windows (HKCU:\Software\Microsoft\Windows\CurrentVersion\Run), משימות מתוזמנות ו-Chrome/Edge Cookies מסדי נתונים.
  • הפעל את ביקורת ההתמדה המלאה של Windows PowerShell אצלנו מדריך לחטיפת עוגיות הפעלה וגניבת מידע ושלנו מדריך להדבקה בתוכנות זדוניות, כופר ותוכנות ריגול.

שלב 4: מדוע עליך למחוק ולבנות מחדש את תחנת העבודה למפתחים

גם אם תמצא ותמחק את הזדוני node_modules תיקיה, ה .vsix הרחבה, ונוכל -/Library/LaunchAgents plist, לעולם אל תמשיך להשתמש בתחנת עבודה של מפתחים שנפגעו לצורך הנדסת ייצור מבלי לבצע מחיקה נקייה של מערכת ההפעלה והתקנה מחדש.

עומסים מתוחכמים ממוקדי מפתחים משנים קבצי קבצי תצורה או בינאריים לגיטימיים קיימים במערכת שלך שאף סורק אנטי-וירוס לא מסמן כזדוני: 1. Trojanized CLI בינאריים מקומיים (git, ssh, sudo, aws, kubectl, docker): מטען שפועל תחת חשבון המשתמש שלך לא יכול לדרוס /usr/bin/ssh בלי sudo, אז במקום זאת הוא משחרר סקריפט עטיפה ב--/.local/bin/ssh, -/bin/git, או -/bin/sudo ומצמיד את הספרייה הזו לפניך PATH. בפעם הבאה שאתה מקליד sudo או ssh -i לאחר חיבור מחדש לאינטרנט, העטיפה מיירטת בשקט את הסיסמה או ביטוי הסיסמה שלך ומעבירה אותה לתוקף לפני שהוא קורא לבינארי האמיתי. 2. מטמון חבילות מקומי נגוע (-/.npm/_cacache, -/.cache/pip, -/.cargo/registry, -/Library/Caches/pnpm): תוכנה זדונית עלולה להרעיל כדורי זיכרון במטמון בתוך מטמון מנהל החבילות המקומי שלך, כך שגם כאשר תתקין חבילה נקייה ולגיטימית בשבוע הבא, מנהל החבילות שלך יפרק את ה-tarball בדלת האחורית מהמטמון המקומי שלך. 3. ** קבצי ליבת IDE ששונו (workbench.desktop.main.js)**: מטענים מסוימים של קוד VS ו-cursor מתקינים ישירות את האלקטרון asar ארכיון או workbench.desktop.main.js בתוך חבילת יישומי IDE כך שהדלת האחורית שורדת בהסרה של כל ההרחבות.

גבה רק קוד מקור טהור (מאומת באמצעות git status ו git diff במכונה נקייה) ומסמכים אישיים, ולאחר מכן בצע נקי macOS Erase All Content and Settings / DFU Restore, התקנת Linux USB נקייה, או התקנת Windows 11 USB נקייה.


הקשחת תחנת העבודה החדשה שלך למפתחים מפני התקפות עתידיות של שרשרת האספקה

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

1. השבת את הפעלת סקריפט מחזור חיים אוטומטית במנהלי חבילות

הגדר npm, pnpm, yarn, ו pip אז תלות לא מהימנה לא יכולה לבצע בשקט סקריפטים של מעטפת במהלך ההתקנה: - Node.js (npm / yarn / pnpm):

# Globally disable automatic preinstall/postinstall script execution in npm:
npm config set ignore-scripts true
( הערה: pnpm v10+ משבית כעת סקריפטים לבניית מחזור חיים עבור תלות כברירת מחדל, אלא אם כן הרשימה מפורשת באמצעות pnpm.onlyBuiltDependencies ב package.json, עושה pnpm v10+ בטוח יותר באופן משמעותי מפני תולעים בשרשרת האספקה מאשר ברירת מחדל npm.) - Python (pip / uv):
# Refuse to run arbitrary setup.py scripts from source distributions (.tar.gz); require binary wheels only:
export PIP_ONLY_BINARY=":all:"
- חלון צינון / גיל שחרור מינימלי: רוב גרסאות ה-npm וה-PyPI הזדוניות מזוהות ומוסרות תוך 4 עד 24 שעות מהפרסום. הגדר את מנהל החבילות או ה-proxy של החפצים שלך (כגון npm config set before, pnpm minimumReleaseAge, או Socket.dev / Artifactory firewall) כדי לדחות גרסאות חבילה שפורסמו במהלך 48 עד 72 השעות האחרונות האחרונות.

2. הסר טקסט פשוט -/.ssh/id_ed25519, -/.aws/credentials, ו .env קבצים מהדיסק

  • העבר מפתחות SSH לתוך חומרה YubiKey (ed25519-sk) או מובלעת מאובטחת / סוכן ביומטרי:
  • לעולם אל תשאיר ביטוי לא מוצפן או חסר ביטוי סיסמה -/.ssh/id_ed25519 קובץ בדיסק. או ליצור מפתח FIDO2 SSH תושב חומרה (ssh-keygen -t ed25519-sk -O verify-required) על YubiKey פיזי (שמצריך מגע אצבע פיזי במגע המתכתי עבור כל אחד git push או ssh חיבור), או אחסן את מפתחות ה-SSH שלך בתוך 1Password SSH Agent / Secretive (macOS Secure Enclave) שבו המפתח הפרטי לעולם לא קיים כקובץ ב- -/.ssh/ וכל חתימה מבקשת מגע מזהה / Windows Hello.
  • החלף סטטי -/.aws/credentials (AKIA...) עם SSO קצר מועד (aws sso login או aws-vault):
  • מחק את כל מפתחות הגישה הקבועים למשתמש IAM (AKIA...). השתמש ב-AWS IAM Identity Center (aws sso login) עם משכי הפעלה קצרים (1 עד 4 שעות) או לעטוף אישורים בפנים aws-vault מגובה ב-macOS Keychain / Windows Credential Manager עם הנחיות ביומטריות.
  • החלף טקסט פשוט .env קבצים עם הזרקה סודית בזמן ריצה (1Password CLI op run, Doppler, או aws-vault):
  • במקום לאחסן STRIPE_SECRET_KEY=sk_live_... בטקסט פשוט .env קובץ כי כל node_modules תסריט יכול fs.readFileSync('.env'), הפניות לחנות כמו STRIPE_SECRET_KEY="op://Dev-Vault/Stripe/secret_key" והפעל את שרת הפיתוח המקומי שלך באמצעות op run --env-file=".env.template" -- npm run dev לאחר אימות באמצעות Touch ID.
  • השתמש בהוצאה מהימנה (OIDC) במקום באורך חיים -/.npmrc ו -/.pypirc אסימונים:
  • לעולם אל תשמור בפנים אסימון בעל יכולת פרסום -/.npmrc או -/.pypirc במחשב הנייד שלך. גם PyPI וגם npm (דרך מקור / OIDC) מאפשרים לך לפרסם חבילות באופן בלעדי מ-GitHub Actions / GitLab CI Trusted Publishers מבודדים באמצעות אסימוני OpenID Connect (OIDC) קצרי מועד, כלומר אפס אסימוני פרסום קיימים אי פעם במחשב הנייד של כל מתחזק.

3. לבודד מאגרים לא מהימנים ולבנות סקריפטים בתוך DevContainers או VMs מוקשחים

  • לעולם אל תשכפל ותריץ "הערכה של גיוס קח הביתה", פרויקט קוד פתוח לא מוכר או מאגר פרס ישירות במערכת ההפעלה המארח שלך:
  • הפעל פרויקטים לא מוכרים בתוך GitHub Codespace, VM חד פעמי בענן, או Docker DevContainer מקומי שמבצע לא מקשר את ספריית הבית המארח שלך (-), האם לא עולה /var/run/docker.sock, ומעביר רק אסימון Git בעל היקף לקריאה בלבד במידת הצורך.
  • בדיקת קוד VS / הרחבות סמן והשבת עדכונים אוטומטיים עבור מפרסמים לא מאומתים:
  • זכור שסמן, גלישת רוח ו-VSCodium מושכים הרחבות מהרישום OpenVSX (open-vsx.org) במקום ה-Visual Studio Marketplace הרשמי של Microsoft. אמת את מרחב השמות המדויק של בעל האתר וספירת ההתקנות לפני התקנת תוסף כלשהו, שמור על רשימת התוספים המותקנים מינימלית, והסר את התקנת הרחבות שאינך משתמש בהן יותר באופן פעיל.

שאלות נפוצות

אכן רץ npm install --ignore-scripts להגן עליי לחלוטין מחבילת npm זדונית?

ריצה npm install --ignore-scripts חוסם את וקטור התקפת שרשרת האספקה הנפוץ ביותר: ביצוע אוטומטי של התקנה מראש, להתקין, ו לאחר התקנה פקודות מעטפת המוגדרות בפנים package.json בזמן ההתקנה. עם זאת, זה לא מגן עליך ברגע שאתה באמת מבצע את קוד ה-JavaScript של החבילה (לדוגמה, כשאתה מפעיל npm run dev, מבחן npm, בצחוק, חבילת אינטרנט, או vite, או כאשר הפלאגין ESLint/TypeScript של ה-IDE שלך טוען תוסף זדוני מ node_modules). מכיוון שלNode.js אין מערכת קבצים או ארגז חול רשת כברירת מחדל, כל קוד שיובא במהלך הבנייה או שלב הבדיקה שלך עדיין יכול לקרוא -/.aws ו -/.ssh אלא אם כן אתה מבודד את ה-build בתוך קונטיינר או משתמש במודל ההרשאות הניסיוני של Node (node --permission).

פתחתי מאגר חשוד ב- VS Code ממגייס בלינקדאין, ולחצתי על "כן, אני סומך על המחברים" לפני שהבנתי שמדובר בהונאה. האם הקוד הופעל גם אם מעולם לא רצתי npm install?

כן, אתה חייב להניח שקוד שרירותי בוצע בשנייה המדויקת שלחצת על "כן, אני סומך על המחברים." ב-Visual Studio Code and Cursor, הענקת Workspace Trust מאפשרת מיד את המאגר .vscode/tasks.json קובץ להפעלת משימות מעטפת רקע שהוגדרו איתה "runOn": "Open folder", מאפשר הגדרת סביבת עבודה .vscode/settings.json להפנות שרתי שפה (כגון Python, TypeScript, ESLint או Rust Analyzer) לנתיבי הפעלה זדוניים בתוך תיקיית המאגר, ומפעילה הפעלה אוטומטית של build.rs בפרויקטים של Rust. נתק את המכשיר מהרשת מיד ובצע את שלב 1 כדי לסובב את כל האישורים.

אם החבילה הזדונית npm או PyPI רצה בתוך קונטיינר Docker או DevContainer, האם ה-Mac המארח שלי או המחשב הנייד של Windows בטוחים?

זה תלוי לחלוטין באילו רכיבי נפח, משתני סביבה ושקעים הועברו לתוך המיכל הזה. תבניות DevContainer סטנדרטיות ומקומיות docker-compose.yml הגדרות לעיתים קרובות מעבירות אוטומטית את המארח שלך SSH_AUTH_SOCK (מאפשר לתוכנה זדונית בתוך הקונטיינר להשתמש במפתחות ה-SSH של המארח שלך כדי להתחבר לשרתים מרוחקים או לדחוף ל-GitHub), bind-mount -/.aws, -/.gitconfig, או סביבת העבודה שלך .env קבצים, או התקן את שקע Docker המארח (/var/run/docer.sock), המעניק גישת שורש מיידית לכל מערכת ההפעלה המארחת. בדוק את שלך devcontainer.json ו דוקר לבדוק עולה כדי לראות בדיוק אילו משאבי מארח נחשפו בתוך הקונטיינר.

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

לפני התקנת חבילת npm, PyPI, Go או Rust לא מוכרת, בדוק אותה Socket.dev או Deps.dev (מאת Google קוד פתוח תובנות), המנתח באופן סטטי כל גרסה עבור סקריפטים להתקנה, בקשות רשת, גישה למערכת קבצים,eval() ערפול, ושינויי מתחזק. אתה יכול גם לרוץ npm להציג <חבילה> סקריפטים בטרמינל שלך כדי לבדוק את הסקריפטים של מחזור החיים שלו מבלי להוריד או להפעיל את החבילה.


נבדקו מקורות

  • הסוכנות לאבטחת סייבר ותשתיות (CISA) והסוכנות לביטחון לאומי (NSA) (ארצות הברית): אבטחת שרשרת אספקת התוכנה: שיטות עבודה מומלצות למפתחים ותגובה לתלות שנפגעת.
  • מעבדת אבטחה של GitHub ועצות אבטחה של npm: תגובה לחבילות npm שנפגעו, זדוניות .vscode/tasks.json מלכודות מאגר (Contagious Interview), ו-GitHub Actions Workflow Secret Exfiltration Mitigations.
  • Python Packaging Authority (PyPA) & אבטחת PyPI: טיפול בגלגל זדוני .pth קבצים, setup.py ביצוע שרירותי, ופרסום מהימן (OIDC) הנחיות יישום.
  • Open Worldwide Application Security Project (OWASP): 10 הסיכונים המובילים לאבטחת שרשרת האספקה של תוכנה ואבטחת CI/CD.
  • מרכז אבטחת סייבר לאומי (NCSC) (בריטניה): הגנה על סביבות מפתחים ומטוסי ניהול ענן נגד קצירת אישורים ממוקדת.

מדריכים קשורים