U3F1ZWV6ZTE1Njg4NDY3OTQ0X0FjdGl2YXRpb24xNzc3Mjg2OTg2NDQ=

Bandit - Tool Designed To Find Common Security Issues In Python Code

Bandit - Tool Designed To Find Common Security Issues In Python Code
Bandit - Tool Designed To Find Common Security Issues In Python Code

Bandit هي أداة مصممة للعثور على مشكلات الأمان الشائعة في رمز Python. للقيام بذلك ، يقوم Bandit بمعالجة كل ملف ، ويقوم بإنشاء AST منه ، ويقوم بتشغيل الإضافات المناسبة مقابل عقد AST. بمجرد انتهاء Bandit من فحص جميع الملفات ، يقوم بإنشاء تقرير. 
تم تطوير Bandit في الأصل ضمن مشروع أمان OpenStack وتم إعادة تسميته لاحقًا إلى PyCQA.


تركيب
واللصوص وزعت على PyPI. أفضل طريقة لتثبيته هي النقطة:
إنشاء بيئة افتراضية (اختياري):
virtualenv bandit-env
تثبيت اللصوص:
pip install bandit
# Or if you're working with a Python 3 project
pip3 install bandit
تشغيل اللصوص:
bandit -r path/to/your/code
ويمكن أيضا أن يتم تثبيت اللصوص من المصدر. للقيام بذلك ، قم بتنزيل tarball المصدر من PyPI ، ثم قم بتثبيته:
python setup.py install



مثال للاستخدام الاستخدام عبر شجرة الكود:
bandit -r ~/your_repos/project
مثال للاستخدام عبر examples/الدليل ، يعرض ثلاثة أسطر من السياق والإبلاغ فقط عن المشكلات الخطيرة للغاية:
bandit examples/*.py -n 3 -lll
يمكن تشغيل قطاع الطرق مع ملفات التعريف. لتشغيل Bandit مقابل دليل الأمثلة باستخدام المكونات الإضافية المدرجة في ShellInjectionملف التعريف فقط:
bandit examples/*.py -p ShellInjection
يدعم Bandit أيضًا تمرير سطور التعليمات البرمجية للمسح باستخدام الإدخال القياسي. لتشغيل Bandit مع الإدخال القياسي:
cat examples/imports.py | bandit -
الاستعمال:
$ bandit -h
usage: bandit [-h] [-r] [-a {file,vuln}] [-n CONTEXT_LINES] [-c CONFIG_FILE]
[-p PROFILE] [-t TESTS] [-s SKIPS] [-l] [-i]
[--msg-template MSG_TEMPLATE] [-o [OUTPUT_FILE]] [-v] [-d] [-q]
[-f {csv,custom,html,json,screen,txt,xml,yaml}]
[targets [targets ...]]
[--ignore-nosec] [-x EXCLUDED_PATHS] [-b BASELINE] [--ini INI_PATH] [--version]
targets source file(s) or directory(s) to be tested
Bandit - a Python source code security analyzer positional arguments: optional arguments: -h, --help show this help message and exit
aggregate output by vulnerability (default) or by
-r, --recursive find and process files in subdirectories -a {file,vuln}, --aggregate {file,vuln} filename -n CONTEXT_LINES, --number CONTEXT_LINES
overriding defaults
maximum number of code lines to output for each issue -c CONFIG_FILE, --configfile CONFIG_FILE optional config file to use for selecting plugins and -p PROFILE, --profile PROFILE
-l, --level report only issues of a given severity level or higher
profile to use (defaults to executing all tests) -t TESTS, --tests TESTS comma-separated list of test IDs to run -s SKIPS, --skip SKIPS comma-separated list of test IDs to skip
-f {cs v,custom,html,json,screen,txt,xml,yaml}, --format {csv,custom,html,json,screen,txt,xml,yaml}
(-l for LOW, -ll for MEDIUM, -lll for HIGH) -i, --confidence report only issues of a given confidence level or higher (-i for LOW, -ii for MEDIUM, -iii for HIGH) specify output format --msg-template MSG_TEMPLATE
-v, --verbose output extra information like excluded and included
specify output message template (only usable with --format custom), see CUSTOM FORMAT section for list of available values -o [OUTPUT_FILE], --output [OUTPUT_FILE] write report to filename files -d, --debug turn on debug mode
to the excluded paths provided in the config file)
-q, --quiet, --silent only show output in the case of an error --ignore-nosec do not skip lines with # nosec comments -x EXCLUDED_PATHS, --exclude EXCLUDED_PATHS comma-separated list of paths (glob patterns supported) to exclude from scan (not e that these are in addition
Available tags:
-b BASELINE, --baseline BASELINE path of a baseline report to compare against (only JSON-formatted files are accepted) --ini INI_PATH path to a .bandit file that supplies command line arguments --version show program's version number and exit CUSTOM FORMATTING -----------------
ban dit -r examples/ --format custom --msg-template \
{abspath}, {relpath}, {line}, {test_id}, {severity}, {msg}, {confidence}, {range} Example usage: Default template: bandit -r examples/ --format custom --msg-template \ "{abspath}:{line}: {test_id}[bandit]: {severity}: {msg}" Provides same output as: bandit -r examples/ --format custom Tags can also be formatted in python string.format() style:
B105 hardcoded_password_string
"{relpath:20.20s}: {line:03}: {test_id:^8}: DEFECT: {msg:>20}" See python documentation for more information about formatting style: https://docs.python.org/3.4/library/string.html The following tests were discovered and loaded: ----------------------------------------------- B101 assert_used B102 exec_used B103 set_bad_file_permissions B104 hardcoded_bind_all_interfaces B106 hardcoded_password_funcarg
B316 xml_bad_expatbuilder
B107 hardcoded_password_default B108 hardcoded_tmp_directory B110 try_except_pass B112 try_except_continue B201 flask_debug_true B301 pickle B302 marshal B303 md5 B304 ciphers B305 cipher_modes B306 mktemp_q B307 eval B308 mark_safe B309 httpsconnection B310 urllib_urlopen B311 random B312 telnetli b B313 xml_bad_cElementTree B314 xml_bad_ElementTree B315 xml_bad_expatreader B317 xml_bad_sax
B413 import_pycrypto
B318 xml_bad_minidom B319 xml_bad_pulldom B320 xml_bad_etree B321 ftplib B322 input B323 unverified_context B324 hashlib_new_insecure_functions B325 tempnam B401 import_telnetlib B402 import_ftplib B403 import_pickle B404 import_subprocess B405 import_xml_etree B406 import_xml_sax B407 import_xml_expat B408 import_xml_minidom B409 import_xml_pulldom B410 import_lxml B411 import_xmlrpclib B412 import_httpoxy
B607 start_process_with_partial_path
B501 request_with_no_cert_validation B502 ssl_with_bad_version B503 ssl_with_bad_defaults B504 ssl_with_no_version B505 weak_cryptographic_key B506 yaml_load B507 ssh_no_host_key_verification B601 paramiko_ calls B602 subprocess_popen_with_shell_equals_true B603 subprocess_without_shell_equals_true B604 any_other_function_with_shell_equals_true B605 start_process_with_a_shell B606 start_process_with_no_shell B608 hardcoded_sql_expressions
B703 django_mark_safe
B609 linux_commands_wildcard_injection B610 django_extra_used B611 django_rawsql_used B701 jinja2_autoescape_false
B702 use_of_mako_templates


خط الأساس
اللصوص يسمح تحديد مسار تقرير خط الأساس لمقارنة ضد استخدام وسيطة سطر قاعدة (أي-b BASELINEأو--baseline BASELINE).
bandit -b BASELINE
هذا مفيد لتجاهل الثغرات الأمنية المعروفة التي تعتقد أنها ليست قضايا (مثل كلمة مرور نصية واضحة في اختبار وحدة). لإنشاء تقرير أساسي ، قم ببساطة بتشغيل Bandit بتنسيق الإخراج الذي تم تعيينه على json(يتم قبول الملفات المنسقة JSON فقط كخط أساسي) ومسار ملف الإخراج المحدد:
bandit -f json -o PATH_TO_OUTPUT_FILE


تكامل التحكم في الإصدار
استخدم الالتزام المسبق . بمجرد تثبيته ، أضف هذا إلى .pre-الالتزام-config.yaml في مستودعك (تأكد من تحديث rev للإشارة إلى علامة git حقيقية / مراجعة!):
repos:
- repo: https://github.com/PyCQA/bandit
rev: '' # Update me! hooks:
- id: bandit
ثم قم بتشغيل التثبيت المسبق وستكون جاهزًا للعمل.


ترتيب
قد يتم توفير ملف تهيئة اختياري وقد يشمل:
  • قوائم الاختبارات التي ينبغي أو لا ينبغي تشغيلها
  • exclude_dirs - سيتم استبعاد أجزاء من المسار ، إذا تمت مطابقتها ، من المسح الضوئي (أنماط الكرة الأرضية مدعومة)
  • إعدادات المكوّن الإضافي - قد توفر إعدادات مختلفة لبعض المكونات الإضافية


لكل مشروع ، الأمر
Args قد تتضمن المشاريع ملف .bandit يحدد وسيطات سطر الأوامر التي يجب توفيرها لهذا المشروع. الوسائط المدعومة حاليًا هي:
  • الأهداف: قائمة مفصولة بفواصل من dirs / الملفات المستهدفة لتشغيل قطاع الطرق
  • استبعاد: قائمة مفصولة بمسارات مستبعدة
  • يتخطى: قائمة مفصولة بفواصل من الاختبارات لتخطي
  • الاختبارات: قائمة مفصولة بفواصل من الاختبارات لتشغيل
لاستخدام هذا ، ضع ملف .bandit في دليل المشروع الخاص بك. فمثلا:
[bandit]
exclude: /test
[bandit]
tests: B101,B102,B301


الاستثناءات
في حالة قيام سطر من التعليمات البرمجية بإطلاق مشكلة Bandit ، ولكن تمت مراجعة الخط وأن المشكلة إيجابية أو مقبولة كاذبة لسبب آخر ، يمكن تمييز السطر بـ# nosecولن يتم عرض أي نتائج مرتبطة به أن يكون المبلغ عنها. 
على سبيل المثال ، على الرغم من أن هذا الخط قد يؤدي إلى قيام Bandit بالإبلاغ عن مشكلة أمنية محتملة ، إلا أنه لن يتم الإبلاغ عنه:
self.process = subprocess.Popen('/bin/echo', shell=True)  # nosec


اختبارات
الضعف: يتم تحديد اختبارات الضعف أو "المكونات الإضافية" في الملفات في دليل المكونات الإضافية. 
تتم كتابة الاختبارات في Python ويتم اكتشافها تلقائيًا من دليل المكونات الإضافية. يمكن لكل اختبار فحص نوع أو أكثر من عبارات Python. يتم تمييز الاختبارات بأنواع عبارات Python التي تفحصها (على سبيل المثال: استدعاء دالة ، سلسلة ، استيراد ، إلخ). 
يتم تنفيذ الاختبارات بواسطةBanditNodeVisitorالكائن أثناء زيارته لكل عقدة في AST. 
يتم الاحتفاظ بنتائج الاختبارBanditResultStoreوتجميعها للإخراج عند الانتهاء من تشغيل الاختبار.


اختبارات الكتابة
لكتابة اختبار:
  • حدد ثغرة أمنية لإنشاء اختبار ، وقم بإنشاء ملف جديد في الأمثلة / يحتوي على حالة أو أكثر من هذه الثغرة الأمنية.
  • ضع في اعتبارك الثغرة الأمنية التي تختبرها ، وقم بتمييز الوظيفة بواحد أو أكثر من الديكورات المناسبة: -checks ('Call') -checks ('Import'، 'ImportFrom') -checks ('Str')
  • قم بإنشاء ملف مصدر Python جديد لاحتواء الاختبار الخاص بك ، يمكنك الرجوع إلى الاختبارات الحالية للحصول على أمثلة.
  • يجب أن تأخذ الوظيفة التي تنشئها "سياق" معلمة وهو مثيل لفئة السياق التي يمكنك الاستعلام عنها للحصول على معلومات حول العنصر الحالي الذي يتم فحصه. يمكنك أيضًا الحصول على عقدة AST الخام لحالات الاستخدام الأكثر تقدماً. يرجى الاطلاع على ملف context.py للمزيد.
  • قم بتوسيع ملف تكوين Bandit حسب الحاجة لدعم الاختبار الجديد.
  • قم بتنفيذ Bandit مقابل ملف الاختبار الذي حددته في الأمثلة / وتأكد من اكتشافه للثغرة الأمنية. النظر في الاختلافات حول كيف يمكن أن تقدم هذه الثغرة الأمنية نفسها وتوسيع ملف المثال وظيفة الاختبار وفقا لذلك.


تمديد Bandit
Bandit يتيح للمستخدمين كتابة وتسجيل ملحقات للفحوصات والتنسيقات. سيقوم Bandit بتحميل المكونات الإضافية من نقطتي دخول:
  • bandit.formatters
  • bandit.plugins
يحتاج المنسقون إلى قبول 4 أشياء:
  • result_store: مثيل bandit.core.BanditResultStore
  • file_list: قائمة الملفات التي تم تفتيشها في النطاق
    • الدرجات: الدرجات الممنوحة لكل ملف في النطاق
    • excluded_files: قائمة الملفات التي تم استبعادها من النطاق
    تميل الإضافات إلى الاستفادة من الديكور bandit.checks الذي يسمح للمؤلف بتسجيل فحص لنوع معين من عقدة AST. فمثلا
    @bandit.checks('Call')
    def prohibit_unsafe_deserialization(context):
    if 'unsafe_load' in context.call_function_name_qual:
    return bandit.Issue(
    confidence=bandit.HIGH,
    severity=bandit.HIGH,
    )
    text="Unsafe deserialization detected."
    لتسجيل المكوّن الإضافي ، لديك خياران:
    1. إذا كنت تستخدم setuptools مباشرة ، فأضف شيئًا مما يلي إلى setupمكالمتك:
      # If you have an imaginary bson formatter in the bandit_bson module
      # and a function called `formatter`.
      entry_points={'bandit.formatters': ['bson = bandit_bson:formatter']}
      # Or a check for using mako templates in bandit_mako that
      entry_points={'bandit.plugins': ['mako = bandit_mako']}
    2. إذا كنت تستخدم pbr ، فأضف شيئًا مما يلي إلى ملف setup.cfg:
      [entry_points]
      bandit.formatters =
      bson = bandit_bson:formatter
      bandit.plugins =
      mako = bandit_mako


    المساهمات
    المساهمة في اللصوص هي دائما موضع ترحيب! 
    أفضل طريقة لبدء استخدام Bandit هي الحصول على المصدر:
    git clone https://github.com/PyCQA/bandit.git
    يمكنك اختبار أي تغييرات مع توكس:
    pip install tox
    tox -e pep8
    tox -e py35
    tox -e py27 tox -e docs
    tox -e cover
    يرجى تقديم طلبات العلاقات العامة باستخدام فرع الخاص بك ، وليس سيد:
    git checkout -b mychange
    git push origin mychange


    الإبلاغ عن الأخطاء
    يجب الإبلاغ عن الأخطاء على جيثب. لتقديم خطأ ضد Bandit ، تفضل بزيارة: https://github.com/PyCQA/bandit/issues


    تحت أي نسخة من بيثون يجب علي تثبيت اللصوص؟ 
    تعتمد إجابة هذا السؤال على المشروع (المشاريع) الذي ستقوم بتشغيل Bandit ضده. إذا كان مشروعك متوافقًا فقط مع Python 2.7 ، يجب عليك تثبيت Bandit لتعمل تحت Python 2.7. إذا كان مشروعك متوافقًا فقط مع Python 3.5 ، فاستخدم 3.5 على التوالي. إذا كان يدعم المشروع الخاص على حد سواء، أنت يمكن تشغيل اللصوص مع كل إصدارات ولكن لم يكن لديك ل.
    يستخدم Bandit وحدة ast من مكتبة Python القياسية من أجل تحليل شفرة Python الخاصة بك. وحدة ast يمكنها فقط تحليل شفرة Python الصالحة في إصدار المترجم الذي تم استيراده منه. بمعنى آخر ، إذا حاولت استخدام الوحدة النمطية لـ Python 2.7 لتحليل الشفرة المكتوبة لمدة 3.5 والتي تستخدم ، على سبيل المثال ، العائد باستخدام asyncio ، فستكون لديك أخطاء في بناء الجملة تمنع Bandit من العمل بشكل صحيح. بدلاً من ذلك ، إذا كنت تعتمد على تدوين ثماني لـ 2.7 الخاص بـ 0777 ، فسيكون لديك خطأ في بناء الجملة إذا قمت بتشغيل Bandit على 3.x.


    مراجع
    وثائق وحدة Python AST: https://docs.python.org/2/library/ast.html مستندات
    Green Tree Snakes - مستندات Python AST المفقودة: https://greentreesnakes.readthedocs.org/en/latest/
    توثيق الأنواع المختلفة من عقد AST التي يغطيها Bandit أو يمكن تمديدها لتشمل: https://greentreesnakes.readthedocs.org/en/latest/nodes.html



ليست هناك تعليقات
إرسال تعليق

إرسال تعليق

اذا اعجبك الموضوع علق بتعليق If you like the subject, comment on the comment