[Pkg-libvirt-maintainers] Bug#769551: Debdiff

Bastien ROUCARIES roucaries.bastien at gmail.com
Sun Nov 16 14:05:16 UTC 2014


The debdiff

Bastien
-------------- next part --------------
diff -Nru fence-agents-4.0.7.1/debian/changelog fence-agents-4.0.7.1/debian/changelog
--- fence-agents-4.0.7.1/debian/changelog	2014-09-23 20:58:24.000000000 +0200
+++ fence-agents-4.0.7.1/debian/changelog	2014-11-16 14:51:30.000000000 +0100
@@ -1,3 +1,13 @@
+fence-agents (4.0.7.1-2.2) unstable; urgency=high
+
+  * Non-maintainer upload.
+  * Security Bug fix (CVE-2014-0104): "fence-agents:
+    no verification of remote SSL certificates",
+    thanks to Moritz Muehlenhoff (Closes: #764801).
+    Need to build-dep on python-requests.
+
+ -- Bastien Roucariès <roucaries.bastien+debian at gmail.com>  Sun, 16 Nov 2014 14:39:37 +0100
+
 fence-agents (4.0.7.1-2.1) unstable; urgency=medium
 
   * Non-maintainer upload.
diff -Nru fence-agents-4.0.7.1/debian/control fence-agents-4.0.7.1/debian/control
--- fence-agents-4.0.7.1/debian/control	2014-09-23 21:00:37.000000000 +0200
+++ fence-agents-4.0.7.1/debian/control	2014-11-16 14:50:41.000000000 +0100
@@ -15,6 +15,7 @@
                python,
                python-pexpect,
                python-pycurl,
+               python-requests,
                python-suds,
                xsltproc,
                libxml2-utils,
diff -Nru fence-agents-4.0.7.1/debian/patches/0001-verify-ssl-certificate.diff fence-agents-4.0.7.1/debian/patches/0001-verify-ssl-certificate.diff
--- fence-agents-4.0.7.1/debian/patches/0001-verify-ssl-certificate.diff	1970-01-01 01:00:00.000000000 +0100
+++ fence-agents-4.0.7.1/debian/patches/0001-verify-ssl-certificate.diff	2014-11-16 14:37:22.000000000 +0100
@@ -0,0 +1,224 @@
+From e51df7a73141c4d378d12e4a3ade12776e48ebff Mon Sep 17 00:00:00 2001
+From: Marek 'marx' Grac <mgrac at redhat.com>
+Date: Wed, 5 Mar 2014 12:49:17 +0100
+Subject: [PATCH] fencing: Add new options --ssl-secure and --ssl-insecure
+
+These new options extends current --ssl (same as --ssl-secure). Until now certificate of the fence device
+was not validated what can possibly lead to attack on infrastructe. With this patch, user can decide
+if certificate should (--ssl-secure) or should not (--ssl-insecure) be verified.
+
+This patch fix CVE-2014-0104.
+
+bug-fedora: https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2014-0104
+bug-debian: https://bugs.debian.org/764801
+---
+ fence/agents/cisco_ucs/fence_cisco_ucs.py     |   10 ++++++-
+ fence/agents/lib/fencing.py.py                |   29 ++++++++++++++++++---
+ fence/agents/rhevm/fence_rhevm.py             |   11 ++++++--
+ fence/agents/vmware_soap/fence_vmware_soap.py |   34 +++++++++++++++++++++---
+ 4 files changed, 70 insertions(+), 14 deletions(-)
+
+diff a/fence/agents/cisco_ucs/fence_cisco_ucs.py b/fence/agents/cisco_ucs/fence_cisco_ucs.py
+index 71782cb..1e9d983 100644
+Index: fence-agents-4.0.7.1/fence/agents/cisco_ucs/fence_cisco_ucs.py
+===================================================================
+--- fence-agents-4.0.7.1.orig/fence/agents/cisco_ucs/fence_cisco_ucs.py
++++ fence-agents-4.0.7.1/fence/agents/cisco_ucs/fence_cisco_ucs.py
+@@ -85,8 +85,14 @@ def send_command(opt, command, timeout):
+ 	c.setopt(pycurl.POSTFIELDS, command)
+ 	c.setopt(pycurl.WRITEFUNCTION, b.write)
+ 	c.setopt(pycurl.TIMEOUT, timeout)
+-	c.setopt(pycurl.SSL_VERIFYPEER, 0)
+-	c.setopt(pycurl.SSL_VERIFYHOST, 0)
++	if opt.has_key("--ssl") or opt.has_key("--ssl-secure"):
++		c.setopt(pycurl.SSL_VERIFYPEER, 1)
++		c.setopt(pycurl.SSL_VERIFYHOST, 2)
++
++	if opt.has_key("--ssl-insecure"):
++		c.setopt(pycurl.SSL_VERIFYPEER, 0)
++		c.setopt(pycurl.SSL_VERIFYHOST, 0)
++
+ 	c.perform()
+ 	result = b.getvalue()
+ 
+Index: fence-agents-4.0.7.1/fence/agents/lib/fencing.py.py
+===================================================================
+--- fence-agents-4.0.7.1.orig/fence/agents/lib/fencing.py.py
++++ fence-agents-4.0.7.1/fence/agents/lib/fencing.py.py
+@@ -170,6 +170,23 @@ all_opt = {
+ 		"required" : "0",
+ 		"shortdesc" : "SSL connection",
+ 		"order" : 1 },
++	"ssl_insecure" : {
++		"getopt" : "9",
++		"longopt" : "ssl-insecure",
++		"help" : "--ssl-insecure                 Use ssl connection without verifying certificate",
++		"required" : "0",
++		"shortdesc" : "SSL connection without verifying fence device's certificate",
++		"order" : 1 },
++	"ssl_secure" : {
++		"getopt" : "9",
++		"longopt" : "ssl-secure",
++		"help" : "--ssl-secure                   Use ssl connection with verifying certificate",
++		"required" : "0",
++		"shortdesc" : "SSL connection with verifying fence device's certificate",
++		"order" : 1 },
++	"notls" : {
++		"getopt" : "t",
++		"longopt" : "notls"},
+ 	"port" : {
+ 		"getopt" : "n:",
+ 		"longopt" : "plug",
+@@ -362,6 +379,7 @@ DEPENDENCY_OPT = {
+ 		"secure" : [ "identity_file", "ssh_options" ],
+ 		"ipaddr" : [ "ipport", "inet4_only", "inet6_only" ],
+ 		"port" : [ "separator" ],
++		"ssl" : [ "ssl_secure", "ssl_insecure" ],
+ 		"community" : [ "snmp_auth_prot", "snmp_sec_level", "snmp_priv_prot", \
+ 			"snmp_priv_passwd", "snmp_priv_passwd_script" ]
+ 	}
+@@ -637,7 +655,7 @@ def check_input(device_opt, opt):
+ 		elif options.has_key("--ssh"):
+ 			all_opt["ipport"]["default"] = 22
+ 			all_opt["ipport"]["help"] = "-u, --ipport=[port]            TCP/UDP port to use (default 22)"
+-		elif options.has_key("--ssl"):
++		elif options.has_key("--ssl") or options.has_key("--ssl-secure") or options.has_key("--ssl-insecure"):
+ 			all_opt["ipport"]["default"] = 443
+ 			all_opt["ipport"]["help"] = "-u, --ipport=[port]            TCP/UDP port to use (default 443)"
+ 		elif device_opt.count("web"):
+@@ -730,7 +748,7 @@ def check_input(device_opt, opt):
+ 	if options.has_key("--ipport") == False:
+ 		if options.has_key("--ssh"):
+ 			options["--ipport"] = 22
+-		elif options.has_key("--ssl"):
++		elif options.has_key("--ssl") or options.has_key("--ssl-secure") or options.has_key("--ssl-insecure"):
+ 			options["--ipport"] = 443
+ 		elif device_opt.count("web"):
+ 			options["--ipport"] = 80
+@@ -960,7 +978,17 @@ def fence_login(options, re_login_string
+ 		re_pass  = re.compile("(password)|(pass phrase)", re.IGNORECASE)
+ 
+ 		if options.has_key("--ssl"):
+-			command = '%s --insecure --crlf -p %s %s' % (SSL_PATH, options["--ipport"], options["--ip"])
++			gnutls_opts = ""
++			ssl_opts = ""
++
++			if options.has_key("--notls"):
++				gnutls_opts = "--priority \"NORMAL:-VERS-TLS1.2:-VERS-TLS1.1:-VERS-TLS1.0:+VERS-SSL3.0\""
++
++			# --ssl is same as the --ssl-secure
++			if options.has_key("--ssl-insecure"):
++				ssl_opts = "--insecure"
++
++			command = '%s %s %s --crlf -p %s %s' % (SSL_PATH, gnutls_opts, ssl_opts, options["--ipport"], options["--ip"])
+ 			try:
+ 				conn = fspawn(options, command)
+ 			except pexpect.ExceptionPexpect, ex:
+Index: fence-agents-4.0.7.1/fence/agents/rhevm/fence_rhevm.py
+===================================================================
+--- fence-agents-4.0.7.1.orig/fence/agents/rhevm/fence_rhevm.py
++++ fence-agents-4.0.7.1/fence/agents/rhevm/fence_rhevm.py
+@@ -84,8 +84,13 @@ def send_command(opt, command, method =
+ 	c.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_BASIC)
+ 	c.setopt(pycurl.USERPWD, opt["--username"] + ":" + opt["--password"])
+ 	c.setopt(pycurl.TIMEOUT, int(opt["--shell-timeout"]))
+-	c.setopt(pycurl.SSL_VERIFYPEER, 0)
+-	c.setopt(pycurl.SSL_VERIFYHOST, 0)
++	if opt.has_key("--ssl") or opt.has_key("--ssl-secure"):
++		c.setopt(pycurl.SSL_VERIFYPEER, 1)
++		c.setopt(pycurl.SSL_VERIFYHOST, 2)
++
++	if opt.has_key("--ssl-insecure"):
++		c.setopt(pycurl.SSL_VERIFYPEER, 0)
++		c.setopt(pycurl.SSL_VERIFYHOST, 0)
+ 
+ 	if (method == "POST"):
+ 		c.setopt(pycurl.POSTFIELDS, "<action />")
+Index: fence-agents-4.0.7.1/fence/agents/vmware_soap/fence_vmware_soap.py
+===================================================================
+--- fence-agents-4.0.7.1.orig/fence/agents/vmware_soap/fence_vmware_soap.py
++++ fence-agents-4.0.7.1/fence/agents/vmware_soap/fence_vmware_soap.py
+@@ -2,10 +2,14 @@
+ 
+ import sys, exceptions, time
+ import shutil, tempfile, suds
++import logging, requests, cookielib
++
+ sys.path.append("@FENCEAGENTSLIBDIR@")
+ 
+ from suds.client import Client
+ from suds.sudsobject import Property
++from suds.transport.http import HttpAuthenticated
++from suds.transport import Reply, TransportError
+ from fencing import *
+ 
+ #BEGIN_VERSION_GENERATION
+@@ -14,13 +18,32 @@ REDHAT_COPYRIGHT=""
+ BUILD_DATE="April, 2011"
+ #END_VERSION_GENERATION
+ 
++class RequestsTransport(HttpAuthenticated):
++	def __init__(self, **kwargs):
++		self.cert = kwargs.pop('cert', None)
++		self.verify = kwargs.pop('verify', True)
++		self.cookiejar = cookielib.CookieJar()
++		# super won't work because not using new style class
++		HttpAuthenticated.__init__(self, **kwargs)
++
++	def send(self, request):
++		self.addcredentials(request)
++		resp = requests.post(request.url, data = request.message, headers = request.headers, cert = self.cert, verify = self.verify, cookies = self.cookiejar)
++		result = Reply(resp.status_code, resp.headers, resp.content)
++		return result
++
+ def soap_login(options):
+ 	if options["-o"] in ["off", "reboot"]:
+ 		time.sleep(int(options["--delay"]))
+ 
+-	if options.has_key("--ssl"):
++	if options.has_key("--ssl") or options.has_key("--ssl-secure") or options.has_key("--ssl-insecure"):
++		if options.has_key("--ssl-insecure"):
++			verify = False
++		else:
++			verify = True
+ 		url = "https://"
+ 	else:
++		verify = False
+ 		url = "http://"
+ 	
+ 	url += options["--ip"] + ":" + str(options["--ipport"]) + "/sdk"
+@@ -28,10 +51,10 @@ def soap_login(options):
+ 	tmp_dir = tempfile.mkdtemp()
+ 	tempfile.tempdir = tmp_dir
+ 	atexit.register(remove_tmp_dir, tmp_dir)
+-	
++
+ 	try:
+-		conn = Client(url + "/vimService.wsdl")
+-		conn.set_options(location = url)
++		headers = {"Content-Type" : "text/xml;charset=UTF-8", "SOAPAction" : ""}
++		conn = Client(url + "/vimService.wsdl", location = url, transport = RequestsTransport(verify = verify), headers = headers)
+ 
+ 		mo_ServiceInstance = Property('ServiceInstance')
+ 		mo_ServiceInstance._type = 'ServiceInstance'
+@@ -40,6 +63,8 @@ def soap_login(options):
+ 		mo_SessionManager._type = 'SessionManager'
+ 
+ 		SessionManager = conn.service.Login(mo_SessionManager, options["--username"], options["--password"])
++	except requests.exceptions.SSLError, ex:
++		fail_usage("Server side certificate verification failed")
+ 	except Exception, ex:
+ 		fail(EC_LOGIN_DENIED)	
+ 
+@@ -199,6 +224,11 @@ Alternatively you can always use UUID to
+ 	docs["vendorurl"] = "http://www.vmware.com"
+ 	show_docs(options, docs)
+ 
++
++	logging.basicConfig(level=logging.INFO)
++	logging.getLogger('suds.client').setLevel(logging.CRITICAL)
++	logging.getLogger("requests").setLevel(logging.CRITICAL)
++
+ 	##
+ 	## Operate the fencing device
+ 	####
diff -Nru fence-agents-4.0.7.1/debian/patches/series fence-agents-4.0.7.1/debian/patches/series
--- fence-agents-4.0.7.1/debian/patches/series	2013-03-21 09:28:38.000000000 +0100
+++ fence-agents-4.0.7.1/debian/patches/series	2014-11-16 14:27:59.000000000 +0100
@@ -0,0 +1 @@
+0001-verify-ssl-certificate.diff
diff -Nru fence-agents-4.0.7.1/debian/.pc/.quilt_patches fence-agents-4.0.7.1/debian/.pc/.quilt_patches
--- fence-agents-4.0.7.1/debian/.pc/.quilt_patches	1970-01-01 01:00:00.000000000 +0100
+++ fence-agents-4.0.7.1/debian/.pc/.quilt_patches	2014-11-16 14:28:14.000000000 +0100
@@ -0,0 +1 @@
+patches
diff -Nru fence-agents-4.0.7.1/debian/.pc/.quilt_series fence-agents-4.0.7.1/debian/.pc/.quilt_series
--- fence-agents-4.0.7.1/debian/.pc/.quilt_series	1970-01-01 01:00:00.000000000 +0100
+++ fence-agents-4.0.7.1/debian/.pc/.quilt_series	2014-11-16 14:28:14.000000000 +0100
@@ -0,0 +1 @@
+series
diff -Nru fence-agents-4.0.7.1/debian/.pc/.version fence-agents-4.0.7.1/debian/.pc/.version
--- fence-agents-4.0.7.1/debian/.pc/.version	1970-01-01 01:00:00.000000000 +0100
+++ fence-agents-4.0.7.1/debian/.pc/.version	2014-11-16 14:28:14.000000000 +0100
@@ -0,0 +1 @@
+2


More information about the Pkg-libvirt-maintainers mailing list