Bandit是一种旨在查找Python代码中常见安全问题的工具。
它处理每个文件 从中构建AST 然后针对AST节点运行适当的插件。
当它扫描完成所有文件之后将生成报告。
以下安装部署过程基于Windows操作系统,假设已经安装并设置好了以下软件。
“Python 3.7.8 AMD64”
“64-bit Git for Windows”
最便捷的安装方式是通过pip直接安装.whl文件,但是截止到写作本文时,最新的1.6.2版本是在2019年07月02日发布的,其后的代码更新并没有反应到.whl当中。
因此接下来,先通过pip安装,再更新源代码文件。
先从以下地址下载Bandit源代码,当前最新版本是2020年05月18日的Commit为b78c938的版本。
https://github.com/PyCQA/bandit
下载完成后将”bandit-master.zip”文件置于D盘根目录下。
执行以下命令。
CD /D D: python -m venv bandit-env bandit-envScriptsactivate pip install bandit RD /S /Q bandit-envLibsite-packagesandit 7z x bandit-master.zip XCOPY /E bandit-masterandit bandit-envLibsite-packagesandit
到这里就安装好了。
下面是涉及到的几个程序的帮助信息。
bandit
Usage: bandit [-h] [-r] [-a {file,vuln}] [-n CONTEXT_LINES] [-c CONFIG_FILE] [-p PROFILE] [-t TESTS] [-s SKIPS] [-l] [-i] [-f {csv,custom,html,json,screen,txt,xml,yaml}] [--msg-template MSG_TEMPLATE] [-o [OUTPUT_FILE]] [-v] [-d] [-q] [--ignore-nosec] [-x EXCLUDED_PATHS] [-b BASELINE] [--ini INI_PATH] [--exit-zero] [--version] [targets [targets ...]]
Bandit - a Python source code security analyzer
位置参数:
targets 要测试的源文件或目录
可选参数:
-h, --help 显示此帮助消息并退出
-r, --recursive 在子目录中查找和处理文件
-a {file,vuln}, --aggregate {file,vuln} 按漏洞(默认)或文件名汇总输出
-n CONTEXT_LINES, --number CONTEXT_LINES 每个问题输出的最大代码行数
-c CONFIG_FILE, --configfile CONFIG_FILE 可选的用于选择插件和覆盖默认值的配置文件
-p PROFILE, --profile PROFILE 要使用的配置文件 默认执行所有测试
-t TESTS, --tests TESTS 以逗号分隔的要运行的测试ID列表
-s SKIPS, --skip SKIPS 以逗号分隔的要跳过的测试ID列表
-l, --level 仅报告给定严重级别或更高级别的问题 (-l for LOW, -ll for MEDIUM, -lll for HIGH)
-i, --confidence 仅报告给定置信级别或更高级别的问题 (-i for LOW, -ii for MEDIUM, -iii for HIGH)
-f {csv,custom,html,json,screen,txt,xml,yaml}, --format {csv,custom,html,json,screen,txt,xml,yaml} 指定输出格式
--msg-template MSG_TEMPLATE 指定输出消息模板 仅可用于"--format"自定义 请参阅"自定义格式"部分以获取可用值列表
-o [OUTPUT_FILE], --output [OUTPUT_FILE] 将报告写入文件
-v, --verbose 输出额外的信息 例如排除和包含的文件
-d, --debug 打开调试模式
-q, --quiet, --silent 仅在出现错误的情况下显示输出
--ignore-nosec 不要跳过带有"# nosec"注释的行
-x EXCLUDED_PATHS, --exclude EXCLUDED_PATHS 从扫描中排除的路径的逗号分隔列表 已支持"glob patterns"匹配模式 请注意这些是除配置文件中提供的排除路径之外的其他路径 (default: .svn,CVS,.bzr,.hg,.git,__pycache__,.tox,.eggs,*.egg)
-b BASELINE, --baseline BASELINE 要比较的基线报告的路径 仅接受JSON格式的文件
--ini INI_PATH 提供命令行参数的".bandit"文件的路径
--exit-zero 即使找到结果也以状态码0退出
--version 显示程序的版本号并退出
自定义格式
----------
可用标签:
{abspath}, {relpath}, {line}, {test_id}, {severity}, {msg}, {confidence}, {range}
用法示例:
默认模板:
bandit -r examples/ --format custom --msg-template "{abspath}:{line}: {test_id}[bandit]: {severity}: {msg}"
提供与以下相同的输出:
bandit -r examples/ --format custom
标签也可以采用 python string.format() 样式的格式:
bandit -r examples/ --format custom --msg-template "{relpath:20.20s}: {line:03}: {test_id:^8}: DEFECT: {msg:>20}"
发现并加载了以下测试:
---------------------
B101 assert_used
B102 exec_used
B103 set_bad_file_permissions
B104 hardcoded_bind_all_interfaces
B105 hardcoded_password_string
B106 hardcoded_password_funcarg
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 telnetlib
B313 xml_bad_cElementTree
B314 xml_bad_ElementTree
B315 xml_bad_expatreader
B316 xml_bad_expatbuilder
B317 xml_bad_sax
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
B413 import_pycrypto
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
B607 start_process_with_partial_path
B608 hardcoded_sql_expressions
B609 linux_commands_wildcard_injection
B610 django_extra_used
B611 django_rawsql_used
B701 jinja2_autoescape_false
B702 use_of_mako_templates
B703 django_mark_safe
bandit-baseline
Usage: bandit-baseline [-h] [-f {txt,html,json}] targets [targets ...] Bandit Baseline - Generates Bandit results compared to a baseline 位置参数: targets 要测试的源文件或目录 可选参数: -h, --help 显示此帮助消息并退出 -f {txt,html,json} 指定输出格式 可以添加其他Bandit参数 例如严重性过滤 (-ll) 并将其传递给Bandit程序
bandit-config-generator
Usage: bandit-config-generator [-h] [--show-defaults] [-o OUTPUT_FILE] [-t TESTS] [-s SKIPS] Bandit Config Generator 此工具用于生成可选的配置文件。 该配置文件可用于包含或跳过测试并覆盖插件的值。 当用于存储输出配置文件时此工具将输出包含所有插件及其默认设置的模板。 任何未覆盖的设置都可以从配置文件中安全的删除并将使用默认值。 Bandit程序将首选配置文件中的设置而不是内置值。 可选参数: -h, --help 显示此帮助消息并退出 --show-defaults 显示每个插件的默认设置值但不输出配置文件 -o OUTPUT_FILE, --out OUTPUT_FILE 输出文件以保存配置文件 -t TESTS, --tests TESTS 要运行的测试名称列表 -s SKIPS, --skip SKIPS 要跳过的测试名称列表
Bandit使用Python标准库中的ast模块来分析你的Python代码。
ast模块仅能解析在其导入源的解释器版本中有效的Python代码。
这也就是说,如果你的目标Python代码计划在Python 2.7环境下运行,那么就应该使用基于Python 2.7环境部署的Bandit程序对其进行分析,其他版本同理。
