]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Prevent ddns-confgen self-domain update-policy injection 12409/head
authorMark Andrews <marka@isc.org>
Wed, 15 Jul 2026 07:53:22 +0000 (17:53 +1000)
committerEvan Hunt <each@isc.org>
Thu, 23 Jul 2026 17:50:27 +0000 (10:50 -0700)
In ddns-confgen, the user-supplied domain name to be updated
was not properly escaped and put inside a double quoted string
when generating the example code fragment.  This has been corrected.

bin/confgen/tsig-keygen.c

index 88acff9e09616ee0254672626a01f28fd3bfca68..fc278214bc7dcb5fe97ddbd8a3b5f01d473702c3 100644 (file)
@@ -85,6 +85,8 @@ main(int argc, char **argv) {
        isc_buffer_t key_txtbuffer;
        char key_txtsecret[256];
        char namebuf[DNS_NAME_FORMATSIZE];
+       char selfbuf[DNS_NAME_FORMATSIZE];
+       char zonebuf[DNS_NAME_FORMATSIZE];
        const char *keyname = NULL;
        const char *zone = NULL;
        const char *self_domain = NULL;
@@ -216,6 +218,19 @@ main(int argc, char **argv) {
 
        makesafe_keyname(keyname, namebuf, sizeof(namebuf), &wildcard);
 
+       /*
+        * If -s or -z is in use, it's fine to overwrite wildcard, because
+        * those are the ones we'd be using as the update-policy identity.
+        */
+       if (self_domain != NULL) {
+               makesafe_keyname(self_domain, selfbuf, sizeof(selfbuf),
+                                &wildcard);
+               self_domain = selfbuf;
+       } else if (zone != NULL) {
+               makesafe_keyname(zone, zonebuf, sizeof(zonebuf), &wildcard);
+               zone = zonebuf;
+       }
+
        isc_buffer_init(&key_txtbuffer, &key_txtsecret, sizeof(key_txtsecret));
 
        generate_key(isc_g_mctx, alg, keysize, &key_txtbuffer);
@@ -237,7 +252,10 @@ key \"%s\" {\n\
 
        if (wildcard && !quiet) {
                printf("\n\
-# This is a wildcard key, and should not be used in an update-policy.\n");
+# \"%s\" is a wildcard key, and should not be used in an update-policy.\n",
+                      zone != NULL
+                              ? zone
+                              : (self_domain != NULL ? self_domain : namebuf));
        } else if (!quiet) {
                if (self_domain != NULL) {
                        printf("\n\
@@ -245,7 +263,7 @@ key \"%s\" {\n\
 # name \"%s\", place an \"update-policy\" statement\n\
 # like this one, adjusted as needed for your preferred permissions:\n\
 update-policy {\n\
-         grant %s name %s ANY;\n\
+         grant \"%s\" name \"%s\" ANY;\n\
 };\n",
                               self_domain, namebuf, self_domain);
                } else if (zone != NULL) {
@@ -254,7 +272,7 @@ update-policy {\n\
 # place an \"update-policy\" statement like this one, adjusted as \n\
 # needed for your preferred permissions:\n\
 update-policy {\n\
-         grant %s zonesub ANY;\n\
+         grant \"%s\" zonesub ANY;\n\
 };\n",
                               zone, namebuf);
                } else {
@@ -264,7 +282,7 @@ update-policy {\n\
 # to this key.  For example, the following statement grants this key\n\
 # permission to update any name within the zone:\n\
 update-policy {\n\
-       grant %s zonesub ANY;\n\
+       grant \"%s\" zonesub ANY;\n\
 };\n",
                               namebuf);
                }