]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commitdiff
Add bandit for security static analysis testing
authorEric Brown <browne@vmware.com>
Sat, 2 May 2015 07:13:06 +0000 (00:13 -0700)
committerEric Brown <browne@vmware.com>
Sun, 26 Jul 2015 04:37:31 +0000 (21:37 -0700)
This change adds a basic bandit config for Cinder. It can be invoked
by running the tox environment for bandit;
    tox -e bandit

This is intended as a starting point for using bandit with Cinder
and it should be revisited to improve the testing as more is learned
about the specific needs of the Cinder code base.

Tox is configured to only show results for high and medium severity
results.

https://wiki.openstack.org/wiki/Security/Projects/Bandit

Change-Id: I0247e0ccaed6faacacb2b8d2f8b141a8edc704af

test-requirements.txt
tools/bandit.yaml [new file with mode: 0644]
tox.ini

index c5fcc74499dc0fff4acfc964d148b5053e7e1675..5c5068ed3e0ccb55dc352d559e05f655239571b8 100644 (file)
@@ -21,3 +21,4 @@ testrepository>=0.0.18
 oslosphinx>=2.5.0 # Apache-2.0
 os-testr>=0.1.0
 tempest-lib>=0.6.1
+bandit>=0.10.1
diff --git a/tools/bandit.yaml b/tools/bandit.yaml
new file mode 100644 (file)
index 0000000..23a39eb
--- /dev/null
@@ -0,0 +1,128 @@
+# optional: after how many files to update progress
+#show_progress_every: 100
+
+# optional: plugins directory name
+#plugins_dir: 'plugins'
+
+# optional: plugins discovery name pattern
+plugin_name_pattern: '*.py'
+
+# optional: terminal escape sequences to display colors
+#output_colors:
+#    DEFAULT: '\033[0m'
+#    HEADER: '\033[95m'
+#    LOW: '\033[94m'
+#    MEDIUM: '\033[93m'
+#    HIGH: '\033[91m'
+
+# optional: log format string
+#log_format: "[%(module)s]\t%(levelname)s\t%(message)s"
+
+# globs of files which should be analyzed
+include:
+    - '*.py'
+
+# a list of strings, which if found in the path will cause files to be excluded
+# for example /tests/ - to remove all all files in tests directory
+exclude_dirs:
+    - '/tests/'
+
+profiles:
+    XSS:
+        include:
+            - jinja2_autoescape_false
+            - use_of_mako_templates
+
+    ShellInjection:
+        include:
+            - subprocess_popen_with_shell_equals_true
+            - subprocess_without_shell_equals_true
+            - any_other_function_with_shell_equals_true
+            - start_process_with_a_shell
+            - start_process_with_no_shell
+        exclude:
+
+    SqlInjection:
+        include:
+            - hardcoded_sql_expressions
+
+blacklist_calls:
+    bad_name_sets:
+        - pickle:
+            qualnames: [pickle.loads, pickle.load, pickle.Unpickler,
+                        cPickle.loads, cPickle.load, cPickle.Unpickler]
+            message: "Pickle library appears to be in use, possible security issue."
+        - marshal:
+            qualnames: [marshal.load, marshal.loads]
+            message: "Deserialization with the marshal module is possibly dangerous."
+        - md5:
+            qualnames: [hashlib.md5]
+            message: "Use of insecure MD5 hash function."
+        - mktemp_q:
+            qualnames: [tempfile.mktemp]
+            message: "Use of insecure and deprecated function (mktemp)."
+        - eval:
+            qualnames: [eval]
+            message: "Use of possibly insecure function - consider using safer ast.literal_eval."
+        - mark_safe:
+            names: [mark_safe]
+            message: "Use of mark_safe() may expose cross-site scripting vulnerabilities and should be reviewed."
+        - httpsconnection:
+            qualnames: [httplib.HTTPSConnection]
+            message: "Use of HTTPSConnection does not provide security, see https://wiki.openstack.org/wiki/OSSN/OSSN-0033"
+        - yaml_load:
+            qualnames: [yaml.load]
+            message: "Use of unsafe yaml load. Allows instantiation of arbitrary objects. Consider yaml.safe_load()."
+        - urllib_urlopen:
+            qualnames: [urllib.urlopen, urllib.urlretrieve, urllib.URLopener, urllib.FancyURLopener, urllib2.urlopen, urllib2.Request]
+            message: "Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected."
+        - paramiko_injection:
+            qualnames: [paramiko.exec_command, paramiko.invoke_shell]
+            message: "Paramiko exec_command() and invoke_shell() usage may expose command injection vulnerabilities and should be reviewed."
+
+shell_injection:
+    # Start a process using the subprocess module, or one of its wrappers.
+    subprocess: [subprocess.Popen, subprocess.call, subprocess.check_call,
+                 subprocess.check_output, utils.execute, utils.execute_with_timeout]
+    # Start a process with a function vulnerable to 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]
+    # Start a process with a function that is not vulnerable to 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]
+
+blacklist_imports:
+    bad_import_sets:
+        - telnet:
+            imports: [telnetlib]
+            level: HIGH
+            message: "Telnet is considered insecure. Use SSH or some other encrypted protocol."
+        - info_libs:
+            imports: [pickle, cPickle, subprocess, Crypto]
+            level: LOW
+            message: "Consider possible security implications associated with {module} module."
+
+hardcoded_password:
+    word_list: "wordlist/default-passwords"
+
+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
+
+password_config_option_not_marked_secret:
+    function_names:
+        - oslo.config.cfg.StrOpt
+        - oslo_config.cfg.StrOpt
+
+execute_with_run_as_root_equals_true:
+    function_names:
+        - cinder.utils.execute
diff --git a/tox.ini b/tox.ini
index f5d87a871333522942f6097b09eecbb5e65051eb..c23cc257601e7c0459a9d62701f00759c241c22d 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -128,6 +128,10 @@ sitepackages = False
 envdir = {toxworkdir}/venv
 commands = python {toxinidir}/tools/generate_driver_list.py
 
+[testenv:bandit]
+deps = -r{toxinidir}/test-requirements.txt
+commands = bandit -c tools/bandit.yaml -r cinder -n 5 -ll
+
 [flake8]
 # Following checks are ignored on purpose.
 #