کشف آسیبپذیری با شدت بالا در Gitpython
GitPython یک کتابخانه پایتون است که برای تعامل با مخازن git مورد استفاده قرار میگیرد و میتواند محتویات داخل مخازن مربوطه را بخواند و همچنین در آنها بنویسد. پیشتر، آسیبپذیریای با شناسه CVE-2023-40590 در Gitpython کشف شدهبود که اصلاحاتی برای آن ارائه شد اما این بار در پی نقصی که در اصلاحات پیشین وجود داشت، آسیبپذیری با شدت بالا و شناسه جدید CVE-2023-22190 در مورد این کتابخانهی پایتون اعلام گردید. این آسیبپذیری که شدت CVSS 7.8 را به خود اختصاص دادهاست کاربران ویندوز را تهدید میکند. استفادهی Gitpython از یک shell(پوسته) جهت اجرای git، مشابه کاری که برای اجرای bash.exe جهت تفسیر hook انجام میدهد، منجر به استفاده از یک مسیر جستجوی ناامن میشود که اگر این امر بر روی یک سیستم با سیتسمعامل ویندوز انجام شود میتواند اجرای یک فایل مخرب یا آلودهی git.exe یا bash.exe را در پی داشته باشد.
اگرچه GitPython اغلب از اجرای برنامههایی که در یک مسیر جستجوی نامعتبر یافت میشوند اجتناب میکند، اما همچنان دو موقعیت وجود دارد که هر یک تحت شرایطی، اجازه اجرای کد دلخواه را به مهاجم میدهند:
• هنگامی که از یک shell استفاده میشود:
هنگامی کهGitPython ، git را مستقیماً به جای یک پوسته اجرا میکند، فرآیند پیشفرض جستجوی مسیر انجام میشود و مسیر ارائه شده را با تنظیم متغیر محلی NoDefaultCurrentDirectoryInExePath حذف می کند. اما در استفاده از پوسته cmd.exe، این متغیر محلی حذف مسیر از جانب Gitpython انتقال نمییابد.
• هنگامی که اسکریپتهای hook اجرا میشوند:
Hooks Git، اسکریپتهایی هستند که با هربار اجرا یک رویداد خاص در یک مخزن Git بهطور خودکار اجرا میشوند. در ویندوز، GitPython از پوستهی bash.exe جهت اجرای hookهایی که اسکریپت هستند، استفاده میکند. با این حال، برخلاف هنگام اجرای git، هیچ اقدامی جهت جلوگیری از یافتن و اجرای bash.exe در مسیر(directory) فعلی صورت نمیپذیرد که همین امر عامل وقوع نقص امنیتی مذکور میباشد.
محصولات تحت تأثیر
احتمالاً بخش عمده تأثیر این آسیبپذیری در برنامههایی است که Git.USE_SHELL = True را جهت حفظ تاریخچهی توسعهی خود تنظیم میکنند. چنین برنامههایی ممکن است در برابر اجرای کد دلخواه از یک مخزن مخرب آسیبپذیر باشند. اگر از یک پوسته جهت اجرای git استفاده شود، مهاجم میتواند کاربر را فریب دهد تا یک مخزن را با یک فایل اجرایی مخرب دانلود کند. باید توجه داشت که اجرای خود برنامه از یک مسیر قابل اعتماد جهت ایمنسازی فرایند کافی نیست.
توصیههای امنیتی
این آسیبپذیری در نسخه 3.1.41 کتابخانه GitPython وصله شدهاست.
همچنین راههای پیشنهادی جهت کاهش خطر این آسیبپذیری به شرح ذیل میباشند:
هنگامی که از یک پوسته استفاده میشود، متغیر NoDefaultCurrentDirectoryInExePath را به محیط زیرپردازش منتقل کنید. در این صورت خود پوسته cmd.exe جستجوی مسیر را انجام میدهد که راهی ایمن است.
هنگام فراخوانی Popen که برای اجرای hookها با یک زیرفرایند bash.exe انجام میگیرد، NodeFaultCurrentDirectoryInexePath را در محیط فرآیند Gitpython تنظیم کنید.