]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Check opcode of messages returned by dns_request_getresponse
authorMark Andrews <marka@isc.org>
Fri, 11 Jun 2021 06:58:15 +0000 (16:58 +1000)
committerMark Andrews <marka@isc.org>
Wed, 21 Jul 2021 02:41:35 +0000 (12:41 +1000)
(cherry picked from commit ed4e00713fa52d361b2bbf0eeae80a6da7323255)

bin/nsupdate/nsupdate.c
lib/dns/zone.c

index 01ec51b5b90ccd17c0cb021ce44640f8f610a696..faf32635fe787e05b3adfcbcb12a96883ff69eff 100644 (file)
@@ -2441,6 +2441,10 @@ update_completed(isc_task_t *task, isc_event_t *event) {
                check_result(result, "dns_request_getresponse");
        }
 
+       if (answer->opcode != dns_opcode_update) {
+               fatal("invalid OPCODE in response to UPDATE request");
+       }
+
        if (answer->rcode != dns_rcode_noerror) {
                seenerror = true;
                if (!debugging) {
@@ -2633,6 +2637,10 @@ recvsoa(isc_task_t *task, isc_event_t *event) {
        if (debugging)
                show_message(stderr, rcvmsg, "Reply from SOA query:");
 
+       if (rcvmsg->opcode != dns_opcode_query) {
+               fatal("invalid OPCODE in response to SOA query");
+       }
+
        if (rcvmsg->rcode != dns_rcode_noerror &&
            rcvmsg->rcode != dns_rcode_nxdomain)
                fatal("response to SOA query was unsuccessful");
@@ -3103,6 +3111,10 @@ recvgss(isc_task_t *task, isc_event_t *event) {
                show_message(stderr, rcvmsg,
                             "recvmsg reply from GSS-TSIG query");
 
+       if (rcvmsg->opcode != dns_opcode_query) {
+               fatal("invalid OPCODE in response to GSS-TSIG query");
+       }
+
        if (rcvmsg->rcode == dns_rcode_formerr && !tried_other_gsstsig) {
                ddebug("recvgss trying %s GSS-TSIG",
                       use_win2k_gsstsig ? "Standard" : "Win2k");
index 4f7c2a773aa8bb20e4da11edae067c1d729022c4..c711f2e20b3df674051ad8feff89dee28b66943d 100644 (file)
@@ -56,6 +56,7 @@
 #include <dns/name.h>
 #include <dns/nsec.h>
 #include <dns/nsec3.h>
+#include <dns/opcode.h>
 #include <dns/peer.h>
 #include <dns/private.h>
 #include <dns/rcode.h>
@@ -11878,6 +11879,23 @@ stub_glue_response_cb(isc_task_t *task, isc_event_t *event) {
                goto cleanup;
        }
 
+       /*
+        * Unexpected opcode.
+        */
+       if (msg->opcode != dns_opcode_query) {
+               char opcode[128];
+               isc_buffer_t rb;
+
+               isc_buffer_init(&rb, opcode, sizeof(opcode));
+               (void)dns_opcode_totext(msg->rcode, &rb);
+
+               dns_zone_log(zone, ISC_LOG_INFO,
+                            "refreshing stub: "
+                            "unexpected opcode (%.*s) from %s (source %s)",
+                            (int)rb.used, opcode, master, source);
+               goto cleanup;
+       }
+
        /*
         * Unexpected rcode.
         */
@@ -12312,6 +12330,23 @@ stub_callback(isc_task_t *task, isc_event_t *event) {
        if (result != ISC_R_SUCCESS)
                goto next_master;
 
+       /*
+        * Unexpected opcode.
+        */
+       if (msg->opcode != dns_opcode_query) {
+               char opcode[128];
+               isc_buffer_t rb;
+
+               isc_buffer_init(&rb, opcode, sizeof(opcode));
+               (void)dns_opcode_totext(msg->rcode, &rb);
+
+               dns_zone_log(zone, ISC_LOG_INFO,
+                            "refreshing stub: "
+                            "unexpected opcode (%.*s) from %s (source %s)",
+                            (int)rb.used, opcode, master, source);
+               goto next_master;
+       }
+
        /*
         * Unexpected rcode.
         */
@@ -12677,6 +12712,23 @@ refresh_callback(isc_task_t *task, isc_event_t *event) {
                goto next_master;
        }
 
+       /*
+        * Unexpected opcode.
+        */
+       if (msg->opcode != dns_opcode_query) {
+               char opcode[128];
+               isc_buffer_t rb;
+
+               isc_buffer_init(&rb, opcode, sizeof(opcode));
+               (void)dns_opcode_totext(msg->rcode, &rb);
+
+               dns_zone_log(zone, ISC_LOG_INFO,
+                            "refresh: "
+                            "unexpected opcode (%.*s) from %s (source %s)",
+                            (int)rb.used, opcode, master, source);
+               goto next_master;
+       }
+
        /*
         * Unexpected rcode.
         */
@@ -16655,6 +16707,23 @@ forward_callback(isc_task_t *task, isc_event_t *event) {
        if (result != ISC_R_SUCCESS)
                goto next_master;
 
+       /*
+        * Unexpected opcode.
+        */
+       if (msg->opcode != dns_opcode_update) {
+               char opcode[128];
+               isc_buffer_t rb;
+
+               isc_buffer_init(&rb, opcode, sizeof(opcode));
+               (void)dns_opcode_totext(msg->rcode, &rb);
+
+               dns_zone_log(zone, ISC_LOG_INFO,
+                            "forwarding dynamic update: "
+                            "unexpected opcode (%.*s) from %s",
+                            (int)rb.used, opcode, master);
+               goto next_master;
+       }
+
        switch (msg->rcode) {
        /*
         * Pass these rcodes back to client.