]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Discard extraneous renegotiation attempts in the v3 link protocol
authorNick Mathewson <nickm@torproject.org>
Tue, 16 Oct 2012 17:41:55 +0000 (13:41 -0400)
committerNick Mathewson <nickm@torproject.org>
Wed, 17 Oct 2012 23:19:58 +0000 (19:19 -0400)
Failure to do so left us open to a remotely triggerable assertion
failure. Fixes CVE-2012-2249; bugfix on 0.2.3.6-alpha. Reported by
"some guy from France".

This patch is a forward-port to 0.2.4, to work with the new channel
logic.

changes/cve-2012-2249 [new file with mode: 0644]
src/or/channeltls.c
src/or/connection_or.c
src/or/connection_or.h

diff --git a/changes/cve-2012-2249 b/changes/cve-2012-2249
new file mode 100644 (file)
index 0000000..625bfa2
--- /dev/null
@@ -0,0 +1,5 @@
+  o Major bugfixes (security):
+    - Discard extraneous renegotiation attempts once the V3 link
+      protocol has been initiated. Failure to do so left us open to
+      a remotely triggerable assertion failure. Fixes CVE-2012-2249;
+      bugfix on 0.2.3.6-alpha. Reported by "some guy from France".
index 234aa3111df6688d3b7218c6d3f5ea1fac5803de..4470e92b790c8dc584b95efeb84dccf6b199a06b 100644 (file)
@@ -1130,6 +1130,7 @@ enter_v3_handshake_with_cell(var_cell_t *cell, channel_tls_t *chan)
            "Received a cell while TLS-handshaking, not in "
            "OR_HANDSHAKING_V3, on a connection we originated.");
   }
+  connection_or_block_renegotiation(chan->conn);
   chan->conn->base_.state = OR_CONN_STATE_OR_HANDSHAKING_V3;
   if (connection_init_or_handshake_state(chan->conn, started_here) < 0) {
     connection_or_close_for_error(chan->conn, 0);
index 877ddf1315794791422cf7368b9b90007257322a..92feb53af17e0c1f3e6fd7aa263ae46c6cf1996e 100644 (file)
@@ -1251,6 +1251,17 @@ connection_tls_start_handshake(or_connection_t *conn, int receiving)
   return 0;
 }
 
+/** Block all future attempts to renegotiate on 'conn' */
+void
+connection_or_block_renegotiation(or_connection_t *conn)
+{
+  tor_tls_t *tls = conn->tls;
+  if (!tls)
+    return;
+  tor_tls_set_renegotiate_callback(tls, NULL, NULL);
+  tor_tls_block_renegotiation(tls);
+}
+
 /** Invoked on the server side from inside tor_tls_read() when the server
  * gets a successful TLS renegotiation from the client. */
 static void
@@ -1260,8 +1271,7 @@ connection_or_tls_renegotiated_cb(tor_tls_t *tls, void *_conn)
   (void)tls;
 
   /* Don't invoke this again. */
-  tor_tls_set_renegotiate_callback(tls, NULL, NULL);
-  tor_tls_block_renegotiation(tls);
+  connection_or_block_renegotiation(conn);
 
   if (connection_tls_finish_handshake(conn) < 0) {
     /* XXXX_TLS double-check that it's ok to do this from inside read. */
index adfdde8d1b42961d8aa00a50980a001fe6dd44bb..727de211b0ff7bbfdd8ae9936248a2cef3de4ba7 100644 (file)
@@ -21,6 +21,7 @@ or_connection_t *connection_or_get_for_extend(const char *digest,
                                               int *launch_out);
 void connection_or_set_bad_connections(const char *digest, int force);
 
+void connection_or_block_renegotiation(or_connection_t *conn);
 int connection_or_reached_eof(or_connection_t *conn);
 int connection_or_process_inbuf(or_connection_t *conn);
 int connection_or_flushed_some(or_connection_t *conn);