Page MenuHome GnuPG - static

Confirmation dialog for remote access (restricted extra socket)
Closed, ResolvedPublic

Description

It would be good if we have confirmation popup for remote access to key.

Event Timeline

I'm testing:

diff --git a/agent/findkey.c b/agent/findkey.c
index fa9e5b548..eec85ba67 100644
--- a/agent/findkey.c
+++ b/agent/findkey.c
@@ -996,7 +996,10 @@ agent_key_from_file (ctrl_t ctrl, const char *cache_nonce,
   if (r_passphrase)
     *r_passphrase = NULL;
 
-  err = read_key_file (grip, &s_skey, &keymeta);
+  if (!grip && !ctrl->have_keygrip)
+    return gpg_error (GPG_ERR_NO_SECKEY);
+
+  err = read_key_file (grip? grip : ctrl->keygrip, &s_skey, &keymeta);
   if (err)
     {
       if (gpg_err_code (err) == GPG_ERR_ENOENT)
@@ -1004,6 +1007,39 @@ agent_key_from_file (ctrl_t ctrl, const char *cache_nonce,
       return err;
     }
 
+  if (ctrl->restricted && !grip)
+    {
+      char hexgrip[40+4+1];
+      char *prompt;
+      char *comment_buffer = NULL;
+      const char *comment = NULL;
+
+      bin2hex (ctrl->keygrip, 20, hexgrip);
+
+      if (keymeta && (comment = nvc_get_string (keymeta, "Label:")))
+        {
+          if (strchr (comment, '\n')
+              && (comment_buffer = linefeed_to_percent0A (comment)))
+            comment = comment_buffer;
+        }
+
+      prompt = xtryasprintf (L_("Remote process requested the use of key%%0A"
+                                "  %s%%0A"
+                                "  (%s)%%0A"
+                                "Do you want to allow this?"),
+                             hexgrip, comment? comment:"");
+
+      gcry_free (comment_buffer);
+
+      err = agent_get_confirmation (ctrl, prompt,
+                                    L_("Allow"), L_("Deny"), 0);
+      xfree (prompt);
+
+      if (err)
+        return err;
+    }
+
+
   /* For use with the protection functions we also need the key as an
      canonical encoded S-expression in a buffer.  Create this buffer
      now.  */
@@ -1078,8 +1114,9 @@ agent_key_from_file (ctrl_t ctrl, const char *cache_nonce,
 
 	if (!err)
 	  {
-	    err = unprotect (ctrl, cache_nonce, desc_text_final, &buf, grip,
-                            cache_mode, lookup_ttl, r_passphrase);
+            err = unprotect (ctrl, cache_nonce, desc_text_final, &buf,
+                             grip? grip : ctrl->keygrip,
+                             cache_mode, lookup_ttl, r_passphrase);
 	    if (err)
 	      log_error ("failed to unprotect the secret key: %s\n",
 			 gpg_strerror (err));
diff --git a/agent/pkdecrypt.c b/agent/pkdecrypt.c
index ec23daf83..adb08a956 100644
--- a/agent/pkdecrypt.c
+++ b/agent/pkdecrypt.c
@@ -67,7 +67,7 @@ agent_pkdecrypt (ctrl_t ctrl, const char *desc_text,
       log_printhex (ciphertext, ciphertextlen, "cipher: ");
     }
   rc = agent_key_from_file (ctrl, NULL, desc_text,
-                            ctrl->keygrip, &shadow_info,
+                            NULL, &shadow_info,
                             CACHE_MODE_NORMAL, NULL, &s_skey, NULL);
   if (rc)
     {
diff --git a/agent/pksign.c b/agent/pksign.c
index c94c1a197..7046f4545 100644
--- a/agent/pksign.c
+++ b/agent/pksign.c
@@ -314,7 +314,7 @@ agent_pksign_do (ctrl_t ctrl, const char *cache_nonce,
   if (!ctrl->have_keygrip)
     return gpg_error (GPG_ERR_NO_SECKEY);
 
-  err = agent_key_from_file (ctrl, cache_nonce, desc_text, ctrl->keygrip,
+  err = agent_key_from_file (ctrl, cache_nonce, desc_text, NULL,
                              &shadow_info, cache_mode, lookup_ttl,
                              &s_skey, NULL);
   if (gpg_err_code (err) == GPG_ERR_NO_SECKEY)

Part 2 patch is pushed, with a bit of change.
A user needs to specify "Confirm" flag in the key file.

gniibe removed a project: Restricted Project.

It's in 2.3.7.