all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Jens Lechtenboerger <jens.lechtenboerger@fsfe.org>
To: Lars Ingebrigtsen <larsi@gnus.org>
Cc: 18718@debbugs.gnu.org
Subject: bug#18718: Encrypted messages expose Bcc identities
Date: Sun, 27 Dec 2015 16:51:40 +0100	[thread overview]
Message-ID: <8760zjyjn7.fsf@informationelle-selbstbestimmung-im-internet.de> (raw)
In-Reply-To: <8737uoq4gj.fsf@gnus.org> (Lars Ingebrigtsen's message of "Sat, 26 Dec 2015 22:34:36 +0100")

[-- Attachment #1: Type: text/plain, Size: 1362 bytes --]

On 2015-12-26, at 22:34, Lars Ingebrigtsen wrote:

> Jens Lechtenboerger <jens.lechtenboerger@fsfe.org> writes:
>
>> 4. Send an encrypted e-mail to yourself, with one To address and one
>>    Bcc address.  Read the mail received under the To address, where
>>    you should not be able to identify the Bcc recipient.
>>    Note that buffer *epg-debug* mentions that the message was
>>    encrypted to two keys (including both key IDs and e-mail
>>    addresses).  The Bcc recipient is clearly visible.
>
> [...]
>
>> On 2014-09-21 I posted some suggestions to the ding mailing list
>> concerning my package DefaultEncrypt, which contains a workaround.
>
> Would it be possible for you to create a patch for this against the
> version of Message in 25.1?

A patch is attached.  The new function mml-secure-bcc-is-safe does
nothing on its own but can be added to message-send-hook or called
from message-send and friends.

Concerning documentation: I’m currently involved in a refactoring
effort for encryption related functionality, which takes place in
the Gnus git under branch mml-refactoring.  There, Message
documentation is already extended with a section “Bcc Warning” which
could be extended.

(Also, gnus-subsetp, which is part of this patch, is already present
in the branch mml-refactoring.)

Best wishes
Jens


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Identify-unsafe-combinations-of-Bcc-and-encryption.patch --]
[-- Type: text/x-diff, Size: 4308 bytes --]

From f9fb01a6b013963e0d8021b5da587cc548c1ea9a Mon Sep 17 00:00:00 2001
From: Jens Lechtenboerger <jens.lechtenboerger@fsfe.org>
Date: Sun, 27 Dec 2015 16:29:02 +0100
Subject: [PATCH] Identify unsafe combinations of Bcc and encryption

---
 ChangeLog.2            |  8 ++++++++
 lisp/gnus/gnus-util.el | 10 ++++++++++
 lisp/gnus/mml-sec.el   | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 64 insertions(+)

diff --git a/ChangeLog.2 b/ChangeLog.2
index 6d72663..971a3b5 100644
--- a/ChangeLog.2
+++ b/ChangeLog.2
@@ -1,3 +1,11 @@
+2015-12-27  Jens Lechtenboerger  <jens.lechtenboerger@fsfe.org>
+
+	Identify unsafe combinations of Bcc and encryption
+
+	* lisp/gnus/gnus-util.el (gnus-subsetp): New function
+	* lisp/gnus/mml-sec.el (mml-secure-safe-bcc-list): New variable
+	* lisp/gnus/mml-sec.el (mml-secure-bcc-is-safe): New function
+
 2015-12-27  Lars Ingebrigtsen  <larsi@gnus.org>
 
 	* shr.el (shr-descend): Allow using lambdas in external functions.
diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el
index 40e2dcf..933387d 100644
--- a/lisp/gnus/gnus-util.el
+++ b/lisp/gnus/gnus-util.el
@@ -1989,6 +1989,16 @@ to case differences."
   (defun gnus-timer--function (timer)
     (elt timer 5)))
 
+(defun gnus-subsetp (list1 list2)
+  "Return t if LIST1 is a subset of LIST2.
+Similar to `subsetp' but use member for element test so that this works for
+lists of strings."
+  (when (and (listp list1) (listp list2))
+    (if list1
+	(and (member (car list1) list2)
+	     (gnus-subsetp (cdr list1) list2))
+      t)))
+
 (provide 'gnus-util)
 
 ;;; gnus-util.el ends here
diff --git a/lisp/gnus/mml-sec.el b/lisp/gnus/mml-sec.el
index 45da937..dbae280 100644
--- a/lisp/gnus/mml-sec.el
+++ b/lisp/gnus/mml-sec.el
@@ -122,6 +122,21 @@ Whether the passphrase is cached at all is controlled by
   :group 'message
   :type 'integer)
 
+(defcustom mml-secure-safe-bcc-list nil
+  "List of e-mail addresses that are safe to use in Bcc headers.
+EasyPG encrypts e-mails to Bcc addresses, and the encrypted e-mail
+by default identifies the used encryption keys, giving away the
+Bcc'ed identities.  Clearly, this contradicts the original goal of
+*blind* copies.
+For an academic paper explaining the problem, see URL
+`http://crypto.stanford.edu/portia/papers/bb-bcc.pdf'.
+Use this variable to specify e-mail addresses whose owners do not
+mind if they are identifiable as recipients.  This may be useful if
+you use Bcc headers to encrypt e-mails to yourself."
+  :version "25.1"
+  :group 'message
+  :type '(repeat string))
+
 ;;; Configuration/helper functions
 
 (defun mml-signencrypt-style (method &optional style)
@@ -272,6 +287,37 @@ Use METHOD if given.  Else use `mml-secure-method' or
   (interactive)
   (mml-secure-part "smime"))
 
+(defun mml-secure-is-encrypted-p ()
+  "Check whether secure encrypt tag is present."
+  (save-excursion
+    (goto-char (point-min))
+    (re-search-forward
+     (concat "^" (regexp-quote mail-header-separator) "\n"
+	     "<#secure[^>]+encrypt")
+     nil t)))
+
+(defun mml-secure-bcc-is-safe ()
+  "Check whether usage of Bcc is safe (or absent).
+Bcc usage is safe in two cases: first, if the current message does
+not contain an MML secure encrypt tag;
+second, if the Bcc addresses are a subset of `mml-secure-safe-bcc-list'.
+In all other cases, ask the user whether Bcc usage is safe.
+Raise error if user answers no.
+Note that this function does not produce a meaningful return value:
+either an error is raised or not."
+  (when (mml-secure-is-encrypted-p)
+    (let ((bcc (mail-strip-quoted-names (message-fetch-field "bcc"))))
+      (when bcc
+	;; Split recipients at "," boundary, omit empty strings (t),
+	;; and strip whitespace.
+	(let ((bcc-list (split-string hdr "," t "\\s-+")))
+	  (unless (gnus-subsetp bcc-list mml-secure-safe-bcc-list)
+	    (unless (yes-or-no-p "Message for encryption contains Bcc header.\
+  This may give away all Bcc'ed identities to all recipients.\
+  Are you sure that this is safe?\
+  (Customize `mml-secure-safe-bcc-list' to avoid this warning.) ")
+	      (error "Aborted"))))))))
+
 ;; defuns that add the proper <#secure ...> tag to the top of the message body
 (defun mml-secure-message (method &optional modesym)
   (let ((mode (prin1-to-string modesym))
-- 
1.9.1


  reply	other threads:[~2015-12-27 15:51 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <878u4fd4zr.fsf@gnus.org>
     [not found] ` <86y4sitzcx.fsf@informationelle-selbstbestimmung-im-internet.de>
2015-12-26 21:34   ` bug#18718: Encrypted messages expose Bcc identities Lars Ingebrigtsen
2015-12-27 15:51     ` Jens Lechtenboerger [this message]
2015-12-27 17:59       ` Lars Ingebrigtsen
2015-12-27 18:20         ` Eli Zaretskii
2015-12-27 18:26       ` Lars Ingebrigtsen
2015-12-27 20:09         ` Jens Lechtenboerger
2015-12-27 20:13           ` Lars Ingebrigtsen
     [not found]   ` <handler.18718.C.145124724816035.notifdonectrl.0@debbugs.gnu.org>
2016-01-02 14:49     ` bug#18718: acknowledged by developer (control message for bug #18718) Jens Lechtenboerger
2016-01-03  9:08       ` Lars Magne Ingebrigtsen
2016-01-03 14:57         ` Jens Lechtenboerger
2016-01-04  0:57           ` Lars Magne Ingebrigtsen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8760zjyjn7.fsf@informationelle-selbstbestimmung-im-internet.de \
    --to=jens.lechtenboerger@fsfe.org \
    --cc=18718@debbugs.gnu.org \
    --cc=larsi@gnus.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.