Pythonの静的セキュリティー検査ツールbanditを使ってみよう
bandit について
Banditは、Pythonコードに共通するセキュリティ問題を発見するために設計されたツールです。Banditは各ファイルを処理し、そこからAST(Application Security Test) を構築し、そのASTノードに対して適切なプラグインを実行します。Banditは、すべてのファイルのスキャンを終えると、レポートを生成します。
インストール
bandit は pip コマンドでインストールします。prospector などの静的解析ツールではオプションとして同時にインストールされることもあります。
code: bash
$ pip install bandit
まずは実行してみよう
--helpオプションだけを与えて実行すると、簡単なヘルプメッセージが表示されます。
code: bash
% bandit --help
Bandit - a Python source code security analyzer
positional arguments:
targets source file(s) or directory(s) to be tested
optional arguments:
-h, --help show this help message and exit
-r, --recursive find and process files in subdirectories
-a {file,vuln}, --aggregate {file,vuln}
aggregate output by vulnerability (default) or by
filename
-n CONTEXT_LINES, --number CONTEXT_LINES
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
overriding defaults
-p PROFILE, --profile PROFILE
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
-l, --level report only issues of a given severity level or higher
(-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)
-f {csv,custom,html,json,screen,txt,xml,yaml}, --format {csv,custom,html,json,screen,txt,xml,yaml}
specify output format
--msg-template MSG_TEMPLATE
specify output message template (only usable with
--format custom), see CUSTOM FORMAT section for list
of available values
write report to filename
-v, --verbose output extra information like excluded and included
files
-d, --debug turn on debug mode
-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 (note that these are
in addition to the excluded paths provided in the
config file) (default:
.svn,CVS,.bzr,.hg,.git,__pycache__,.tox,.eggs,*.egg)
-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
--exit-zero exit with 0, even with results found
--version show program's version number and exit
CUSTOM FORMATTING
-----------------
Available tags:
{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:
bandit -r examples/ --format custom --msg-template \
"{relpath:20.20s}: {line:03}: {test_id:^8}: DEFECT: {msg:>20}"
See python documentation for more information about formatting style:
The following tests were discovered and loaded:
-----------------------------------------------
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
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
いま手元にある sphinx-express というアプリケーションに対して実行してみます。
sphinx-express ディレクトリ以下にいくつかのPython スクリプトがあるので、再帰的に実行させるために’--recursiveもしくは-rオプションを与えて実行します。’
code: bash
$ bandit -r sphinx-express
実行結果は次のようになります。
code: bash
% bandit -r sphinx-express
main INFO profile include tests: None main INFO profile exclude tests: None main INFO cli include tests: None main INFO cli exclude tests: None main INFO running on Python 3.9.7 Run started:2021-11-02 01:21:02.683047
Test results:
> Issue: B307:blacklist Use of possibly insecure function - consider using safer ast.literal_eval. Severity: Medium Confidence: High
Location: sphinx-express/sphinx_express/core.py:99
98 test_import = f"from sphinx.locale import {lang}"
99 eval(test_import)
100 except ImportError:
--------------------------------------------------
Severity: Low Confidence: High
Location: sphinx-express/sphinx_express/models.py:41
40 config.update(newconf)
41 except:
42 pass
43
--------------------------------------------------
Code scanned:
Total lines of code: 380
Total lines skipped (#nosec): 0
Run metrics:
Total issues (by severity):
Undefined: 0.0
Low: 1.0
Medium: 1.0
High: 0.0
Total issues (by confidence):
Undefined: 0.0
Low: 0.0
Medium: 0.0
High: 2.0
Files skipped (0):
詳細は後ほど説明しますが、2箇所が指摘され、対処方法へのリンクが’表示されました。
Severity: Medium Confidence: Highとあるのは、「深刻度が中程度、信頼度が高い」ということです。
この例の場合、2番目の B110:try_except_pass の指摘を無視させたい場合は、該当するソースコード行に# nosecのコメントを追加することで対応できます。
code: python
try:
with open(self.configfile, "r") as f:
template = Template(f.read())
interpolated_config = template.safe_substitute(config)
newconf = yaml.load(interpolated_config, Loader=yaml.SafeLoader)
config.update(newconf)
except: # nosec
pass
オプションについては次のようになりまう。
-r / --recursive:サブディレクトリ内のファイルの検索してテストする
-o OUTPUT_FILE / --output OUTPUT_FILE:指定したファイルにレポートを出力する
-f FORMAT / --format FORMAT:テスト結果を指定したフォーマットで出力する。フォーマットとして指示できるのは、csv、custom、html、json、screen、txt、xml、yaml です。
--msg-template MSG_TEMPLATE:出力メッセージのテンプレートを指定する
-c CONFIG_FILE / --configfile CONFIG_FILE:プラグインの選択やデフォルトのオーバーライドに使用するオプションの設定ファイルを指示する
--init INI_FILE:コマンドライン引数を提供する.banditファイルへのパス
-a <file |vuln> / --aggregate <file | vuln>:出力を脆弱性別(vuln)またはファイル名別(file)に集約する。デフォルトは vuln で脆弱性(vulnerability)別に出力される。
-l / --level:指定された深刻度レベル以上の問題のみをレポートする。-lは LOW、-llはMEDIUM, -lllはHIGHとして処理されます。(--levelの場合も、--level --levelのように複数回指示する)
-n CONTEXT_LINES / --number CONTEXT_LINES:各テストでで出力するコードラインの最大数(デフォルト:3)
-i / --confidence: 一定の信頼度以上の問題のみをレポートする。-iは LOW、-iiはMEDIUM, -iiiはHIGHとして処理されます。(--confidenceの場合も、--confidence --confidenceのように複数回指示する)
-p PROFILE / --profile PROFILE:テストに使用するプロファイル名を指示する(デフォルトは全テストを実施)
-t TESTS / --tests TESTS: テストするテストIDをコンマ区切りで指定
-s TESTS / --skip TESTS: スキップするテストIDをコンマ区切りで指定
-x EXCLUDED_PATHS / --exclude EXCLUDED_PATHS:スキャン対象から除外するパスを(globパターンをサポート)のコンマ区切りリストで与える。設定ファイルで指定した除外パスも含めて指定することに注意。(デフォルト:.svn,CVS,.bzr,.hg,.git,__pycache__,.tox,.eggs,*.egg)
--ignore-nosec: # nosec コメントのある行をスキップしない
--exit-zero:指摘結果が見つかっても終了コードゼロ(0)で終了する
-v / --verbose:除外されるファイルや処理したファイルなどの追加情報を出力
-q / --quiet / --silent:エラーが発生したときだけ出力を表示
--version:バージョンを表示して終了する
--help:ヘルプメッセージを表示して終了する
カスタムフォーマット
{abspath}、 {relpath}、{line}、 {test_id}、{severity}、{msg}、{confidence}、{range}
デフォルトテンプレート
code: bash
bandit -r examples/ --format custom --msg-template \
"{abspath}:{line}: {test_id}bandit: {severity}: {msg}" Bandit レポートフォーマッタ
Banditは、Pythonコードの様々なセキュリティ問題を出力するために、多くの異なるフォーマッタをサポートしています。これらのフォーマッタはプラグインとして作成されており、新しいフォーマッタを作成することで、Banditが提供する機能を拡張することができます。
code: python
def report(manager, fileobj, sev_level, conf_level, lines=-1):
result = bson.dumps(issues)
with fileobj:
fileobj.write(result)
プラグインを登録するには、2つの方法があります。
setuptoolsを直接使用している場合は、セットアップコールに以下のようなものを追加してください。
code: python
# bandit_bsonモジュールに架空のbsonフォーマッタがあり、formatter() という関数があるとした例
pbrを使用している場合は、setup.cfgファイルに以下のような内容を追加してください。
code: setup.cfg
bandit.formatters =
bson = bandit_bson:formatter
サポートされているフォーマッタの一覧
csv
custom
html
json
screen
text
xml
yaml
CSVフォーマッタ(csv)
課題(Issue)をカンマ区切りの値の形式で出力するフォーマッタです。
例
code: CSV
filename,test_name,test_id,issue_severity,issue_confidence,issue_text,
line_number,line_range,more_info
examples/yaml_load.py,blacklist_calls,B301,MEDIUM,HIGH,"Use of unsafe yaml
load. Allows instantiation of arbitrary objects. Consider yaml.safe_load().
カスタムフォーマッタ(custom)
このフォーマッタは、課題(Issue)を機械で読めるカスタム・フォーマットで出力します。
デフォルトのテンプレート {abspath}:{line}: {test_id}[bandit]: {severity}: {msg} を出力します。
例
code: custom
/usr/lib/python3.6/site-packages/openlp/core/utils/__init__.py:405: B310bandit: MEDIUM: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected. HTMLフォーマッタ(html)
課題をHTMLとして出力するフォーマッターです。
例
code: html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>
Bandit Report
</title>
<style>
(中略)
</style>
</head>
<body>
<div id="metrics">
<div class="metrics-box bordered-box">
<div class="metrics-title">
Metrics:<br>
</div>
Total lines of code: <span id="loc">9</span><br>
Total lines skipped (#nosec): <span id="nosec">0</span>
</div>
</div>
<br>
<div id="results">
<div id="issue-0">
<div class="issue-block issue-sev-medium">
<b>yaml_load: </b> Use of unsafe yaml load. Allows
instantiation of arbitrary objects. Consider yaml.safe_load().<br>
<b>Test ID:</b> B506<br>
<b>Severity: </b>MEDIUM<br>
<b>Confidence: </b>HIGH<br>
<b>File: </b><a href="examples/yaml_load.py"
target="_blank">examples/yaml_load.py</a> <br>
plugins/yaml_load.html" target="_blank">
<br>
<div class="code">
<pre>
5 ystr = yaml.dump({'a' : 1, 'b' : 2, 'c' : 3})
6 y = yaml.load(ystr)
7 yaml.dump(y)
</pre>
</div>
</div>
</div>
</div>
</body>
</html>
JSONフォーマッタ(json)
課題(issue)をJSONで出力するフォーマッターです。
例
code: json
{
"errors": [],
"generated_at": "2015-12-16T22:27:34Z",
"metrics": {
"_totals": {
"CONFIDENCE.HIGH": 1,
"CONFIDENCE.LOW": 0,
"CONFIDENCE.MEDIUM": 0,
"CONFIDENCE.UNDEFINED": 0,
"SEVERITY.HIGH": 0,
"SEVERITY.LOW": 0,
"SEVERITY.MEDIUM": 1,
"SEVERITY.UNDEFINED": 0,
"loc": 5,
"nosec": 0
},
"examples/yaml_load.py": {
"CONFIDENCE.HIGH": 1,
"CONFIDENCE.LOW": 0,
"CONFIDENCE.MEDIUM": 0,
"CONFIDENCE.UNDEFINED": 0,
"SEVERITY.HIGH": 0,
"SEVERITY.LOW": 0,
"SEVERITY.MEDIUM": 1,
"SEVERITY.UNDEFINED": 0,
"loc": 5,
"nosec": 0
}
},
"results": [
{
"code": "4 ystr = yaml.dump({'a' : 1, 'b' : 2, 'c' : 3})\n5
y = yaml.load(ystr)\n6 yaml.dump(y)\n",
"filename": "examples/yaml_load.py",
"issue_confidence": "HIGH",
"issue_severity": "MEDIUM",
"issue_text": "Use of unsafe yaml load. Allows instantiation of
arbitrary objects. Consider yaml.safe_load().\n",
"line_number": 5,
"line_range": [
5
],
"test_name": "blacklist_calls",
"test_id": "B301"
}
]
}
スクリーンフォーマッター(screen)
課題(issue)を色分けしたテキストとして画面に出力するフォーマッターです。出力先が標準出力のときのデフォルトです。
例
code: screen
instantiation of arbitrary objects. Consider yaml.safe_load().
Severity: Medium Confidence: High
Location: examples/yaml_load.py:5
4 ystr = yaml.dump({'a' : 1, 'b' : 2, 'c' : 3})
5 y = yaml.load(ystr)
6 yaml.dump(y)
テキストフォーマッタ(txt)
課題(issue)をプレーンテキストとして出力するフォーマッターです。
例
code: txt
instantiation of arbitrary objects. Consider yaml.safe_load().
Severity: Medium Confidence: High
Location: examples/yaml_load.py:5
4 ystr = yaml.dump({'a' : 1, 'b' : 2, 'c' : 3})
5 y = yaml.load(ystr)
6 yaml.dump(y)
XMLフォーマッタ(xml)
このフォーマッタは、課題(issue)をXMLとして出力します。
例
code: xml
<?xml version='1.0' encoding='utf-8'?>
<testsuite name="bandit" tests="1"><testcase
classname="examples/yaml_load.py" name="blacklist_calls"><error
message="Use of unsafe yaml load. Allows instantiation of arbitrary
objects. Consider yaml.safe_load(). " type="MEDIUM"
Severity: MEDIUM Confidence: HIGH Use of unsafe yaml load. Allows
instantiation of arbitrary objects. Consider yaml.safe_load().
Location examples/yaml_load.py:5</error></testcase></testsuite>
[** YAMLフォーマッタ(yaml)
このフォーマッターは、課題(issue)をYAML形式で出力します。
例
code: yaml
errors: []
generated_at: '2017-03-09T22:29:30Z'
metrics:
_totals:
CONFIDENCE.HIGH: 1
CONFIDENCE.LOW: 0
CONFIDENCE.MEDIUM: 0
CONFIDENCE.UNDEFINED: 0
SEVERITY.HIGH: 0
SEVERITY.LOW: 0
SEVERITY.MEDIUM: 1
SEVERITY.UNDEFINED: 0
loc: 9
nosec: 0
examples/yaml_load.py:
CONFIDENCE.HIGH: 1
CONFIDENCE.LOW: 0
CONFIDENCE.MEDIUM: 0
CONFIDENCE.UNDEFINED: 0
SEVERITY.HIGH: 0
SEVERITY.LOW: 0
SEVERITY.MEDIUM: 1
SEVERITY.UNDEFINED: 0
loc: 9
nosec: 0
results:
- code: '5 ystr = yaml.dump({''a'' : 1, ''b'' : 2, ''c'' : 3})\n
6 y = yaml.load(ystr)\n7 yaml.dump(y)\n'
filename: examples/yaml_load.py
issue_confidence: HIGH
issue_severity: MEDIUM
issue_text: Use of unsafe yaml load. Allows instantiation of arbitrary
objects.
Consider yaml.safe_load().
line_number: 6
line_range:
- 6
test_id: B506
test_name: yaml_load
設定ファイル
コマンドライン引数を.banditに記述しておくことができます。このファイルがテスト対象のパスに配置しているか、---iniで明示的に指示されれば、読み込んで処理されます。
code: .bandit
targets: /app
exclude: /test
skips: B102
tests: B101, B301
Banditテストプラグイン
Banditは、Pythonコードの様々なセキュリティ問題を検出するための多くの異なるテストをサポートしています。これらのテストはプラグインとして作成されていて、新しいテストは今日のBanditが提供する機能を拡張するために作成することができます。
テストの作成
テストを作成する脆弱性を特定し、その脆弱性の1つまたは複数のケースを含む新しいファイルをexamples/に作成します。
テストを含む新しいPythonソースファイルを作成します。テストしている脆弱性を考慮して、関数を1つ以上の適切なデコレータでアノテーションします。
@checks('Call')
@checks('Import', 'ImportFrom')
@checks('Str')
bandit.plugins エントリポイントを使用してプラグインを登録します(例を参照)。
作成した関数は、パラメータとして context を受け取ります。context は、現在検査されている要素に関する情報を得るために問い合わせることができるコンテキストクラスのインスタンスです。また、より高度な使用方法として、生のASTノードを取得することもできます。
新しいテストをサポートするために、必要に応じてBanditの設定ファイルを拡張します。
examples/で定義したテストファイルに対してBanditを実行し、脆弱性が検出されることを確認します。この脆弱性がどのように現れるかのバリエーションを検討し、それに応じてサンプルファイルとテスト関数を拡張します。
設定ファイルの生成
Bandit 1.0以降では、設定ファイルは任意です。設定ファイルを必要とするプラグインは、モジュールのグローバルなgen_config()関数を実装する必要があります。この関数は、テスト用プラグイン名を1つのパラメータとして呼び出され、辞書を返します。キーには設定オプション名、値には各オプションのデフォルト設定を指定します。gen_config()の例は以下のようになります。
code: python
def gen_config(name):
if name == 'try_except_continue':
return {'check_typed_exception': False}
設定ファイルが指定されていない場合や、選択されたファイルにプラグインに関連するセクションがない場合は、gen_config() が出されてデフォルト値が提供されます。
設定ファイル生成ツール bandit-config-generator は、検出された全てのプラグインに対して gen_config() を呼び出し、テンプレートとなるコンフィグブロックを生成します。デフォルトで問題なければ、これらのブロックを削除して最小の設定を作成したり、必要に応じて編集したりすることができます。上記の例では、次のようなコンフィグブロックのスニペットが生成されます。
code: python
try_except_continue: {check_typed_exception: false}
テストプラグインの例
code: python
@bandit.checks('Call')
def prohibit_unsafe_deserialization(context):
if 'unsafe_load' in context.call_function_name_qual:
return bandit.Issue(
severity=bandit.HIGH,
confidence=bandit.HIGH,
text="Unsafe deserialization detected."
プラグインを登録するには、2つの方法があります。
setuptoolsを直接使用している場合は、セットアップコールに以下のようなものを追加してください。
code: python
# bandit_bsonモジュールに架空のbsonフォーマッタがある場合
# そして formatter という関数があるとします。
# または、bandit_makoでmakoテンプレートを使用するためのチェックを行います。
pbrを使用している場合は、setup.cfg ファイルに以下のような内容を追加してください。
code: python
bandit.formatters =
bson = bandit_bson:formatter
bandit.plugins =
mako = bandit_mako
プラグインIDのグループ
table: プラグインIDのグループ
ID 説明
B1xx 雑多なテスト
B2xx application/framework 設定ミス
B3xx blacklists (呼び出し)
B4xx blacklists (インポート)
B5xx 暗号化
B6xx ンジェクション攻撃への脆弱性
B7xx XSS(cross site scripting) Webアプリケーションの脆弱性
テストプラグインの一覧
B101: assert_used
B101: Test for use of assert
このプラグインのテストは、Python の assert キーワードの使用をチェックします。いくつかのプロジェクトでは、インターフェイスの制約を強化するために assert を使用していることがわかりました。しかし、assert は最適化されたバイトコードにコンパイルすると削除されます (python -o producing *.pyo files)。これにより、様々な保護機能が削除されてしまいます。代わりに、意味のあるエラーや AssertionError を発生させることを検討してください。
設定オプション
このチェックをスキップするファイルを設定することができます。これは、テストケースで assert 文を使用している場合に便利です。
code: INI
assert_used:
出力例
code: bash
> Issue: Use of assert detected. The enclosed code will be removed when
compiling to optimised byte code.
Severity: Low Confidence: High
Location: ./examples/assert.py:1
1 assert logged_in
2 display_assets()
参考
B102: exec_used
B102: Test for the use of exec
このプラグインテストは、Pythonのexecメソッドやキーワードの使用をチェックします。Python のドキュメントでは、exec の使用がなぜ危険なのかを簡潔に説明しています。
出力例
code: bash
> Issue: Use of exec detected.
Severity: Medium Confidence: High
Location: ./examples/exec.py:2
1 exec("do evil")
2 exec "do evil"
参考
B103: set_bad_file_permissions
B103: Test for setting permissive file permissions
POSIXベースのオペレーティングシステムでは、ファイルシステムの一部へのアクセスを保護するためにパーミッションモデルを使用しています。このモデルは "owner"、"group"、"world "の3つのロールをサポートしており、各ロールは "read"、"write"、"execute "のフラグセットの組み合わせを持つことができます。Python は POSIX スタイルのパーミッションを操作するために chmod を提供します。
このプラグインテストは、chmod の使用を調べ、特に許可された制御フラグを設定するために使用された場合に警告します。ファイルが group executable に設定されている場合は MEDIUM 警告が生成され、ファイルが world writable に設定されている場合は HIGH 警告が報告されます。警告は高い信頼度で表示されます。
出力例
code: bash
> Issue: Probable insecure usage of temp file/directory.
Severity: Medium Confidence: Medium
Location: ./examples/os-chmod.py:15
14 os.chmod('/etc/hosts', 0o777)
15 os.chmod('/tmp/oh_hai', 0x1ff)
16 os.chmod('/etc/passwd', stat.S_IRWXU)
> Issue: Chmod setting a permissive mask 0777 on file (key_file).
Severity: High Confidence: High
Location: ./examples/os-chmod.py:17
16 os.chmod('/etc/passwd', stat.S_IRWXU)
17 os.chmod(key_file, 0o777)
18
参考
B104: hardcoded_bind_all_interfaces
B104: Test for binding to all interfaces
すべてのネットワーク・インターフェイスにバインドすると、適切に文書化されていない、あるいはセキュリティが確保されていない、意図しないインターフェイスのトラフィックに対してサービスを開放する可能性があります。このプラグインのテストでは、すべてのネットワーク・インターフェイスへのハードコードされたバインドを示す可能性のある文字列パターン "0.0.0.0"を探します。
出力例
code: bash
> Issue: Possible binding to all interfaces.
Severity: Medium Confidence: Medium
Location: ./examples/binding.py:4
3 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
4 s.bind(('0.0.0.0', 31137))
5 s.bind(('192.168.0.1', 8080))
参考
B105: hardcoded_password_string
B105: Test for use of hard-coded password strings
ハードコードされたパスワードを使用していると、パスワードを推測される可能性が非常に高くなります。このプラグインのテストでは、すべての文字列リテラルを探し、以下の条件をチェックします。
パスワードのように見える変数に割り当てられている
パスワードのように見えるdictキーに割り当てられている。
パスワードのように見える変数との比較に使われている。
変数がパスワードのように見えるのは、以下のいずれかにマッチした場合です。
"password"
"pass"
"passwd"
"pwd"
"secret"
"token"
"secrete"
注意:この方法はノイズが多く、偽陽性を発生させる可能性があります。
出力例
code: bash
> Issue: Possible hardcoded password '(root)'
Severity: Low Confidence: Low
Location: ./examples/hardcoded-passwords.py:5
4 def someFunction2(password):
5 if password == "root":
6 print("OK, logged in")
参考
B106: hardcoded_password_funcarg
B106: Test for use of hard-coded password function arguments
ハードコードされたパスワードを使用していると、パスワードを推測される可能性が非常に高くなります。このプラグインのテストでは、文字列リテラルのキーワード引数が渡されるすべての関数呼び出しを調べます。割り当てられたローカル変数がパスワードのように見えないかどうかをチェックします。
変数がパスワードのように見えると考えられるのは、以下のいずれかにマッチした場合です。
"password"
"pass"
"passwd"
"pwd"
"secret"
"token"
"secrete"
注意:この方法はノイズが多く、偽陽性を発生させる可能性があります。
出力例
code:bash
password: 'blerg'
Severity: Low Confidence: Medium
Location: ./examples/hardcoded-passwords.py:16
15
16 doLogin(password="blerg")
参考
B107: hardcoded_password_default
B107: Test for use of hard-coded password argument defaults
ハードコードされたパスワードを使用していると、パスワードを推測される可能性が非常に高くなります。このプラグインのテストでは、ある引数にデフォルトの文字列リテラルを指定しているすべての関数定義を探します。そして、その引数がパスワードのように見えないかどうかをチェックします。
変数がパスワードのように見えるのは、以下のいずれかにマッチした場合と考えられます。
"password"
"pass"
"passwd"
"pwd"
"secret"
"token"
"secrete"
注意:この方法はノイズが多く、偽陽性を発生させる可能性があります。
出力例
code: bash
password: 'Admin'
Severity: Low Confidence: Medium
Location: ./examples/hardcoded-passwords.py:1
1 def someFunction(user, password="Admin"):
2 print("Hi " + user)
参考
B108: hardcoded_tmp_directory
B108: Test for insecure usage of tmp file/directory
一時ファイルやディレクトリを安全に作成するには、いくつかのルールに従う必要があります(詳細はリファレンスを参照してください)。このプラグインのテストでは、(設定可能な)よく使われる一時的なパスで始まる文字列を探します。
/tmp
/var/tmp
/dev/shm
etc
設定オプション
このテストプラグインは、hardcoded_tmp_directory という似たような名前のコンフィグブロックを受け取ります。この設定ブロックは、可能な一時ファイルのパスを示す文字列の断片を列挙したPythonのリスト、tmp_dirsを提供します。これらのフラグメントの一つで始まる文字列は、信頼度がMEDIUMの問題を報告します。
code: INI
hardcoded_tmp_directory:
参考
B109: Test for a password based config option not marked secret
このプラグインは削除されました
パスワードは機密性が高いため、適切に保護する必要があります。OpenStack Osloでは、オプションを "secret "とすることで、ログに記録されないようにすることができます。このプラグインは、「password」で終わる文字列を扱うように見えるoslo設定関数の使用を検出し、secretとマークされていない使用にフラグを立てます。
このような値が見つかった場合、深刻度MEDIUMのエラーが生成されます。False」または「None」が明示的に設定されている場合、Banditは信頼度がMEDIUMの問題を返します。Banditがsecretの値を決定できない場合、信頼度が低い問題を返します。
B110: try_except_pass
B110: Test for a pass in the except block
Pythonのコードベースにおけるエラーは、通常、例外を使って伝達されます。例外オブジェクトは、エラーが発生したときに「発生」し、プログラムの後の時点で「キャッチ」することができ、通常はエラー処理やロギングが行われます。
しかし、例外をキャッチしても、黙って無視することも可能です。以下の例で説明します。
code: pyton
try:
do_some_stuff()
except Exception:
pass
このようなパターンは、一般的に悪い習慣とされていますが、潜在的なセキュリティ上の問題でもあります。あるサービスで通常よりも大量のエラーが発生した場合、そのサービスを妨害しようとしている可能性があります。そのため、エラーは少なくともログに記録する必要があります。
まれにエラーを抑制したい状況がありますが、これは通常、基本的な Exception クラス (またはタイプなし) ではなく、特定の例外タイプで行います。
code: python
try:
do_some_stuff()
except ZeroDivisionError:
pass
これに対応するために、テストは例外が型付けされている 'try, except, pass' を無視するように設定することができます。たとえば、次のように設定オプション checked_typed_exception が False に設定されている場合、警告は発生しません。
設定オプション
code: INI
try_except_pass:
check_typed_exception: True
出力例
code: bash
> Issue: Try, Except, Pass detected.
Severity: Low Confidence: High
Location: ./examples/try_except_pass.py:4
3 a = 1
4 except:
5 pass
参考
B111: Test for the use of rootwrap running as root
このプラグインは削除されました
rootでコマンドを実行すると、潜在的なリスクが飛躍的に高まります。制限されたユーザー権限でコマンドを実行することで、コマンド・インジェクション攻撃や、開発者や設定ミスに対する深層部の防御が可能になります。このプラグインのテストでは、キーワードパラメーターrun_as_rootがTrueに設定されている特定のメソッドが呼び出されているかどうかをチェックします。これはOpenStackの一般的なイディオムです。
B112: try_except_continue
B112: Test for a continue in the except block
Pythonのコードベースにおけるエラーは、通常、例外を使って伝達されます。例外オブジェクトは、エラーが発生したときに「発生」し、プログラムの後の時点で「キャッチ」することができ、通常はエラー処理やロギングが行われます。
しかし、ループの中で例外をキャッチし、静かに無視することも可能です。次のような例があります。
code: python
while keep_going:
try:
do_some_stuff()
except Exception:
continue
このようなパターンは、一般的に悪い習慣とされていますが、潜在的なセキュリティ上の問題でもあります。あるサービスで通常よりも大量のエラーが発生した場合、そのサービスを妨害しようとしている可能性があります。そのため、エラーは少なくともログに記録する必要があります。
まれに、エラーを抑制したい状況がありますが、これは通常、基本の Exception クラス (またはタイプなし) ではなく、特定の例外タイプで行われます。
code: python
while keep_going:
try:
do_some_stuff()
except ZeroDivisionError:
continue
これに対応するために、テストでは例外が型付けされた 'try, except, continue' を無視するように設定することができます。たとえば、次のように設定オプションchecked_typed_exceptionがFalseに設定されている場合、警告は発生しません。
設定オプション
code: INI
try_except_continue:
check_typed_exception: True
出力例
code: bash
> Issue: Try, Except, Continue detected.
Severity: Low Confidence: High
Location: ./examples/try_except_continue.py:5
4 a = i
5 except:
6 continue
参考
B201: flask_debug_true
B201: Test for use of flask app with debug set to true
Flaskアプリケーションをデバッグモードで実行すると、Werkzeugデバッガが有効になってしまいます。これには、任意のコードを実行できる機能が含まれています。Flask (参考1)とWerkzeug (参考2)のドキュメントは、本番環境ではデバッグモードを決して有効にしないよう強く推奨しています。
デバッグモードを有効にしたまま本番サーバを運用したことが、2015年に発生したPatreonの不正アクセスの原因と考えられています(参考3)。
出力例
code: bash
> Issue: A Flask app appears to be run with debug=True, which exposes
the Werkzeug debugger and allows the execution of arbitrary code.
Severity: High Confidence: High
Location: examples/flask_debug.py:10
10 app.run(debug=True)
11
参考
B501: request_with_no_cert_validation
B501: Test for missing certificate validation
一般的に暗号化は、多くのアプリケーションのセキュリティに不可欠です。TLSを使用すると、通信相手の身元を保証することで、セキュリティが大幅に向上します。これは、TLSの接続初期化段階で、一方または両方の当事者が信頼できる証明書を提示することで実現されます。
リクエスト方式の場合、証明書は自動的に検証されますが、これは望ましい動作です。証明書の検証が明示的にオフになっている場合、Bandit は重大度の高いエラーを返します。
出力例
code: bash
disabling SSL certificate checks, security issue.
Severity: High Confidence: High
Location: examples/requests-ssl-verify-disabled.py:4
参考
B502: ssl_with_bad_version
B502: Test for SSL use with bad version used
SSLのすべてのバージョンとTLSの初期バージョンに、悪用可能な欠陥が発見され、大きな話題となっています。以下のような欠陥のあるバージョンのプロトコルの使用を避けることを強く推奨します。
SSL v2
SSL v3
TLS v1
TLS v1.1
このプラグインのテストでは、壊れた SSL/TLS プロトコルのバージョンを示すパラメータを持つ Python メソッドの呼び出しをスキャンします。現在のところ、Python のネイティブな SSL/TLS サポートと pyOpenSSL モジュールを使ったメソッドをサポートしています。既知の壊れたプロトコルバージョンが検出されると、HIGH severity warning が報告されます。
TLS 1.2 のネイティブサポートは、最近の Python バージョン、特に 2.7.9 以降と 3.x でのみ利用可能であることに注意してください。
SSLv23 に関する注意点
Python/pyOpenSSLが提供する利用可能なSSL/TLSのバージョンの中に、SSLv23を使用するオプションがあります。この非常にお粗末な名前のオプションは、実際には「サーバーとクライアントの両方でサポートされているSSL/TLSの最高バージョンを使用する」という意味です。Banditは必要に応じてSSLv23の使用をスキャンすることができますが、その検出は必ずしも問題を示すものではありません。
SSLv23を使用する場合、考慮されるプロトコルバージョンからSSL/TLSの悪いバージョンを明示的に除外するフラグを提供することも重要です。PythonのネイティブモジュールとpyOpenSSLモジュールは、この目的のためにOP_NO_SSLv2とOP_NO_SSLv3フラグを提供しています。
設定オプション
code: INI
ssl_with_bad_version:
bad_protocol_versions:
- PROTOCOL_SSLv2
- SSLv2_METHOD
- SSLv23_METHOD
- PROTOCOL_SSLv3 # 厳格なオプション(strict option)
- PROTOCOL_TLSv1 # 厳格なオプション(strict option)
- SSLv3_METHOD # 厳格なオプション(strict option)
- TLSv1_METHOD # 厳格なオプション(strict option)
出力例
code: bash
> Issue: ssl.wrap_socket call with insecure SSL/TLS protocol version
identified, security issue.
Severity: High Confidence: High
Location: ./examples/ssl-insecure-version.py:13
12 # strict tests
13 ssl.wrap_socket(ssl_version=ssl.PROTOCOL_SSLv3)
14 ssl.wrap_socket(ssl_version=ssl.PROTOCOL_TLSv1)
参考
ssl_with_bad_defaults()
ssl_with_no_version()
B503: ssl_with_bad_defaults
B503: Test for SSL use with bad defaults specified
このプラグインは、SSL/TLSの既知の不正なバージョンの使用を検出するテストファミリーの一部です。完全な議論については、 「B502 ssl_with_bad_version」を参照してください。具体的には、このプラグインのテストは、壊れたSSL/TLSプロトコルバージョンの使用を指定するデフォルトパラメータ値を持つPythonメソッドをスキャンします。現在のところ、Python のネイティブな SSL/TLS サポートと pyOpenSSL モジュールを使用したメソッドが検出されます。既知の壊れたプロトコルバージョンが検出されると、MEDIUM の深刻度の警告が報告されます。
設定オプション
このテストは、標準的な ../plugins/ssl_with_bad_version テストの設定を共有しているので、 「B502 ssl_with_bad_version」のドキュメントを参照してください。
出力例
code: bash
> Issue: Function definition identified with insecure SSL/TLS protocol
version by default, possible security issue.
Severity: Medium Confidence: Medium
Location: ./examples/ssl-insecure-version.py:28
27
28 def open_ssl_socket(version=SSL.SSLv2_METHOD):
29 pass
参考
ssl_with_bad_defaults()
ssl_with_no_version()
B504: ssl_with_no_version
B504: Test for SSL use with no version specified
このプラグインは、既知の不正なバージョンの SSL/TLS の使用を検出するテストのファミリーの一部で、完全な議論については 「B502: ssl_with_bad_version」 を参照してください。具体的には、このプラグインのテストは、PythonのネイティブSSL/TLSサポートとpyOpenSSLモジュールの中で、使用するSSL/TLSプロトコルのバージョンを設定する特定のメソッドをスキャンします。これらのメソッドは、互換性を最大化するデフォルト値を提供することが知られていますが、前述の壊れたプロトコルバージョンの使用を許可します。これが検出された場合、LOW severity warning が報告されます。
設定オプション
このテストは、標準的な ../plugins/ssl_with_bad_version テストの設定を共有しているので、 「B502 ssl_with_bad_version」のドキュメントを参照してください。
出力例
code: bash
> Issue: ssl.wrap_socket call with no SSL/TLS protocol version
specified, the default SSLv23 could be insecure, possible security
issue.
Severity: Low Confidence: Medium
Location: ./examples/ssl-insecure-version.py:23
22
23 ssl.wrap_socket()
24
参考
ssl_with_bad_defaults()
ssl_with_no_version()
B505: weak_cryptographic_key
B505: Test for weak cryptographic key use
計算機の性能が向上すると、より小さな鍵長の暗号を破ることができるようになります。RSAおよびDSAアルゴリズムの推奨鍵長サイズは2048ビット以上です。1024ビット以下は破られないと考えられています。ECの鍵長サイズは224以上が推奨され、160以下は破られやすいとされています。このプラグインのテストでは、これらの制限以下の鍵が使用されていないかどうかをチェックし、下限のしきい値よりも低い場合は重大度の高いエラーを、上限のしきい値よりも低い場合は中程度の重大度のエラーを返します。
出力例
code: bash
> Issue: DSA key sizes below 1024 bits are considered breakable.
Severity: High Confidence: High
Location: examples/weak_cryptographic_key_sizes.py:36
35 # Also incorrect: without keyword args
36 dsa.generate_private_key(512,
37 backends.default_backend())
38 rsa.generate_private_key(3,
参考
B506: yaml_load
B506: Test for use of yaml load
このプラグインテストは、PyYAML パッケージの yaml.load 関数の安全でない使用法をチェックします。yaml.load 関数は任意の Python オブジェクトを構築する機能を提供しますが、これは信頼されていないソースから YAML ドキュメントを受け取った場合に危険です。yaml.safe_load 関数は、この機能を整数やリストのような単純な Python オブジェクトに制限します。
yaml.load と yaml.safe_load の詳細についてはPyYAMLのドキュメント (参考1) を参照してください。
出力例
code: bash
> Issue: yaml_load Use of unsafe yaml load. Allows instantiation of arbitrary objects. Consider yaml.safe_load(). Severity: Medium Confidence: High Location: examples/yaml_load.py:5
4 ystr = yaml.dump({‘a’ : 1, ‘b’ : 2, ‘c’ : 3}) 5 y = yaml.load(ystr) 6 yaml.dump(y)
参考
B507: ssh_no_host_key_verification
B507: Test for missing host key validation
一般的に暗号化は、多くのアプリケーションのセキュリティに不可欠です。SSHを使用すると、通信相手の身元を保証することで、セキュリティを大幅に向上させることができます。これは、SSH の接続初期化段階で、一方または両方の当事者が信頼できるホスト鍵を提示することで実現されます。
paramiko方式の場合、デフォルトでホスト鍵の検証が行われます。ホスト鍵の検証が無効な場合、Bandit は HIGH severity エラーを返します。
出力例
code: bash
to automatically trust the unknown host key.
Severity: High Confidence: Medium
Location: examples/no_host_key_verification.py:4
3 ssh_client = client.SSHClient()
4 ssh_client.set_missing_host_key_policy(client.AutoAddPolicy)
5 ssh_client.set_missing_host_key_policy(client.WarningPolicy)
B601: paramiko_calls
B601: Test for shell injection within Paramiko
Paramiko は、リモートマシンへの安全な (暗号化および認証された) 接続のための SSH2 プロトコルで動作するように設計された Python ライブラリです。リモートホスト上でコマンドを実行することを目的としています。これらのコマンドはターゲット上のシェル内で実行されるため、様々なシェルインジェクション攻撃に対して脆弱です。Banditは、パラミコの「exec_command」メソッドの使用を検出すると、入力が正しくサニタイズされているかどうかを確認するようユーザに助言するMEDIUMの問題を報告します。
出力例
code: bash
> Issue: Possible shell injection via Paramiko call, check inputs are
properly sanitized.
Severity: Medium Confidence: Medium
Location: ./examples/paramiko_injection.py:4
3 # this is not safe
4 paramiko.exec_command('something; really; unsafe')
5
参考
B602: subprocess_popen_with_shell_equals_true
B602: Test for use of popen with shell equals true
Pythonは、外部の実行ファイルを呼び出すための多くのメカニズムを持っています。しかし、ユーザーが提供する入力や変数の入力をサニタイズするための適切な注意が払われていない場合、そうすることはセキュリティ上の問題を引き起こす可能性があります。
このプラグインテストは、プロセスの生成をチェックして適切に警告するために作られたテスト群の一部です。具体的には、このテストでは、コマンドシェルを使用したサブプロセスの起動を確認します。この種のサブプロセスの呼び出しは、様々なシェル・インジェクション攻撃に対して脆弱であるため危険です。このリスクを軽減するために、すべての入力をサニタイズするように細心の注意を払う必要があります。このタイプの呼び出しは、「shell=True」のパラメータが与えられることで識別されます。
さらに、このプラグインは、指定されたコマンド文字列をスキャンし、その表示方法に基づいて報告される深刻度を調整します。コマンド文字列が特殊なシェル文字を含まない単純な静的文字列である場合、結果として発生する問題の深刻度は低くなります。文字列が静的で、シェルのフォーマット文字やワイルドカードが含まれている場合は、報告される問題の深刻度は中程度です。最後に、文字列がPythonの文字列操作やフォーマット操作で計算されている場合、報告された問題の深刻度は高いです。これらの深刻度レベルは、コードがインジェクションに対して脆弱である可能性を反映しています。
こちらもご覧ください。
B603: subprocess_without_shell_equals_true
B605: start_process_with_a_shell
B606: start_process_with_no_shell
B607: start_process_with_partial_path
B609: linux_commands_wildcard_injection
設定オプション
このプラグインテストは、同系列の他のプラグインと構成を共有しています。すなわち、shell_injectionです。この設定は subprocess, shell, no_shell の3つのセクションに分かれています。これらは、次のPython コールをリストアップしています。
subprocess:サブプロセスを生成する、
shell:シェル内でコマンドを呼び出す、
no_shell:シェルなしで(呼び出したプロセスを置き換えることで)コマンドを呼び出す
このプラグインは、subprocess セクションにリストアップされたメソッドのうち、shell=True が指定されているものを特にスキャンします。
code: INI
shell_injection:
# subprocessモジュールを使用してプロセスを開始
wrappers.
subprocess:
- subprocess.Popen
- subprocess.call
出力例
code: bash
> Issue: subprocess call with shell=True seems safe, but may be
changed in the future, consider rewriting without shell
Severity: Low Confidence: High
Location: ./examples/subprocess_shell.py:21
21 subprocess.check_call('/bin/ls -l', shell=True)
22
> Issue: call with shell=True contains special shell characters,
consider moving extra logic into Python code
Severity: Medium Confidence: High
Location: ./examples/subprocess_shell.py:26
25
26 subprocess.Popen('/bin/ls *', shell=True)
27 subprocess.Popen('/bin/ls %s' % ('something',), shell=True)
> Issue: subprocess call with shell=True identified, security issue.
Severity: High Confidence: High
Location: ./examples/subprocess_shell.py:27
26 subprocess.Popen('/bin/ls *', shell=True)
27 subprocess.Popen('/bin/ls %s' % ('something',), shell=True)
28 subprocess.Popen('/bin/ls {}'.format('something'), shell=True)
参考
B603: subprocess_without_shell_equals_true
B603: Test for use of subprocess without shell equals true
Pythonは、外部の実行ファイルを呼び出すための多くのメカニズムを持っています。しかし、ユーザーが提供する入力や変数の入力をサニタイズするための適切な注意が払われていない場合、そうすることはセキュリティ上の問題を引き起こす可能性があります。
このプラグインテストは、プロセスの生成をチェックして適切に警告するために作られたテスト群の一部です。具体的には、このテストでは、コマンドシェルを使用せずにサブプロセスが起動しているかどうかを調べます。この種のサブプロセスの起動は、シェルインジェクション攻撃に対して脆弱ではありませんが、入力の妥当性を確保するために注意を払う必要があります。
これは subprocess_popen_with_shell_equals_true で説明された問題よりも小さいので、深刻度の低い警告が報告されます。
こちらもご覧ください。
B602: subprocess_popen_with_shell_equals_true
B605: start_process_with_a_shell
B606: start_process_with_no_shell
B607: start_process_with_partial_path
B609: linux_commands_wildcard_injection
設定オプション
このプラグインテストは、同系列の他のプラグインと構成を共有しています。すなわち、shell_injectionです。この設定は subprocess, shell, no_shell の3つのセクションに分かれています。これらは、次のPython コールをリストアップしています。
subprocess:サブプロセスを生成する、
shell:シェル内でコマンドを呼び出す、
no_shell:シェルなしで(呼び出したプロセスを置き換えることで)コマンドを呼び出す
このプラグインは、subprocess セクションにリストアップされた shell=False が指定されたメソッドを特別にスキャンします。
code: INI
shell_injection:
# subprocessモジュールを使用してプロセスを開始
wrappers.
subprocess:
- subprocess.Popen
- subprocess.call
出力例
code: bash
> Issue: subprocess call - check for execution of untrusted input.
Severity: Low Confidence: High
Location: ./examples/subprocess_shell.py:23
22
24
参考
B604: any_other_function_with_shell_equals_true
B604: Test for any function with shell equals true
Pythonは、外部の実行ファイルを呼び出すための多くのメカニズムを持っています。しかし、ユーザーが提供する入力や変数の入力をサニタイズするための適切な注意が払われていない場合、そうすることはセキュリティ上の問題を引き起こす可能性があります。
このプラグインテストは、プロセスの生成をチェックして適切に警告するために作られたテストのファミリーの一部です。具体的には、このプラグインのテストでは、メソッドの呼び出しにおいて、キーワードパラメータ shell が true になっているかどうかを調べます。これは、シェルインジェクション問題の検出に関連しており、脆弱なメソッドへのカスタムラッパーが作成された場合、それを捕捉することを目的としています。
こちらもご覧ください。
B603: subprocess_without_shell_equals_true
B605: start_process_with_a_shell
B606: start_process_with_no_shell
B607: start_process_with_partial_path
B609: linux_commands_wildcard_injection
設定オプション
このプラグインテストは、同系列の他のプラグインと構成を共有しています。すなわち、shell_injectionです。この設定は subprocess, shell, no_shell の3つのセクションに分かれています。これらは、次のPython コールをリストアップしています。
subprocess:サブプロセスを生成する、
shell:シェル内でコマンドを呼び出す、
no_shell:シェルなしで(呼び出したプロセスを置き換えることで)コマンドを呼び出す
具体的には、このプラグインは、サブプロセスセクションに記載されている機能を除外しています。これらのメソッドは、別の特定のテストプラグインでテストされており、この除外により、問題の重複報告を防ぐことができます。
code: INI
shell_injection:
# Ssubprocessモジュールを使用してプロセスを開始
wrappers.
subprocess: [subprocess.Popen, subprocess.call,
subprocess.check_call, subprocess.check_output
execute_with_timeout]
出力例
code: bash
> Issue: Function call with shell=True parameter identified, possible
security issue.
Severity: Medium Confidence: High
Location: ./examples/subprocess_shell.py:9
8 pop('/bin/gcc --version', shell=True)
9 Popen('/bin/gcc --version', shell=True)
10
参考
B605: start_process_with_a_shell
B605: Test for starting a process with a shell
Pythonは、外部の実行ファイルを呼び出すための多くのメカニズムを持っています。しかし、ユーザーが提供する入力や変数の入力をサニタイズするための適切な注意が払われていない場合、そうすることはセキュリティ上の問題を引き起こす可能性があります。
このプラグインテストは、プロセスの生成をチェックして適切に警告するために作られたテスト群の一部です。具体的には、このテストでは、コマンドシェルを使用したサブプロセスの起動を確認します。この種のサブプロセスの呼び出しは、様々なシェル・インジェクション攻撃に対して脆弱であるため危険です。このリスクを軽減するために、すべての入力をサニタイズするように細心の注意を払う必要があります。このタイプの呼び出しは、シェルを使用することが知られている特定のコマンドを使用することで識別されます。BanditはLOW severity警告を報告します。
以下も参照してください。
B603: subprocess_without_shell_equals_true
B605: start_process_with_a_shell
B606: start_process_with_no_shell
B607: start_process_with_partial_path
B609: linux_commands_wildcard_injection
設定オプション
このプラグインテストは、同系列の他のプラグインと構成を共有しています。すなわち、shell_injectionです。この設定は subprocess, shell, no_shell の3つのセクションに分かれています。これらは、次のPython コールをリストアップしています。
subprocess:サブプロセスを生成する、
shell:シェル内でコマンドを呼び出す、
no_shell:シェルなしで(呼び出したプロセスを置き換えることで)コマンドを呼び出す
このプラグインは特に shell セクションに記載されたメソッドをスキャンします。
code: INI
shell_injection:
shell:
- os.system
- os.popen
- os.popen2
- os.popen3
- os.popen4
- popen2.popen2
- popen2.popen3
- popen2.popen4
- popen2.Popen3
- popen2.Popen4
- commands.getoutput
- commands.getstatusoutput
出力例
code: bash
> Issue: Starting a process with a shell: check for injection.
Severity: Low Confidence: Medium
Location: examples/os_system.py:3
2
3 os.system('/bin/echo hi')
参考
B606: start_process_with_no_shell
B606: Test for starting a process with no shell
Pythonは、外部の実行ファイルを呼び出すための多くのメカニズムを持っています。しかし、ユーザーが提供する入力や変数の入力をサニタイズするための適切な注意が払われていない場合、そうすることはセキュリティ上の問題を引き起こす可能性があります。
このプラグインテストは、プロセスの生成をチェックして適切に警告するために作られたテストのファミリーの一部です。具体的には、このテストは、シェルを使用しない方法でサブプロセスが生成されているかどうかを調べます。これは一般的には安全ですが、侵入テストのワークフローでは、外部のシステムコールが使用されている場所を追跡するのに役立つかもしれません。そのため、LOW severity メッセージが生成されます。
こちらもご覧ください。
B602: subprocess_popen_with_shell_equals_true
B603: subprocess_without_shell_equals_true
B605: start_process_with_a_shell
B606: start_process_with_no_shell
B607: start_process_with_partial_path
B609: linux_commands_wildcard_injection
設定オプション
このプラグインテストは、同系列の他のプラグインと構成を共有しています。すなわち、shell_injectionです。この設定は subprocess, shell, no_shell の3つのセクションに分かれています。これらは、次のPython コールをリストアップしています。
subprocess:サブプロセスを生成する、
shell:シェル内でコマンドを呼び出す、
no_shell:シェルなしで(呼び出したプロセスを置き換えることで)コマンドを呼び出す
このプラグインは、no_shellセクションに記載されているメソッドを特別にスキャンします。
code: INI
shell_injection:
no_shell:
- os.execl
- os.execle
- os.execlp
- os.execlpe
- os.execv
- os.execve
- os.execvp
- os.execvpe
- os.spawnl
- os.spawnle
- os.spawnlp
- os.spawnlpe
- os.spawnv
- os.spawnve
- os.spawnvp
- os.spawnvpe
- os.startfile
出力例
code: bash
shell.
Severity: Low Confidence: Medium
Location: examples/os-spawn.py:8
7 os.spawnv(mode, path, args)
8 os.spawnve(mode, path, args, env)
9 os.spawnvp(mode, file, args)
参考
B607: start_process_with_partial_path
B607: Test for starting a process with a partial path
ythonには、外部の実行ファイルを起動するための多くの仕組みがあります。実行ファイルのパスがファイルシステムのルートに対して完全に修飾されていない場合、セキュリティ上のリスクが発生する可能性があります。
POSIX環境では、PATH環境変数を使用して、最初に一致する名前の実行ファイルを検索する標準的な場所のセットを指定します。この動作は便利ですが、悪意のある行為者がシステムをコントロールできる可能性があります。PATH変数の内容を調整したり、ファイルシステムを操作することができれば、目的の実行ファイルではなく、偽の実行ファイルが発見される可能性があります。この実行ファイルは、それを生成したPythonプロセスのユーザー権限で起動され、潜在的には高度な特権を持つユーザーです。
このテストは、設定された全ての Python メソッドのパラメータをスキャンし、ファイルシステムのルートから始まらないパス、つまり先頭に '/' 文字を持たないパスを探します。
設定オプション
このプラグインテストは、同系列の他のプラグインと構成を共有しています。すなわち、shell_injectionです。この設定は subprocess, shell, no_shell の3つのセクションに分かれています。これらは、次のPython コールをリストアップしています。
subprocess:サブプロセスを生成する、
shell:シェル内でコマンドを呼び出す、
no_shell:シェルなしで(呼び出したプロセスを置き換えることで)コマンドを呼び出す
このテストでは、すべてのセクションのすべてのメソッドのパラメータをスキャンします。チェックする前に、メソッドは完全に修飾されエイリアスが解除されていることに注意してください。
code: INI
shell_injection:
# Ssubprocessモジュールを使用してプロセスを開始
wrappers.
subprocess:
- subprocess.Popen
- subprocess.call
# シェルインジェクションに脆弱な関数を持つプロセスを開始します。
shell:
- os.system
- os.popen
- popen2.Popen3
- popen2.Popen4
- commands.getoutput
- commands.getstatusoutput
# シェルの脆弱性がない機能でプロセスを開始する
injection.
no_shell:
- os.execl
- os.execle
出力例
code: bash
> Issue: Starting a process with a partial executable path
Severity: Low Confidence: High
Location: ./examples/partial_path_process.py:3
2 from subprocess import Popen as pop
3 pop('gcc --version', shell=False)
参考
B608: hardcoded_sql_expressions
B608: Test for SQL injection
SQLインジェクション攻撃とは、アプリケーションに入力されたデータを介して、SQLクエリを挿入または「注入」することです。これは、非常に一般的な攻撃手段です。このプラグインテストでは、何らかの形で文字列を構築する操作に含まれるSQL文に似た文字列を探します。例えば、以下のようなものです。
"SELECT %s FROM derp;" % var
"SELECT thing FROM " + tab
"SELECT " + val + " FROM " + tab + ...
"SELECT {} FROM derp;".format(var)
f"SELECT foo FROM bar WHERE id = {product}"
このようなSQL文の文字列を作成する際に、入力データのサニタイズと管理に注意を払わないと、インジェクション攻撃が可能になります。このような性質の文字列が発見された場合、信頼度が低い問題が報告されます。結果の信頼性を高めるために、このプラグインのテストでは、発見された文字列が標準的なPython DBAPIコールのexecuteやexecuteemanyで使用されているかどうかもチェックします。もしそうであれば、MEDIUMの問題が報告されます。例えば、以下のようになります。
cursor.execute("SELECT %s FROM derp;" % var)
出力例
code: bash
> Issue: Possible SQL injection vector through string-based query
construction.
Severity: Medium Confidence: Low
Location: ./examples/sql_statements_without_sql_alchemy.py:4
3 query = "DELETE FROM foo WHERE id = '%s'" % identifier
4 query = "UPDATE foo SET value = 'b' WHERE id = '%s'" % identifier
5
参考
B609: linux_commands_wildcard_injection
B609: Test for use of wildcard injection
Pythonは、標準的なLinuxのコマンドラインユーティリティの動作をエミュレートするいくつかのメソッドを提供します。Linuxと同様に、これらのコマンドは、ファイルシステムのパスの代わりにワイルドカード "*"文字を取ることができます。これは、「すべてのファイルまたはフォルダ」という意味に解釈され、/home/user/* のような部分的に修飾されたパスを作成するために使用できます。
部分的に修飾されたパスを使用すると、予期しないファイルやシンボリックリンクが指定されたパスの場所に置かれた場合、意図しない結果になることがあります。これは、ファイルのパーミッションを操作したり、システムからデータをコピーしたりするコマンドと組み合わせた場合に特に危険です。
このテスト・プラグインでは、ワイルドカード・パラメータと組み合わせた以下のコマンドの使用状況を調べます。
'chown'
'chmod'
'tar'
'rsync'
また、シェルやサブプロセスの注入テスト設定で設定されているメソッドも同様に使用できます。
設定オプション
このプラグインテストは、同系列の他のプラグインと構成を共有しています。すなわち、shell_injectionです。この設定は subprocess, shell, no_shell の3つのセクションに分かれています。これらは、次のPython コールをリストアップしています。
subprocess:サブプロセスを生成する、
shell:シェル内でコマンドを呼び出す、
no_shell:シェルなしで(呼び出したプロセスを置き換えることで)コマンドを呼び出す
このテストは、すべてのセクションのすべてのメソッドのパラメータをスキャンします。チェックする前に、メソッドは完全に修飾され、エイリアスが解除されていることに注意してください。
code: INI
shell_injection:
# Start a process using the subprocess module, or one of its wrappers.
subprocess:
- subprocess.Popen
- subprocess.call
# Start a process with a function vulnerable to shell injection.
shell:
- os.system
- os.popen
- popen2.Popen3
- popen2.Popen4
- commands.getoutput
- commands.getstatusoutput
# Start a process with a function that is not vulnerable to shell
injection.
no_shell:
- os.execl
- os.execle
出力例
code: bash
> Issue: Possible wildcard injection in call: subprocess.Popen
Severity: High Confidence: Medium
Location: ./examples/wildcard-injection.py:8
7 o.popen2('/bin/chmod *')
8 subp.Popen('/bin/chown *', shell=True)
9
> Issue: subprocess call - check for execution of untrusted input.
Severity: Low Confidence: High
Location: ./examples/wildcard-injection.py:11
10 # Not vulnerable to wildcard injection
11 subp.Popen('/bin/rsync *')
12 subp.Popen("/bin/chmod *")
参考
B610: django_extra_used
B610: Potential SQL injection on extra function
参考
B611: django_rawsql_used
B611: Potential SQL injection on RawSQL function
参考
B701: jinja2_autoescape_false
B701: Test for not auto escaping in jinja2
Jinja2は、PythonのHTMLテンプレートシステムです。一般的にはウェブアプリケーションの構築に使用されますが、他の場所でも使用されており、特にAnsibleオートメーションシステムで使用されています。Jinja2の環境を設定する際に、入力に自動エスケープを使用するオプションを指定することができます。自動エスケープを有効にすると、Jinja2は入力文字列をフィルタリングして、テンプレート変数経由で送信されたHTMLコンテンツをエスケープします。HTML入力をエスケープしないと、アプリケーションはクロスサイトスクリプティング(XSS)攻撃に対して脆弱になります。
残念ながら、デフォルトではautoescapingはFalseです。そのため、このプラグインのテストでは、オートエスケープの設定が省略されている場合や、明示的に False が設定されている場合に警告を発します。これらのシナリオのいずれかで、重大度の高い警告が生成されます。
出力例
code: bash
> Issue: Using jinja2 templates with autoescape=False is dangerous and can
lead to XSS. Use autoescape=True to mitigate XSS vulnerabilities.
Severity: High Confidence: High
Location: ./examples/jinja2_templating.py:11
10 templateEnv = jinja2.Environment(autoescape=False,
loader=templateLoader)
11 Environment(loader=templateLoader,
12 load=templateLoader,
13 autoescape=False)
14
> Issue: By default, jinja2 sets autoescape to False. Consider using
autoescape=True or use the select_autoescape function to mitigate XSS
vulnerabilities.
Severity: High Confidence: High
Location: ./examples/jinja2_templating.py:15
14
15 Environment(loader=templateLoader,
16 load=templateLoader)
17
19 loader=templateLoader)
参考
OWASP XSS
B702: use_of_mako_templates
B702: Test for use of mako templates
MakoはPythonのテンプレートシステムで、Webアプリケーションの構築によく使われます。MakoはPylonsやPyramidで使われているデフォルトのテンプレートシステムです。Jinja2(代替テンプレートシステム)とは異なり、Makoは環境変数をエスケープするメカニズムを持っていません。このため、クロスサイトスクリプティング(XSS)攻撃の脆弱性を防ぐために、すべての入力変数は使用前に注意深くエスケープする必要があります。
出力例
code: bash
> Issue: Mako templates allow HTML/JS rendering by default and are
inherently open to XSS attacks. Ensure variables in all templates are
properly sanitized via the 'n', 'h' or 'x' flags (depending on context).
For example, to HTML escape the variable 'data' do ${ data |h }.
Severity: Medium Confidence: High
Location: ./examples/mako_templating.py:10
9
10 mako.template.Template("hern")
11 template.Template("hern")
参考
OWASP XSS
B703: django_mark_safe
B703: Potential XSS on mark_safe function
参考
Bandit ブラックリスト プラグイン
Banditは、インポートと関数呼び出しのブラックリスト化を実装するための組み込み機能をサポートしています。この機能は、組み込みテスト「B001」によって提供されます。このテストは、通常のプラグインのフィルタリングルールに従ってフィルタリングすることができます。
ブラックリストに登録される正確な呼び出しとインポート、および報告される問題は、エントリポイント 'bandit.blacklists' を持つプラグインのメソッドによって制御され、必要に応じてサードパーティのプラグインによって拡張することができます。ブラックリストのプラグインは、起動時にBanditによって検出され、呼び出されます。返された結果は最終的なデータセットにまとめられ、Banditの通常のテストのinclude/excludeルールに従い、ブラックリストの項目を細かく制御することができます。慣習的に、ブラックリストに登録された呼び出しはB3xxの範囲のIDを持ち、インポートはB4xxの範囲のIDを持つべきです。
プラグインの関数は、ASTのノードタイプとブラックリストデータのリストをマッピングした辞書を返す必要があります。現在、以下のノードタイプがサポートされています。
Call:ブラックリストの呼び出しに使われます。
Import:ブラックリストに載せるモジュールのインポートに使用されます (これは、Pythonに組み込まれた __import__() メソッドが呼び出されたImportFromとCallノードも暗黙的にテストします)。
データリストの項目は、以下の構造を持つPython辞書です。
table: データリスト
キー データの意味
'name' 課題名(Issue name)の文字列です。
'id' チェックのバンディットIDです。
これは一意でなければならず、
ブラックリスト・チェックのフィルタリングに使用されます。
'qualnames' 完全修飾名文字列のPythonリストです。
これはトークン'{name}'を含む文字列で、
最終レポートではマッチしたqualnameで置き換えられます。
'level' 報告された深刻度レベルです。
これらの辞書を構築するためのユーティリティーメソッドbandit.blacklists.utils.build_conf_dict()が提供されています。
出力例
code: bash
> Issue: B317:blacklist Using xml.sax.parse to parse untrusted XML data is known to be vulnerable to XML attacks. Replace xml.sax.parse with its
defusedxml equivalent function.
Severity: Medium Confidence: High
Location: ./examples/xml_sax.py:24
23 sax.parseString(xmlString, ExampleContentHandler())
24 sax.parse('notaxmlfilethatexists.xml', ExampleContentHandler)
25
ブラックリストプラグインの一覧
blacklist_calls
blacklist_imports
blacklist_calls
危険なことが知られている様々な Python コールのブラックリスト化
このブラックリストデータは、セキュリティに影響を与える可能性があることが知られている多くのPythonコールをチェックします。以下のブラックリストテストは、スキャンされたコードベースに含まれる関数コールに対して実行され、ast.Callノードをエンコードすることでトリガされます。
B301: pickle
信頼できないデータのデシリアライズに pickle およびそれをラップしたモジュールを使用すると、セキュリティ上の問題が発生する可能性があります。
table: Secuirty Issue
ID Name Calls Severity
B301 pickle pickle.loads Medium
pickle.load
pickle.Unpickler
cPickle.loads
cPickle.load
cPickle.Unpickler
dill.loads
dill.load
dill.Unpickler
shelve.open
shelve.DbfilenameShelf
B302: marshal
marshalモジュールを使用したデシリアライズは危険な可能性があります。
table: Secuirty Issue
ID Name Calls Severity
B302 marshal marshal.load Medium
marshal.loads
B303:md5
安全でない MD2、MD4、MD5、または SHA1 ハッシュ関数の使用。
table: Secuirty Issue
ID Name Calls Severity
B303 md5 hashlib.md5 Medium
hashlib.sha1
Crypto.Hash.MD2.new
Crypto.Hash.MD4.new
Crypto.Hash.MD5.new
Crypto.Hash.SHA.new
Cryptodome.Hash.MD2.new
Cryptodome.Hash.MD4.new
Cryptodome.Hash.MD5.new
Cryptodome.Hash.SHA.new
cryptography.hazmat.primitives .hashes.MD5
cryptography.hazmat.primitives .hashes.SHA1
B304 - B305: 暗号とモード
安全ではない暗号または暗号モードの使用。AES などの既知の安全な暗号に置き換えてください。
table: Secuirty Issue
ID Name Calls Severity
B304 ciphers Crypto.Cipher.ARC2.new High
Crypto.Cipher.ARC4.new
Crypto.Cipher.Blowfish.new
Crypto.Cipher.DES.new
Crypto.Cipher.XOR.new
Cryptodome.Cipher.ARC2.new
Cryptodome.Cipher.ARC4.new
Cryptodome.Cipher.Blowfish.new
Cryptodome.Cipher.DES.new
Cryptodome.Cipher.XOR.new
cryptography.hazmat.primitives .ciphers.algorithms.ARC4
cryptography.hazmat.primitives .ciphers.algorithms.Blowfish
cryptography.hazmat.primitives .ciphers.algorithms.IDEA
B305 cipher_modes cryptography.hazmat.primitives .ciphers.modes.ECB Medium
B306:mktemp_q
安全ではない、非推奨の関数mktemp()の使用。
table: Secuirty Issue
ID Name Calls Severity
B306 mktemp_q tempfile.mktemp Medium
B307:eval
安全でない可能性のある関数の使用 - より安全な ast.literal_eval の使用を検討してください。
table: Secuirty Issue
ID Name Calls Severity
B307 eval eval Medium
B308: mark_safe
mark_safe() を使用すると、クロスサイトスクリプティングの脆弱性が発生する可能性があるため、見直しが必要です。
table: Secuirty Issue
ID Name Calls Severity
B308 mark_safe django.utils.safestring.mark_safe Medium
B309: httpsconnection
table: Secuirty Issue
ID Name Calls Severity
B309 httpsconnection httplib.HTTPSConnection Medium
http.client.HTTPSConnection
six.moves.http_client .HTTPSConnection
B310: urlib_urlopen
許可されたスキームのurl openを監査します。file:''やカスタムスキームの使用を許可することは、しばしば予期しないことが発生します。
table: Secuirty Issue
ID Name Calls Severity
B310 urllib_urlopen urllib.urlopen Medium
urllib.request.urlopen
urllib.urlretrieve
urllib.request.urlretrieve
urllib.URLopener
urllib.request.URLopener
urllib.FancyURLopener
urllib.request.FancyURLopener
urllib2.urlopen
urllib2.Request
six.moves.urllib.request.urlopen
six.moves.urllib.request .urlretrieve
six.moves.urllib.request .URLopener
six.moves.urllib.request .FancyURLopener
B311: ramdom
標準的な疑似乱数生成器は、セキュリティ/暗号目的には適していません。
table: Secuirty Issue
ID Name Calls Severity
B311 random random.random random
random.randrange
random.randint
random.choice
random.choices
random.uniform
random.triangular
B312: telnetlib
Telnet関連の関数が呼び出されています。Telnetは安全ではありません。SSHなどの暗号化されたプロトコルを使用してください。
table: Secuirty Issue
ID Name Calls Severity
B312 telnetlib telnetlib.* High
B313 - B320: XML
信頼されていないXMLデータを解析するために様々なXLMメソッドを使用することは、XML攻撃に対して脆弱であることが知られている。メソッドは defusedxml と同等のものに置き換えるべきです。
table: Secuirty Issue
ID Name Calls Severity
B313 xml_bad_cElementTree xml.etree.cElementTree.parse Medium
xml.etree.cElementTree.iterparse
xml.etree.cElementTree.fromstring
xml.etree.cElementTree.XMLParser
B314 xml_bad_ElementTree xml.etree.ElementTree.parse Medium
xml.etree.ElementTree.iterparse
xml.etree.ElementTree.fromstring
xml.etree.ElementTree.XMLParser
B315 xml_bad_expatreader xml.sax.expatreader.create_parser Medium
B316 xml_bad_expatbuilder xml.dom.expatbuilder.parse Medium
xml.dom.expatbuilder.parseString
B317 xml_bad_sax xml.sax.parse Medium
xml.sax.parseString
xml.sax.make_parser
B318 xml_bad_minidom xml.dom.minidom.parse Medium
xml.dom.minidom.parseString
B319 xml_bad_pulldom xml.dom.pulldom.parse Medium
xml.dom.pulldom.parseString
B320 xml_bad_etree lxml.etree.parse Medium
lxml.etree.fromstring
lxml.etree.RestrictedElement
lxml.etree.GlobalParserTLS
lxml.etree.getDefaultParser
lxml.etree.check_docinfo
B321: ftplib
FTP関連の関数が呼び出されています。FTPは安全ではありません。SSH/SFTP/SCP などの暗号化されたプロトコルを使用してください。
table: Secuirty Issue
ID Name Calls Severity
B321 ftplib ftplib.* High
B322:input
この呼び出しのチェックは削除されました
Python 2 の input メソッドは、標準入力から読み込み、結果の文字列を評価して python ソースコードとして実行します。これは似ていますが、多くの点で eval を使うよりも悪いです。Python 2 では代わりに raw_input を使用してください。Python 3 では input は安全です。
table: Secuirty Issue
ID Name Calls Severity
B322 input input High
B323: unverified_context
デフォルトでは、Python は HTTPSConnection のようなクラスで使用するために、安全で検証された ssl コンテキストを作成します。しかし、証明書の検証やホスト名のチェックを行わない以前の動作に戻す _create_unverified_context によって、安全ではないコンテキストを使用することができます。
table: Secuirty Issue
ID Name Calls Severity
B323 unverified_context ssl._create_unverified_context Medium
B325: tempnam
os.tempnam()およびos.tmpnam()の使用はシンボリックリンク攻撃に対して脆弱です。代わりにtmpfile()の使用を検討してください。
さらに詳しい情報は次を参照してください。
table: Secuirty Issue
ID Name Calls Severity
B325 tempnam os.tempnam Medium
os.tmpnam
blacklist_imports
危険なことが知られている様々な Python の import をブラックリスト化
このブラックリストデータは、セキュリティに影響を与える可能性があることが知られている多くの Python モジュールをチェックします。以下のブラックリストテストは、スキャンされたコードベースで遭遇したすべての import 文や呼び出しに対して実行されます。
B401: import_telnetlib
telnet関連のモジュールがインポートされています。Telnetは安全ではありません。SSHや他の暗号化されたプロトコルを使ってください。
table: Secuirty Issue
ID Name Imports Severity
B401 import_telnetlib telnetlib high
B402: import_ftplib
FTP関連のモジュールがインポートされています。FTPは安全ではありません。SSH/SFTP/SCPなどの暗号化されたプロトコルを使用してください。
table: Secuirty Issue
ID Name Imports Severity
B402 import_ftplib ftplib high
B403: import_pickle
これらのモジュールに関連するセキュリティ上の影響を考慮してください。
table: Secuirty Issue
ID Name Imports Severiy
B403 import_pickle pickle low
cPickle
dill
shelve
B404: import_subprocess
これらのモジュールに関連するセキュリティ上の影響を考慮してください。
table: Secuirty Issue
ID Name Imports Severity
B404 import_subprocess subprocess low
B405: import_xml_etree
信頼されていないXMLデータを解析するために様々な方法を使用することは、XML攻撃に対して脆弱であることが知られています。脆弱なインポート品は、同等のdefusedxmlパッケージで置き換えるか、defusedxml.defuse_stdlib()が呼ばれていることを確認してください。
table: Secuirty Issue
ID Name Imports Severity
B405 import_xml_etree xml.etree.cElementTree low
xml.etree.ElementTree
B406: import_xml_sax
信頼されていないXMLデータを解析するために様々な方法を使用することは、XML攻撃に対して脆弱であることが知られています。脆弱なインポートは、同等のdefusedxmlパッケージで置き換えるか、defusedxml.defuse_stdlib()が呼ばれていることを確認してください。
table: Secuirty Issue
ID Name Imports Severity
B406 import_xml_sax xml.sax low
B407: import_xml_expat
信頼されていないXMLデータを解析するために様々な方法を使用することは、XML攻撃に対して脆弱であることが知られています。脆弱なインポートは、同等のdefusedxmlパッケージで置き換えるか、defusedxml.defuse_stdlib() が呼ばれていることを確認してください。
table: Secuirty Issue
ID Name Imports Severity
B407 import_xml_expat xml.dom.expatbuilder low
B408: import_xml_minidom
信頼されていないXMLデータを解析するために様々な方法を使用すると、XML攻撃に対して脆弱になることが知られています。脆弱なインポートは、同等のdefusedxmlパッケージで置き換えるか、defusedxml.defuse_stdlib()が呼ばれていることを確認してください。
table: Secuirty Issue
ID Name Imports Severity
B408 import_xml_minidom xml.dom.minidom low
B409: import_xml_pulldom
信頼されていないXMLデータを解析するために様々な方法を使用すると、XML攻撃に対して脆弱になることが知られています。脆弱なインポートは、同等のdefusedxmlパッケージで置き換えるか、defusedxml.defuse_stdlib() が呼ばれていることを確認してください。
table: Secuirty Issue
ID Name Imports Severity
B409 import_xml_pulldom xml.dom.pulldom low
B410: import_lxml
信頼されていないXMLデータを解析するために様々な方法を使用することは、 XML攻撃に対して脆弱であることが知られています。脆弱なインポートを、同等のdefusedxmlパッケージで置き換えてください。
table: Secuirty Issue
ID Name Calls Severity
B410 import_lxml lxml low
B411: import_xmlrpclib
XMLRPCは、ネットワーク上でのデータ通信にも関係しているので、特に危険です。defused.xmlrpc.monkey_patch() 関数を使ってxmlrpclibをモンキーパッチし、リモートのXML攻撃を緩和します。
table: Secuirty Issue
ID Name Calls Severity
B411 import_xmlrpclib xmlrpclib high
B412: import_httpoxy
httpoxyは、CGIやCGIライクな環境で動作するアプリケーションコードに影響を与える一連の脆弱性です。このクラスの攻撃を防ぐために、ウェブアプリケーションでのCGIの使用は避けるべきです。詳細は https://httpoxy.org/ をご覧ください。 table: Secuirty Issue
ID Name Calls Severity
B412 import_httpoxy wsgiref.handlers.CGIHandler high
twisted.web.twcgi.CGIScript
B413: import_pycrypto
table: Secuirty Issue
ID Name Calls Severity
B413 import_pycrypto Crypto.Cipher high
Crypto.Hash
Crypto.IO
Crypto.Protocol
Crypto.PublicKey
Crypto.Random
Crypto.Signature
Crypto.Util
B414: import_pycryptodome
このインポートブラックリストは削除されました
ここでの情報は歴史的な目的のために残されています。
pycryptodomeはpycryptoのダイレクトフォークで、PyCryptoに内在する問題に完全には対処していません。これは主に pycrypto の API 互換の継続として存在しているようで、Python コミュニティでより多くの支持を得ている pyca/cryptography を支持して廃止されるべきです。
table: Secuirty Issue
ID Name Calls Severity
B414 import_pycryptodome Cryptodome.Cipher high
Cryptodome.Hash
Cryptodome.IO
Cryptodome.Protocol
Cryptodome.PublicKey
Cryptodome.Random
Cryptodome.Signature
Cryptodome.Util