]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
bugfix#573 ldns-keygen write private mode 0600
authorWillem Toorop <willem@nlnetlabs.nl>
Mon, 5 May 2014 20:46:08 +0000 (22:46 +0200)
committerWillem Toorop <willem@nlnetlabs.nl>
Mon, 5 May 2014 20:46:08 +0000 (22:46 +0200)
Changelog
examples/ldns-keygen.c

index 5491fc2996b481bb820aba3fc76b1d598abd05c4..cabf154c4456efb28a4276aae12fd51e7f6faf84 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -11,6 +11,8 @@ TBD
        * bugfix #562: ldns-keygen match DSA key maximum size with library.
          And check keysizes with all algorithms. Thanks Peter Koch.
        * ldns-verify-zone accepts only one single zonefile as argument.
+       * bugfix #573: ldns-keygen write private keys with mode 0600.
+         Thanks Leon Weber
 
 1.6.17 2014-01-10
        * Fix ldns_dnssec_zone_new_frm_fp_l to allow the last parsed line of a
index 1b8a00af18560ee5afe880b391a059580912ddb2..93a1ee737c1ba1461837f1734f745d61bbeb858a 100644 (file)
@@ -10,6 +10,9 @@
 
 #include <ldns/ldns.h>
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 #include <errno.h>
 
 #ifdef HAVE_SSL
@@ -48,6 +51,7 @@ int
 main(int argc, char *argv[])
 {
        int c;
+       int fd;
        char *prog;
 
        /* default key size */
@@ -254,21 +258,21 @@ main(int argc, char *argv[])
        /* print the priv key to stderr */
        filename = LDNS_XMALLOC(char, strlen(owner) + 21);
        snprintf(filename, strlen(owner) + 20, "K%s+%03u+%05u.private", owner, algorithm, (unsigned int) ldns_key_keytag(key));
-       file = fopen(filename, "w");
+       /* use open() here to prevent creating world-readable private keys (CVE-2014-3209)*/
+       fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
+       if (fd < 0) {
+               goto fail;
+       }
+
+       file = fdopen(fd, "w");
        if (!file) {
-               fprintf(stderr, "Unable to open %s: %s\n", filename, strerror(errno));
-               ldns_key_deep_free(key);
-               free(owner);
-               ldns_rr_free(pubkey);
-               ldns_rr_free(ds);
-               LDNS_FREE(filename);
-               exit(EXIT_FAILURE);
-       } else {
-               ldns_key_print(file, key);
-               fclose(file);
-               LDNS_FREE(filename);
+               goto fail;
        }
 
+       ldns_key_print(file, key);
+       fclose(file);
+       LDNS_FREE(filename);
+
        /* print the DS to .ds */
        if (algorithm != LDNS_SIGN_HMACMD5 &&
                algorithm != LDNS_SIGN_HMACSHA1 &&
@@ -300,6 +304,15 @@ main(int argc, char *argv[])
        ldns_rr_free(pubkey);
        ldns_rr_free(ds);
        exit(EXIT_SUCCESS);
+
+fail:
+       fprintf(stderr, "Unable to open %s: %s\n", filename, strerror(errno));
+       ldns_key_deep_free(key);
+       free(owner);
+       ldns_rr_free(pubkey);
+       ldns_rr_free(ds);
+       LDNS_FREE(filename);
+       exit(EXIT_FAILURE);
 }
 #else
 int