]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
nts: check all encrypted fields before saving cookies
authorMiroslav Lichvar <mlichvar@redhat.com>
Thu, 13 Aug 2020 12:25:12 +0000 (14:25 +0200)
committerMiroslav Lichvar <mlichvar@redhat.com>
Thu, 13 Aug 2020 14:37:20 +0000 (16:37 +0200)
Don't save any cookies if an encrypted extension field fails parsing.

nts_ntp_client.c

index 79136f02169888094b92249f9304dafe81fb73a8..16f496b9d58719a8da0b000c7f244b6636a50bb6 100644 (file)
@@ -353,6 +353,23 @@ NNC_GenerateRequestAuth(NNC_Instance inst, NTP_Packet *packet,
 
 /* ================================================== */
 
+static int
+parse_encrypted_efs(NNC_Instance inst, unsigned char *plaintext, int length)
+{
+  int ef_length, parsed;
+
+  for (parsed = 0; parsed < length; parsed += ef_length) {
+    if (!NEF_ParseSingleField(plaintext, length, parsed, &ef_length, NULL, NULL, NULL)) {
+      DEBUG_LOG("Could not parse encrypted EF");
+      return 0;
+    }
+  }
+
+  return 1;
+}
+
+/* ================================================== */
+
 static int
 extract_cookies(NNC_Instance inst, unsigned char *plaintext, int length)
 {
@@ -363,10 +380,8 @@ extract_cookies(NNC_Instance inst, unsigned char *plaintext, int length)
 
   for (parsed = 0; parsed < length; parsed += ef_length) {
     if (!NEF_ParseSingleField(plaintext, length, parsed,
-                              &ef_length, &ef_type, &ef_body, &ef_body_length)) {
-      DEBUG_LOG("Could not parse encrypted EF");
+                              &ef_length, &ef_type, &ef_body, &ef_body_length))
       return 0;
-    }
 
     if (ef_type != NTP_EF_NTS_COOKIE)
       continue;
@@ -449,6 +464,9 @@ NNC_CheckResponseAuth(NNC_Instance inst, NTP_Packet *packet,
                                plaintext, sizeof (plaintext), &plaintext_length))
           return 0;
 
+        if (!parse_encrypted_efs(inst, plaintext, plaintext_length))
+          return 0;
+
         has_valid_auth = 1;
         break;
       default: