Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: pu

Hi,

As agreed with the security team and the current maintainer, we’d like
to include this security fix via the upcoming point release, because the
package has a low popcon and requires a very unusual configuration to
trigger the flaw (but with such a configuration, it completely
undermines the security model perspectives attempts to provide).

The proposed update aim to fix the issue disclosed recently on the
upstream project website [1] and the upstream bug tracker [2].

1: 
http://perspectives-project.org/2013/09/19/security-alert-incorrect-quorum-with-low-number-of-notaries-andor-low-quorum-percentage/
2: https://github.com/danwent/Perspectives/issues/87

The two upstream commits to fix this issue (cb3d991 and 1f85a52) apply
properly into stable once fe6551e is also applied, thus the three
patches.

Regards

David

P.-S.: The fix “already” made it to Jessie.

-- System Information:
Debian Release: 7.1
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'proposed-updates'), (500, 
'stable'), (150, 'testing'), (120, 'unstable'), (110, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 3.2.0-4-amd64 (SMP w/2 CPU cores)
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
diff -Nru perspectives-extension-4.3.1/debian/changelog perspectives-extension-4.3.1/debian/changelog
--- perspectives-extension-4.3.1/debian/changelog	2012-06-28 16:45:35.000000000 -0400
+++ perspectives-extension-4.3.1/debian/changelog	2013-09-26 19:47:24.000000000 -0400
@@ -1,3 +1,11 @@
+perspectives-extension (4.3.1-1+deb7u1) wheezy; urgency=low
+
+  * Backport security fix from 4.3.6.
+    Incorrect quorum length with low number of notaries and/or low quorum
+    percentage.
+
+ -- David Prévot <taf...@debian.org>  Thu, 26 Sep 2013 19:25:32 -0400
+
 perspectives-extension (4.3.1-1) unstable; urgency=low
 
   * New upstream version.
diff -Nru perspectives-extension-4.3.1/debian/patches/0001-Pers_client_policy-Add-checks-against-quorum-size-0.patch perspectives-extension-4.3.1/debian/patches/0001-Pers_client_policy-Add-checks-against-quorum-size-0.patch
--- perspectives-extension-4.3.1/debian/patches/0001-Pers_client_policy-Add-checks-against-quorum-size-0.patch	1969-12-31 20:00:00.000000000 -0400
+++ perspectives-extension-4.3.1/debian/patches/0001-Pers_client_policy-Add-checks-against-quorum-size-0.patch	2013-09-26 19:23:54.000000000 -0400
@@ -0,0 +1,50 @@
+From: Dave Schaefer <dave.schae...@gmail.com>
+Date: Wed, 18 Sep 2013 21:26:48 -0600
+Subject: Pers_client_policy - Add checks against quorum size 0
+
+We should never return true nor report any duration for sizes < 1.
+
+Origin: upstream, https://github.com/danwent/Perspectives/commit/cb3d9913217afb0973281275cd4269ed0c1acc2c
+Bug: https://github.com/danwent/Perspectives/issues/87
+---
+ plugin/chrome/content/client_policy.js | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/plugin/chrome/content/client_policy.js b/plugin/chrome/content/client_policy.js
+index fd74f43..72f31c6 100644
+--- a/plugin/chrome/content/client_policy.js
++++ b/plugin/chrome/content/client_policy.js
+@@ -119,6 +119,10 @@ get_all_key_changes : function(results) {
+ } , 
+ 
+ check_current_consistency : function(test_key,results,quorum_size,stale_limit_secs,cur_time) {
++	if (quorum_size < 1) {
++		Pers_debug.d_print("error", "ERROR: quorum size cannot be less than 1.");
++		return false;
++	}
+   	//get_all_key_changes(results); 
+ 	var num_valid = Pers_client_policy.get_num_valid_notaries(test_key,results,stale_limit_secs,cur_time);
+ 	Pers_debug.d_print("policy", 
+@@ -127,6 +131,10 @@ check_current_consistency : function(test_key,results,quorum_size,stale_limit_se
+ }, 
+ 
+ has_quorum_at_time : function(test_key, results, quorum_size, time) {
++	if (quorum_size < 1) {
++		Pers_debug.d_print("error", "ERROR: quorum size cannot be less than 1.");
++		return false;
++	}
+ 	Pers_debug.d_print("policy", "testing quorum for time " + time + 
+ 			" and key: " + test_key); 
+ 	var total_valid = 0; 
+@@ -156,6 +164,11 @@ has_quorum_at_time : function(test_key, results, quorum_size, time) {
+ // returns duration in seconds - i.e. days * 24 * 3600.
+ get_quorum_duration : function(test_key, results, quorum_size, stale_limit_secs, unixtime) { 
+ 
++	if (quorum_size < 1) {
++		Pers_debug.d_print("error", "ERROR: quorum size cannot be less than 1.");
++		return false;
++	}
++
+ 	if(! Pers_client_policy.check_current_consistency(test_key,results,quorum_size,
+ 					stale_limit_secs,unixtime)) { 
+ 		Pers_debug.d_print("policy","current_consistency_failed"); 
diff -Nru perspectives-extension-4.3.1/debian/patches/0002-Perspectives-Move-quorum-calculation-to-its-own-func.patch perspectives-extension-4.3.1/debian/patches/0002-Perspectives-Move-quorum-calculation-to-its-own-func.patch
--- perspectives-extension-4.3.1/debian/patches/0002-Perspectives-Move-quorum-calculation-to-its-own-func.patch	1969-12-31 20:00:00.000000000 -0400
+++ perspectives-extension-4.3.1/debian/patches/0002-Perspectives-Move-quorum-calculation-to-its-own-func.patch	2013-09-26 19:23:54.000000000 -0400
@@ -0,0 +1,43 @@
+From: Dave Schaefer <dave.schae...@gmail.com>
+Date: Sat, 21 Jul 2012 13:04:45 -0700
+Subject: Perspectives - Move quorum calculation to its own function
+
+This is in anticipation of writing code that will also call the function.
+Let's separate some functionality to make things more object-oriented
+and easier to use.
+
+Origin: upstream, https://github.com/danwent/Perspectives/commit/fe6551ee7d26829bf69d00f49579fc1be48f42a8
+---
+ plugin/chrome/content/notaries.js | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/plugin/chrome/content/notaries.js b/plugin/chrome/content/notaries.js
+index 2bdecb6..cb12d61 100644
+--- a/plugin/chrome/content/notaries.js
++++ b/plugin/chrome/content/notaries.js
+@@ -391,6 +391,14 @@ var Perspectives = {
+ 		}  
+ 	},  
+ 
++	// return the quorum as an integer
++	// e.g. useful for comparing against the number of results
++	getQuorumAsInt: function() {
++		var q_thresh = Perspectives.root_prefs.
++				getIntPref("perspectives.quorum_thresh") / 100;
++		return Math.round(this.all_notaries.length * q_thresh);
++	},
++
+ 	notaryQueriesComplete: function(ti) {
+ 		try {
+ 			if(Perspectives.strbundle == null) {
+@@ -404,9 +412,7 @@ var Perspectives = {
+ 			var test_key = ti.cert.md5Fingerprint.toLowerCase();
+ 			// 2 days (FIXME: make this a pref)
+ 			var max_stale_sec = 2 * 24 * 3600; 
+-			var q_thresh = Perspectives.root_prefs.
+-						getIntPref("perspectives.quorum_thresh") / 100;
+-			var q_required = Math.round(this.all_notaries.length * q_thresh);
++			var q_required = Perspectives.getQuorumAsInt();
+ 			var unixtime = Pers_util.get_unix_time(); 
+ 			var quorum_duration = Pers_client_policy.get_quorum_duration(test_key, 
+ 					server_result_list, q_required, max_stale_sec,unixtime);  
diff -Nru perspectives-extension-4.3.1/debian/patches/0003-Perspectives-Add-min-and-max-bounds-on-getQuorumAsIn.patch perspectives-extension-4.3.1/debian/patches/0003-Perspectives-Add-min-and-max-bounds-on-getQuorumAsIn.patch
--- perspectives-extension-4.3.1/debian/patches/0003-Perspectives-Add-min-and-max-bounds-on-getQuorumAsIn.patch	1969-12-31 20:00:00.000000000 -0400
+++ perspectives-extension-4.3.1/debian/patches/0003-Perspectives-Add-min-and-max-bounds-on-getQuorumAsIn.patch	2013-09-26 19:23:54.000000000 -0400
@@ -0,0 +1,40 @@
+From: Dave Schaefer <dave.schae...@gmail.com>
+Date: Wed, 18 Sep 2013 21:30:00 -0600
+Subject: Perspectives - Add min and max bounds on getQuorumAsInt()
+
+These were somewhat enforced in the UI, but we need to also
+enforce them here in case the user picks a really low value.
+
+Origin: upstream, https://github.com/danwent/Perspectives/commit/1f85a52364d59199babfb0d55ea48a38ce0e32ae
+Bug: https://github.com/danwent/Perspectives/issues/87
+---
+ plugin/chrome/content/notaries.js | 14 +++++++++++++-
+ 1 file changed, 13 insertions(+), 1 deletion(-)
+
+diff --git a/plugin/chrome/content/notaries.js b/plugin/chrome/content/notaries.js
+index cb12d61..cc9ba28 100644
+--- a/plugin/chrome/content/notaries.js
++++ b/plugin/chrome/content/notaries.js
+@@ -394,9 +394,21 @@ var Perspectives = {
+ 	// return the quorum as an integer
+ 	// e.g. useful for comparing against the number of results
+ 	getQuorumAsInt: function() {
++		var MIN_NOTARY_COUNT = 1;
++		//FIXME: we can cache the value inside getNotaryList() if calling is too slow.
++		var notary_count = this.getNotaryList().length;
+ 		var q_thresh = Perspectives.root_prefs.
+ 				getIntPref("perspectives.quorum_thresh") / 100;
+-		return Math.round(this.all_notaries.length * q_thresh);
++		var q_count = Math.round(notary_count * q_thresh);
++
++		if (q_count < MIN_NOTARY_COUNT) {
++			q_count = MIN_NOTARY_COUNT;
++		}
++		else if (q_count > notary_count) {
++			q_count = notary_count;
++		}
++
++		return q_count;
+ 	},
+ 
+ 	notaryQueriesComplete: function(ti) {
diff -Nru perspectives-extension-4.3.1/debian/patches/series perspectives-extension-4.3.1/debian/patches/series
--- perspectives-extension-4.3.1/debian/patches/series	1969-12-31 20:00:00.000000000 -0400
+++ perspectives-extension-4.3.1/debian/patches/series	2013-09-26 19:23:54.000000000 -0400
@@ -0,0 +1,3 @@
+0001-Pers_client_policy-Add-checks-against-quorum-size-0.patch
+0002-Perspectives-Move-quorum-calculation-to-its-own-func.patch
+0003-Perspectives-Add-min-and-max-bounds-on-getQuorumAsIn.patch

Reply via email to