
يدقق في بيئات Python وملفات المتطلبات وأشجار التبعيات بحثًا عن ثغرات أمنية معروفة، ويمكنه إصلاحها تلقائيًا
pip-audit هي أداة لفحص بيئات بايثون للعثور على الحزم التي تحتوي على ثغرات أمنية معروفة. تستخدم قاعدة بيانات نصائح حزم بايثون (Python Packaging Advisory Database) عبر واجهة PyPI JSON API كمصدر لتقارير الثغرات.
يتم صيانة هذا المشروع جزئياً بواسطة Trail of Bits بدعم من Google. هذا ليس منتجاً رسمياً من Google أو Trail of Bits.
--fix)pip المحلية الموجودة بسلاسةpip-audit يتطلب Python 3.10 أو أحدث، ويمكن تثبيته مباشرة عبر pip:```bash
python -m pip install pip-audit
### حزم الطرف الثالث
هناك عدة حزم من **جهات خارجية** لـ `pip-audit`. المصفوفات والشارات أدناه تسرد بعضًا منها:
[](https://repology.org/project/python:pip-audit/versions)
[](https://repology.org/project/pip-audit/versions)
[][#conda-forge-package]
[][#conda-forge-package]
[#conda-forge-package]: https://anaconda.org/conda-forge/pip-audit
على وجه الخصوص، يمكن تثبيت `pip-audit` عبر `conda`:```bash
conda install -c conda-forge pip-audit
الحزم من طرف ثالث غير مدعومة مباشرة بواسطة هذا المشروع. يرجى الرجوع إلى وثائق مدير الحزم الخاص بك للحصول على إرشادات تثبيت أكثر تفصيلاً.
pip-audit لديه إجراء رسمي على GitHub Actions!
يمكنك تثبيته من GitHub Marketplace، أو إضافته إلى CI الخاص بك يدويًا:```yaml jobs: pip-audit: steps: - uses: pypa/[email protected] with: inputs: requirements.txt
انظر
[وثائق الإجراء](https://github.com/pypa/gh-action-pip-audit/blob/main/README.md)
لمزيد من التفاصيل وأمثلة الاستخدام.
### دعم `pre-commit`
`pip-audit` لديه دعم [`pre-commit`](https://pre-commit.com/).
على سبيل المثال، استخدام `pip-audit` عبر `pre-commit` لتدقيق ملف المتطلبات:```yaml
- repo: https://github.com/pypa/pip-audit
rev: v2.10.1
hooks:
- id: pip-audit
args: ["-r", "requirements.txt"]
ci:
# Leave pip-audit to only run locally and not in CI
# pre-commit.ci does not allow network calls
skip: [pip-audit]
يمكن تمرير أي وسائط pip-audit الموثقة أدناه.
يمكنك تشغيل pip-audit كبرنامج مستقل، أو عبر python -m:```bash
pip-audit --help
python -m pip_audit --help
<!-- @begin-pip-audit-help@ -->```
usage: pip-audit [-h] [-V] [-l] [-r REQUIREMENT] [--locked] [-f FORMAT]
[-s SERVICE] [--osv-url OSV_URL] [-d] [-S]
[--desc [{on,off,auto}]] [--aliases [{on,off,auto}]]
[--cache-dir CACHE_DIR] [--progress-spinner {on,off}]
[--timeout TIMEOUT] [--path PATH] [-v] [--fix]
[--require-hashes] [--index-url INDEX_URL]
[--extra-index-url URL] [--skip-editable] [--no-deps]
[-o FILE] [--ignore-vuln ID] [--disable-pip]
[project_path]
audit the Python environment for dependencies with known vulnerabilities
positional arguments:
project_path audit a local Python project at the given path
(default: None)
options:
-h, --help show this help message and exit
-V, --version show program's version number and exit
-l, --local show only results for dependencies in the local
environment (default: False)
-r REQUIREMENT, --requirement REQUIREMENT
audit the given requirements file; this option can be
used multiple times (default: None)
--locked audit lock files from the local Python project. This
flag only applies to auditing from project paths
(default: False)
-f FORMAT, --format FORMAT
the format to emit audit results in (choices: columns,
json, cyclonedx-json, cyclonedx-xml, markdown)
(default: columns)
-s SERVICE, --vulnerability-service SERVICE
the vulnerability service to audit dependencies
against (choices: osv, pypi, esms) (default: pypi)
--osv-url OSV_URL URL to use for the OSV API instead of the default
(default: https://api.osv.dev/v1/query)
-d, --dry-run without `--fix`: collect all dependencies but do not
perform the auditing step; with `--fix`: perform the
auditing step but do not perform any fixes (default:
False)
-S, --strict fail the entire audit if dependency collection fails
on any dependency (default: False)
--desc [{on,off,auto}]
include a description for each vulnerability; `auto`
defaults to `on` for the `json` format. This flag has
no effect on the `cyclonedx-json` or `cyclonedx-xml`
formats. (default: auto)
--aliases [{on,off,auto}]
includes alias IDs for each vulnerability; `auto`
defaults to `on` for the `json` format. This flag has
no effect on the `cyclonedx-json` or `cyclonedx-xml`
formats. (default: auto)
--cache-dir CACHE_DIR
the directory to use as an HTTP cache for PyPI; uses
the `pip` HTTP cache by default (default: None)
--progress-spinner {on,off}
display a progress spinner (default: on)
--timeout TIMEOUT set the socket timeout (default: 15)
--path PATH restrict to the specified installation path for
auditing packages; this option can be used multiple
times (default: [])
-v, --verbose run with additional debug logging; supply multiple
times to increase verbosity (default: 0)
--fix automatically upgrade dependencies with known
vulnerabilities (default: False)
--require-hashes require a hash to check each requirement against, for
repeatable audits; this option is implied when any
package in a requirements file has a `--hash` option.
(default: False)
--index-url INDEX_URL
base URL of the Python Package Index; this should
point to a repository compliant with PEP 503 (the
simple repository API); this will be resolved by pip
if not specified (default: None)
--extra-index-url URL
extra URLs of package indexes to use in addition to
`--index-url`; should follow the same rules as
`--index-url` (default: [])
--skip-editable don't audit packages that are marked as editable
(default: False)
--no-deps don't perform any dependency resolution; requires all
requirements are pinned to an exact version (default:
False)
-o FILE, --output FILE
output results to the given file (default: stdout)
--ignore-vuln ID ignore a specific vulnerability by its vulnerability
ID; this option can be used multiple times (default:
[])
--disable-pip don't use `pip` for dependency resolution; this can
only be used with hashed requirements files or if the
`--no-deps` flag has been provided (default: False)
يسمح pip-audit للمستخدمين بتكوين بعض العلامات عبر متغيرات البيئة بدلاً من ذلك:
| العلامة | المعادل في البيئة | مثال |
|---|---|---|
--format | PIP_AUDIT_FORMAT | PIP_AUDIT_FORMAT=markdown |
--vulnerability-service | PIP_AUDIT_VULNERABILITY_SERVICE | PIP_AUDIT_VULNERABILITY_SERVICE=osv |
--desc | PIP_AUDIT_DESC | PIP_AUDIT_DESC=off |
--progress-spinner | PIP_AUDIT_PROGRESS_SPINNER | PIP_AUDIT_PROGRESS_SPINNER=off |
--output | PIP_AUDIT_OUTPUT | PIP_AUDIT_OUTPUT=/tmp/example |
عند الانتهاء، سيخرج pip-audit برمز يشير إلى حالته.
الرموز الحالية هي:
0: لم يتم اكتشاف أي ثغرات أمنية معروفة.1: تم العثور على ثغرة أمنية معروفة واحدة أو أكثر.لا يمكن كبت رمز خروج pip-audit.
انظر كبت رموز الخروج من pip-audit للحصول على البدائل المدعومة.
يدعم pip-audit العلامة --dry-run، والتي يمكن استخدامها للتحكم في ما إذا كانت خطوة التدقيق (أو الإصلاح) قد نُفذت بالفعل.
pip-audit --dry-run بتخطي خطوة التدقيق وطباعة عدد التبعيات التي كانت ستُدقق.pip-audit --fix --dry-run بتنفيذ خطوة التدقيق وطباعة سلوك الإصلاح (أي التبعيات التي كانت ستُرقى أو تُتخطى) الذي كان سينفذ.تدقيق التبعيات لبيئة Python الحالية:```console $ pip-audit No known vulnerabilities found
تدقيق التبعيات لملف متطلبات معين:```console
$ pip-audit -r ./requirements.txt
No known vulnerabilities found
تدقيق التبعيات لملف المتطلبات، باستثناء حزم النظام:```console $ pip-audit -r ./requirements.txt -l No known vulnerabilities found
تدقيق التبعيات لمشروع بايثون محلي:```console
$ pip-audit .
No known vulnerabilities found
تدقيق ملفات القفل لمشروع بايثون محلي:```console $ pip-audit --locked . No known vulnerabilities found
`pip-audit` يبحث في المسار المقدم عن ملفات "مشروع" Python المختلفة.
في الوقت الحالي، يتم دعم `pyproject.toml` و `pylock.*.toml` فقط.
تدقيق التبعيات عند وجود ثغرات أمنية:```console
$ pip-audit
Found 2 known vulnerabilities in 1 package
Name Version ID Fix Versions
---- ------- -------------- ------------
Flask 0.5 PYSEC-2019-179 1.0
Flask 0.5 PYSEC-2018-66 0.12.3
مراجعة التبعيات بما في ذلك الأسماء المستعارة:```console $ pip-audit --aliases Found 2 known vulnerabilities in 1 package Name Version ID Fix Versions Aliases
Flask 0.5 PYSEC-2019-179 1.0 CVE-2019-1010083, GHSA-5wv5-4vpf-pj6m Flask 0.5 PYSEC-2018-66 0.12.3 CVE-2018-1000656, GHSA-562c-5r94-xh97
تدقيق التبعيات بما في ذلك الأوصاف:```console
$ pip-audit --desc
Found 2 known vulnerabilities in 1 package
Name Version ID Fix Versions Description
---- ------- -------------- ------------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Flask 0.5 PYSEC-2019-179 1.0 The Pallets Project Flask before 1.0 is affected by: unexpected memory usage. The impact is: denial of service. The attack vector is: crafted encoded JSON data. The fixed version is: 1. NOTE: this may overlap CVE-2018-1000656.
Flask 0.5 PYSEC-2018-66 0.12.3 The Pallets Project flask version Before 0.12.3 contains a CWE-20: Improper Input Validation vulnerability in flask that can result in Large amount of memory usage possibly leading to denial of service. This attack appear to be exploitable via Attacker provides JSON data in incorrect encoding. This vulnerability appears to have been fixed in 0.12.3. NOTE: this may overlap CVE-2019-1010083.
تدقيق التبعيات بصيغة JSON:```console $ pip-audit -f json | python -m json.tool Found 2 known vulnerabilities in 1 package [ { "name": "flask", "version": "0.5", "vulns": [ { "id": "PYSEC-2019-179", "fix_versions": [ "1.0" ], "aliases": [ "CVE-2019-1010083", "GHSA-5wv5-4vpf-pj6m" ], "description": "The Pallets Project Flask before 1.0 is affected by: unexpected memory usage. The impact is: denial of service. The attack vector is: crafted encoded JSON data. The fixed version is: 1. NOTE: this may overlap CVE-2018-1000656." }, { "id": "PYSEC-2018-66", "fix_versions": [ "0.12.3" ], "aliases": [ "CVE-2018-1000656", "GHSA-562c-5r94-xh97" ], "description": "The Pallets Project flask version Before 0.12.3 contains a CWE-20: Improper Input Validation vulnerability in flask that can result in Large amount of memory usage possibly leading to denial of service. This attack appear to be exploitable via Attacker provides JSON data in incorrect encoding. This vulnerability appears to have been fixed in 0.12.3. NOTE: this may overlap CVE-2019-1010083." } ] }, { "name": "jinja2", "version": "3.0.2", "vulns": [] }, { "name": "pip", "version": "21.3.1", "vulns": [] }, { "name": "setuptools", "version": "57.4.0", "vulns": [] }, { "name": "werkzeug", "version": "2.0.2", "vulns": [] }, { "name": "markupsafe", "version": "2.0.1", "vulns": [] } ]
تدقيق ومحاولة ترقية التبعيات الضعيفة تلقائيًا:```console
$ pip-audit --fix
Found 2 known vulnerabilities in 1 package and fixed 2 vulnerabilities in 1 package
Name Version ID Fix Versions Applied Fix
----- ------- -------------- ------------ ----------------------------------------
flask 0.5 PYSEC-2019-179 1.0 Successfully upgraded flask (0.5 => 1.0)
flask 0.5 PYSEC-2018-66 0.12.3 Successfully upgraded flask (0.5 => 1.0)
هل قمت بحل مشكلة في pip-audit؟ ساعدنا من خلال المساهمة في هذا القسم!
pip-audit يعرض تقارير ثغرات غير ذات صلة!في عالم مثالي، ستكون نسبة الإشارة إلى الضوضاء في خلاصات الثغرات لا نهائية: سيكون كل تقرير ثغرة (1) صحيحًا، و(2) قابلًا للتطبيق على كل استخدام لكل اعتماد.
لسوء الحظ، لا يُضمن أي من هذين الأمرين: خلاصات الثغرات ليست محصنة ضد التقارير الزائدة أو المزعجة، وليس كل استخدامات اعتماد معين تتوافق مع جميع الفئات المحتملة للثغرات.
إذا كانت عمليات تشغيل pip-audit لديك تنتج تقارير ثغرات غير قابلة للتنفيذ لتطبيقك أو حالة الاستخدام الخاصة بك، يمكنك استخدام خيار --ignore-vuln ID لتجاهل تقارير ثغرات محددة. يدعم --ignore-vuln الأسماء المستعارة، لذا يمكنك استخدام معرف GHSA-xxx أو CVE-xxx بدلاً من معرف PYSEC-xxx إذا كان التقرير المعني لا يحتوي على معرف PYSEC.
على سبيل المثال، إليك كيفية تجاهل GHSA-w596-4wvx-j9j6، وهو مصدر شائع لتقارير الثغرات المزعجة والإيجابيات الكاذبة لمستخدمي pytest:```console
$ pip-audit --ignore-vuln GHSA-w596-4wvx-j9j6
خيار `--ignore-vuln ID` يعمل مع جميع خيارات حل التبعيات والتدقيق الأخرى، مما يعني أنه يجب أن يعمل بشكل صحيح مع المدخلات من نمط المتطلبات، وخلاصات الثغرات البديلة، وما إلى ذلك.
يمكن أيضًا تمريره عدة مرات لتجاهل تقارير متعددة:```console
# Run the audit as normal, but exclude any reports that match these IDs
$ pip-audit --ignore-vuln CVE-XXX-YYYY --ignore-vuln CVE-ZZZ-AAAA
pip-audit يستغرق وقتًا أطول مما أتوقع!اعتمادًا على كيفية استخدامك له، قد يتعين على pip-audit إجراء تحليل التبعيات الخاص به، والذي قد يستغرق وقتًا تقريبًا مثل ما يستغرقه pip install لمشروع. راجع نموذج الأمان للحصول على شرح.
لديك خياران لتجنب تحليل التبعيات: تدقيق بيئة مثبتة مسبقًا، أو التأكد من أن تبعياتك قد تم حلها بالكامل بالفعل.
إذا كنت تعلم أنك قد قمت بالفعل بتكوين بيئة مكافئة للبيئة التي سيقوم pip-audit -r requirements.txt بتدقيقها، يمكنك ببساطة إعادة استخدامها:```console
$ pip-audit
$ pip-audit --local
بدلاً من ذلك، إذا كان الإدخال الخاص بك مثبتًا بالكامل (وربما موزعًا اختياريًا)، يمكنك إخبار `pip-audit` بتخطي حل التبعيات باستخدام إما `--no-deps` (مثبت بدون تجزئات) أو `--require-hashes` (مثبت بما في ذلك التجزئات).
الأخير مكافئ لوضع التحقق من التجزئة الخاص بـ `pip`
[hash-checking mode](https://pip.pypa.io/en/stable/cli/pip_install/#hash-checking-mode)
وهو مفضل، لأنه يوفر سلامة إضافية.```console
# fails if any dependency is not fully pinned
$ pip-audit --no-deps -r requirements.txt
# fails if any dependency is not fully pinned *or* is missing hashes
$ pip-audit --require-hashes -r requirements.txt
pip-audit لا يمكنه المصادقة على فهرس الطرف الثالث الخاص بي!يدعم pip-audit الخيارين --index-url و --extra-index-url لتكوين فهارس حزم بديلة أو تكميلية، تمامًا مثل pip.
عندما تكون غير موثقة، يجب أن تعمل هذه الفهارس كما هو متوقع. ومع ذلك، عندما يتطلب فهرس طرف ثالث المصادقة، فإن pip-audit لديه بعض القيود الإضافية بالإضافة إلى pip العادي:
pip-audit لن يطالبك باسم مستخدم/كلمة مرور للفهرس.keyring الخاصة بـ pip مدعومة، ولكن بشكل محدود: يستخدم pip-audit مزود subprocess للـ keyring، نظرًا لأن عمليات التدقيق تتم في بيئات افتراضية معزولة. مزود subprocess بدوره يخضع لقيود إضافية (مثل اسم مستخدم مطلوب)؛ توثيق pip يشرح ذلك بالتفصيل.بالإضافة إلى ما سبق، تحتوي بعض فهارس الطرف الثالث على أسماء مستخدمين مطلوبة ومبرمجة بشكل صارم. على سبيل المثال، بالنسبة لسجل Google Artifact، اسم المستخدم المبرمج هو oauth2accesstoken. انظر #742 و pip#11971 لمزيد من السياق.
pipenvيستخدم pipenv كلاً من ملفي Pipfile و Pipfile.lock لتتبع وتجميد التبعيات بدلاً من ملف requirements.txt. لا يمكن لـ pip-audit معالجة ملفات Pipfile[.lock] مباشرة، ومع ذلك، يمكن تحويلها إلى ملف requirements.txt مدعوم يمكن لـ pip-audit العمل ضده. يحتوي pipenv على أمر مدمج لتحويل التبعيات إلى ملف requirements.txt (اعتبارًا من v2022.4.8):```console
$ pipenv run pip-audit -r <(pipenv requirements)
### إخفاء رموز الخروج من `pip-audit`
لا يدعم `pip-audit` عمدًا إخفاء رموز الخروج الخاصة به داخليًا.
يمكن للمستخدمين الذين يحتاجون إلى إخفاء استدعاء `pip-audit` الفاشل استخدام إحدى الصيغ القياسية للقشرة (shell) للقيام بذلك:```bash
pip-audit || true
أو، للخروج بالكامل:```bash pip-audit || exit 0
يمكن أيضًا التقاط رمز الخروج ومعالجته بشكل صريح:```bash
pip-audit
exitcode="${?}"
# do something with ${exitcode}
انظر رموز الخروج للحصول على قائمة بالرموز المحتملة التي تحتاج إلى معالجة.
في سير العمل التطويري، قد ترغب في تجاهل الثغرات التي لم يتم إصلاحها بعد والتحقيق فيها فقط أثناء عملية الإصدار. pip-audit لا يدعم تجاهل الثغرات غير المُصلَحة. ومع ذلك، يمكنك تصدير مخرجاته بتنسيق JSON ومعالجتها خارجيًا. على سبيل المثال، إذا كنت تريد الخروج برمز غير صفري فقط عندما يكون للثغرات المُكتشفة إصدارات إصلاح معروفة، يمكنك معالجة المخرجات باستخدام jq كما يلي:
$ pip-audit --format json | jq '.dependency_vulnerabilities | .[] | select(.fix_versions != null)'```shell test -z "$(pip-audit -r requirements.txt --format=json 2>/dev/null | jq '.dependencies[].vulns[].fix_versions[]')"
مثال بسيط (وغير فعّال) لاستخدام هذه الطريقة سيكون:```shell
test -z "$(pip-audit -r requirements.txt --format=json 2>/dev/null | jq '.dependencies[].vulns[].fix_versions[]')" || pip-audit -r requirements.txt
والتي تقوم بتشغيل pip-audit كالمعتاد وتخرج برمز غير صفري فقط في حالة وجود إصدارات محددة للثغرات المعروفة.
يوجد هذا القسم لوصف الافتراضات الأمنية التي يمكنك و لا يجب عليك اتخاذها عند استخدام pip-audit.
خلاصة: إذا كنت لن تقوم بتثبيته باستخدام pip install، فلا ينبغي عليك تدقيقه باستخدام pip audit.
pip-audit هو أداة لتدقيق بيئات بايثون بحثًا عن حزم بها ثغرات معروفة. 'الثغرة المعروفة' هي خلل تم الإبلاغ عنه علنًا في حزمة، إذا لم يتم تصحيحه، قد يسمح لفاعل خبيث بتنفيذ إجراءات غير مقصودة.
يمكن لـ pip-audit أن يحميك من الثغرات المعروفة عن طريق إخبارك عند وجودها، وكيفية ترقيتها. على سبيل المثال، إذا كان لديك somepackage==1.2.3 في بيئتك، يمكن لـ pip-audit أن يخبرك أنه يجب ترقيته إلى 1.2.4.
يمكنك افتراض أن pip-audit سيبذل قصارى جهده لحل جميع تبعيات بايثون الخاصة بك بالكامل، و إما أن يدقق كل منها بالكامل أو يذكر صراحة أي منها تخطاه، وكذلك سبب تخطيه.
pip-audit ليس محللًا ثابتًا للكود. إنه يحلل أشجار التبعيات، وليس الكود، و لا يمكنه ضمان أن عمليات حل التبعيات التعسفية تحدث بشكل ثابت. لفهم سبب ذلك، راجع المقال الممتاز لدستن إنجرام حول حل التبعيات في بايثون.
وبالتالي: لا يجب عليك افتراض أن pip-audit سيدافع عنك ضد الحزم الخبيثة. على وجه الخصوص، من غير الصحيح اعتبار pip-audit -r INPUT كبديل 'أكثر أمانًا' لـ pip-audit. لجميع الأغراض، pip-audit -r INPUT مكافئ وظيفيًا لـ pip install -r INPUT، مع قدر صغير من العزل غير الأمني لتجنب التعارضات مع أي من بيئاتك المحلية.
pip-audit هو أولاً وقبل كل شيء أداة تدقيق لحزم بايثون. لا يجب عليك افتراض أن pip-audit سيكتشف أو يشير إلى ثغرات 'عابرة' قد تظهر من خلال حزم بايثون، ولكنها ليست جزءًا من الحزمة نفسها. على سبيل المثال، من غير المرجح أن تشمل مصادر معلومات الثغرات في pip-audit تنبيهًا لمكتبة مشتركة ضعيفة قد تستخدمها حزمة بايثون شائعة، نظرًا لأن نسخة حزمة بايثون ليست مرتبطة بقوة بنسخة المكتبة المشتركة.
pip-audit مرخص بموجب رخصة Apache 2.0.
pip-audit يعيد استخدام ويعدل أمثلة من resolvelib، المرخصة بموجب رخصة ISC.
راجع وثائق المساهمة للحصول على التفاصيل.
من المتوقع أن يتبع كل من يتفاعل مع هذا المشروع مدونة قواعد سلوك PSF.