requirements.txt: ابزار اصلی یا تهدید پنهان؟
هر پروژه پایتون آن را دارد. آن ظاهر معصوم requirements.txt فایلی که در ریشه مخزن شما قرار دارد، pip install requirements.txt مصرف میکند، فهرستی از وابستگیها است، درست است، اما اگر مراقب نباشید، میتواند دریچهای کاملاً باز به سمت ساختهای ناپایدار، بستههای آسیبپذیر و مشکلات امنیتی جدی نیز باشد.
در هسته آن، مورد نیاز .txt کنترل میکند که برنامه شما چه بستههای شخص ثالثی را دریافت میکند. وقتی اجرا میکنید pip install -r requirements.txtمدیر بسته پایتون تمام وابستگیهای ذکر شده را نصب میکند. اما نکته اینجاست: اگر نسخههای دقیق را پین نکنید،... اعتماد به PyPI تا همیشه و در هر زمان، یک نسخه امن، سازگار و بدون تغییر ارائه شود. AppSec مدرن اینگونه کار نمیکند.
بدون پین کردن، نسخههای ساخته شده ممکن است خراب شوند. بدتر از آن، ممکن است برنامه شما ناخواسته بستههای مخرب را دریافت کند. نسخهبندی باز (فلاسک >=1.0, برای مثال) یا محدودیتهای نسخه آزاد (جنگو~=3.2) زمینه مناسبی برای تزریق کد ناامن هستند. به همین دلیل است که مدیریت صحیح مورد نیاز .txt یک وظیفه امنیتی اساسی است.
جایی که pip freeze و pip install requirements.txt به طور کامل توضیح داده شده است
فریز پیپ راحت است، اما اگر بدون درک آنچه که ثبت میکند استفاده شود، خطرناک نیز هست. توسعهدهندگان اغلب تولید میکنند مورد نیاز .txt با استفاده از الزامات انجماد پیپ.txt، انتظار دارند که محیط آنها را قفل کند. اما freeze امنیت یا منشأ وابستگیها را تأیید نمیکند؛ فقط هر چیزی را که در حال حاضر نصب شده است، از جمله بستههای گذرا و احتمالاً قدیمی، حذف میکند.
حالا تصور کنید که یک همتیمی یا CI شما، کورکورانه اجرا میکند pip install -r requirements.txtاگر آن فایل شامل موارد منسوخ، آسیبپذیر یا حتی بستههای تایپی-چمباتمهزده، شما همین الان یک حادثه امنیتی را خودکارسازی کردید.
مثال سریع:
⚠️ مثال ناامن، در محیط عملیاتی استفاده نشود
حالا این را به CI خود اضافه کنید pipeline:
شما به این اعتماد دارید که محیط قابل تکرار است، هیچ چیز در PyPI تغییر نکرده است، و اینکه هر وابستگی هنوز امن است. این یک فرض بزرگ هنگام تکیه بر ... است. الزامات انجماد پیپ.txt گردش کار.
تهدیدات واقعی AppSec: تایپواسکاتینگ و سردرگمی وابستگی در requirements.txt
مهاجمان عاشق اکوسیستمهای متنباز هستند. چرا؟ چون توسعهدهندگان اغلب به پیشفرضها و اعتماد ضمنی تکیه میکنند. در اینجا نحوهی حملهی آنها با استفاده از ... آمده است. مورد نیاز .txt:
- جعلی: آپلود یک بسته مخرب با نامی مانند درخواستها بجای درخواستیک شخصیت کم شود، ساخت شما تصاحب میشود.
درخواستها # ⚠️ مثال توضیحی، یک بسته واقعی برای نصب نیست
- سردرگمی وابستگیاگر بسته داخلی شما پین نشده یا به صورت خصوصی در محدوده قرار نگرفته باشد، مهاجمان میتوانند یک نسخه مخرب را با همان نام در PyPI منتشر کنند. اگر CI شما منابع را تأیید نکند، بسته آنها را به جای بسته خودتان نصب خواهید کرد.
هر دو حمله از فقدان پینگذاری دقیق و کنترل منبع در موارد زیر سوءاستفاده میکنند: مورد نیاز .txtاگر مال شما باشد فقط میگه برخی از کتابخانههای داخلی، و تو می دوی الزامات نصب pip.txt در CI، ممکن است بستهی اشتباهی را از جای اشتباهی دریافت کند.
ایمنسازی requirements.txt در CI/CD Pipelineبا هشها و پین کردن
در اینجا نحوه سفت شدن آورده شده است مورد نیاز .txt در برابر تهدیدات دنیای واقعی:
- پین کردن نسخههای دقیق: همیشه استفاده کنید == برای هر بسته در شما مورد نیاز .txtبدون علامت، بدون محدوده.
- استفاده کنید –require-هشها: این باعث میشود pip install -r requirements.txt صحت هر بسته دانلود شده را بررسی کنید.
مثال:
⚠️ مثال نمایشی، در پروژههای واقعی با هش واقعی جایگزین کنید
- ساختهای خود را ایزوله کنیدهمیشه در ظروف تمیز و مینیمال بسازید. هرگز کورکورانه به تصویر پایه اعتماد نکنید.
- استفاده از یک شاخص خصوصی PyPIپروکسی/حافظه پنهان خودتان را میزبانی کنید و فقط بستههای قابل اعتماد را منعکس کنید.
اسکن وابستگیها را اجرا کنید: ادغام ابزارهایی مانند حسابرسی پیپ یا استفاده کنید SBOMتحلیل مبتنی بر pipelines.
مثالی از قطعه کد GitHub Actions:
⚠️ آموزشی pipeline مثلاً با محیط خود سازگار شوید
برخورد سختگیرانه با pip install -r requirements.txt in CI/CD یکی از سادهترین راهها برای کاهش ریسک نرمافزارهای متنباز است.
ساختهای تکرارپذیر: پایدار نگه داشتن آنها در محیطهای مختلف
اگر برنامه شما به صورت محلی کار میکند اما در مرحلهبندی یا تولید با شکست مواجه میشود، وابستگیهای متناقض در مورد نیاز .txt مظنونین همیشگی هستند. حتی یک رانش کوچک هم مشکلات بزرگی ایجاد میکند.
از این استراتژیها استفاده کنید:
- ابزارهای پیپ: استفاده کنید کامپایل با پیپ برای تولید مورد نیاز .txt از الزامات.inوابستگیها را با پینگذاری مناسب حل میکند.
- نشانگرهای محیطیبرای بستههای مخصوص سیستم عامل یا وابستگیهای مخصوص نسخه پایتون، از نشانگرهایی مانند platform_system == 'لینوکس'.
- ذخیره سازی داکردر CI، لایههای Docker خود را پس از نصب وابستگیها از ... ذخیره کنید. مورد نیاز .txt برای کاهش تنوع ساخت و ساز.
مثال با pip-tools:
⚠️ مثال نمایشی، خروجی واقعی به محیط شما بستگی دارد
خروجی کاملاً پین شده است مورد نیاز .txt.
ابزارهایی مانند فریز پیپ، هنگامی که با pip install -r requirements.txt در طول ساخت و ساز، نیاز به نظم و انضباط و اقدامات حفاظتی اضافی دارند.
نتیجهگیری: با اطمینان خاطر، نیازهای خود را مشخص کنید
سوء مدیریت مورد نیاز .txt این فقط یک رویه بد نیست؛ بلکه یک خطر امنیتی فعال است. پینگذاری سست، نصبهای تأیید نشده و اعتماد کورکورانه به رجیستریهای باز، روشهایی هستند که مهاجمان از آنها برای سوءاستفاده استفاده میکنند. CI/CD pipelineاینها نقصهای نظری نیستند؛ آنها روزانه مورد سوءاستفاده قرار میگیرند.
پین کردن وابستگی چیزی بیش از یک روش بهینه است. این اولین خط دفاعی شما در برابر حملات زنجیره تأمین در پایتون است. آن را با –require-هشها، ایزولاسیون ساخت، و ابزارهای قابل تکرار مانند ابزارهای پیپ، و شما یک pipeline که سازش کردن با آن سختتر است.
این که آیا شما استفاده می کنید الزامات نصب pip.txt چه به صورت محلی و چه در CI، همیشه آنچه را که در ساختهایتان قرار میگیرد، تأیید و نظارت کنید. ابزارهایی مانند شیگنی قابلیت مشاهده، اجرای سیاستها و بررسیهای خودکار را فراهم میکند که زنجیره تأمین پایتون شما را از ... قفل میکند. الزامات انجماد پیپ.txt در تمام طول تولید.





