Hi tech@,

After we are done with sensitive data (such as passwords) on readpassphrase(3)
we should dispose it with explicit_bzero(3), nevertheless some base
applications still rely either on bzero(3), memset(3), or something else
entirely.

Please find a diff below to change it to explicit_bzero(3). At least for
init(8) I recall having discussed this with tb@ aeons ago and it's a little bit
paranoid since it only occurs during single user, but we should give the
example anyway.

Thoughts? Am I missing somethings? Most likely yes...

Best regards
mestre

Index: sbin/init/init.c
===================================================================
RCS file: /cvs/src/sbin/init/init.c,v
retrieving revision 1.63
diff -u -p -u -r1.63 init.c
--- sbin/init/init.c    2 Mar 2017 10:38:09 -0000       1.63
+++ sbin/init/init.c    4 Apr 2017 08:50:53 -0000
@@ -561,12 +561,13 @@ f_single_user(void)
                        write(STDERR_FILENO, banner, sizeof banner - 1);
                        for (;;) {
                                int ok = 0;
-                               clear = readpassphrase("Password:", pbuf, 
sizeof(pbuf), RPP_ECHO_OFF);
+                               clear = readpassphrase("Password:", pbuf,
+                                   sizeof(pbuf), RPP_ECHO_OFF);
                                if (clear == NULL || *clear == '\0')
                                        _exit(0);
                                if (crypt_checkpass(clear, pp->pw_passwd) == 0)
                                        ok = 1;
-                               memset(clear, 0, strlen(clear));
+                               explicit_bzero(clear, strlen(clear));
                                if (ok)
                                        break;
                                warning("single-user login failed\n");
Index: usr.bin/encrypt/encrypt.c
===================================================================
RCS file: /cvs/src/usr.bin/encrypt/encrypt.c,v
retrieving revision 1.45
diff -u -p -u -r1.45 encrypt.c
--- usr.bin/encrypt/encrypt.c   4 Sep 2016 15:36:13 -0000       1.45
+++ usr.bin/encrypt/encrypt.c   4 Apr 2017 08:51:00 -0000
@@ -134,6 +134,7 @@ main(int argc, char **argv)
                                err(1, "readpassphrase");
                        print_passwd(string, operation, extra);
                        (void)fputc('\n', stdout);
+                       explicit_bzero(string, sizeof(string));
                } else {
                        size_t len;
                        /* Encrypt stdin to stdout. */
Index: usr.bin/lock/lock.c
===================================================================
RCS file: /cvs/src/usr.bin/lock/lock.c,v
retrieving revision 1.33
diff -u -p -u -r1.33 lock.c
--- usr.bin/lock/lock.c 28 May 2016 16:11:10 -0000      1.33
+++ usr.bin/lock/lock.c 4 Apr 2017 08:51:00 -0000
@@ -162,7 +162,7 @@ main(int argc, char *argv[])
                        warnx("\apasswords didn't match.");
                        exit(1);
                }
-               s[0] = '\0';
+               explicit_bzero(s, sizeof(s));
        }
 
        /* set signal handlers */
@@ -205,10 +205,16 @@ main(int argc, char *argv[])
                                p = NULL;
                        else
                                p = s;
-                       if (auth_userokay(pw->pw_name, nstyle, "auth-lock", p))
+                       if (auth_userokay(pw->pw_name, nstyle, "auth-lock",
+                           p)) {
+                               explicit_bzero(s, sizeof(s));
                                break;
-               } else if (strcmp(s, s1) == 0)
+                       }
+               } else if (strcmp(s, s1) == 0) {
+                       explicit_bzero(s, sizeof(s));
+                       explicit_bzero(s1, sizeof(s1));
                        break;
+               }
                (void)putc('\a', stderr);
                cnt %= tries;
                if (++cnt > backoff) {
Index: usr.bin/nc/socks.c
===================================================================
RCS file: /cvs/src/usr.bin/nc/socks.c,v
retrieving revision 1.24
diff -u -p -u -r1.24 socks.c
--- usr.bin/nc/socks.c  27 Jun 2016 14:43:04 -0000      1.24
+++ usr.bin/nc/socks.c  4 Apr 2017 08:51:01 -0000
@@ -350,10 +350,13 @@ socks_connect(const char *host, const ch
                        proxypass = getproxypass(proxyuser, proxyhost);
                        r = snprintf(buf, sizeof(buf), "%s:%s",
                            proxyuser, proxypass);
+                       explicit_bzero(proxypass, sizeof(proxypass));
                        if (r == -1 || (size_t)r >= sizeof(buf) ||
                            b64_ntop(buf, strlen(buf), resp,
-                           sizeof(resp)) == -1)
+                           sizeof(resp)) == -1) {
+                               explicit_bzero(r, sizeof(r));
                                errx(1, "Proxy username/password too long");
+                       }
                        r = snprintf(buf, sizeof(buf), "Proxy-Authorization: "
                            "Basic %s\r\n", resp);
                        if (r == -1 || (size_t)r >= sizeof(buf))
Index: usr.bin/skey/skey.c
===================================================================
RCS file: /cvs/src/usr.bin/skey/skey.c,v
retrieving revision 1.33
diff -u -p -u -r1.33 skey.c
--- usr.bin/skey/skey.c 1 Dec 2015 00:00:19 -0000       1.33
+++ usr.bin/skey/skey.c 4 Apr 2017 08:51:01 -0000
@@ -122,8 +122,12 @@ main(int argc, char *argv[])
                exit(1);
 
        /* Crunch seed and passphrase into starting key */
-       if (keycrunch(key, seed, passwd) != 0)
+       if (keycrunch(key, seed, passwd) != 0) {
+               explicit_bzero(passwd, sizeof(passwd));
                errx(1, "key crunch failed");
+       }
+
+       explicit_bzero(passwd, sizeof(passwd));
 
        if (cnt == 1) {
                while (n-- != 0)
Index: usr.bin/x99token/x99token.c
===================================================================
RCS file: /cvs/src/usr.bin/x99token/x99token.c,v
retrieving revision 1.12
diff -u -p -u -r1.12 x99token.c
--- usr.bin/x99token/x99token.c 15 Oct 2015 19:30:03 -0000      1.12
+++ usr.bin/x99token/x99token.c 4 Apr 2017 08:51:02 -0000
@@ -169,8 +169,8 @@ main(int argc, char **argv)
 
        predict(ks, buf, cnt);
 
-       memset(&ks, 0, sizeof(ks));
-       memset(buf, 0, sizeof(buf));
+       explicit_bzero(&ks, sizeof(ks));
+       explicit_bzero(buf, sizeof(buf));
 
        exit(0);
 }
Index: usr.sbin/tokeninit/tokeninit.c
===================================================================
RCS file: /cvs/src/usr.sbin/tokeninit/tokeninit.c,v
retrieving revision 1.12
diff -u -p -u -r1.12 tokeninit.c
--- usr.sbin/tokeninit/tokeninit.c      22 Mar 2016 00:06:55 -0000      1.12
+++ usr.sbin/tokeninit/tokeninit.c      4 Apr 2017 08:51:04 -0000
@@ -149,7 +149,7 @@ main(int argc, char **argv)
                                    tt->name);
                                exit(1);
                        }
-                       memset(secret, 0, sizeof(secret));
+                       explicit_bzero(secret, sizeof(secret));
                        if (parse_secret(hexformat, seed, secret)) {
                                fprintf(stderr,
                                    "%sinit: Invalid secret entered.\n",

Reply via email to