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程序对其进行分析,其他版本同理。