mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-03 17:13:33 +01:00
Merge branch 'block_renegotiate_023' into maint-0.2.3
This commit is contained in:
commit
1cc06bd35e
5
changes/cve-2012-2249
Normal file
5
changes/cve-2012-2249
Normal file
@ -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".
|
@ -649,6 +649,7 @@ enter_v3_handshake_with_cell(var_cell_t *cell, or_connection_t *conn)
|
|||||||
"Received a cell while TLS-handshaking, not in "
|
"Received a cell while TLS-handshaking, not in "
|
||||||
"OR_HANDSHAKING_V3, on a connection we originated.");
|
"OR_HANDSHAKING_V3, on a connection we originated.");
|
||||||
}
|
}
|
||||||
|
connection_or_block_renegotiation(conn);
|
||||||
conn->_base.state = OR_CONN_STATE_OR_HANDSHAKING_V3;
|
conn->_base.state = OR_CONN_STATE_OR_HANDSHAKING_V3;
|
||||||
if (connection_init_or_handshake_state(conn, started_here) < 0) {
|
if (connection_init_or_handshake_state(conn, started_here) < 0) {
|
||||||
connection_mark_for_close(TO_CONN(conn));
|
connection_mark_for_close(TO_CONN(conn));
|
||||||
|
@ -1186,6 +1186,17 @@ connection_tls_start_handshake(or_connection_t *conn, int receiving)
|
|||||||
return 0;
|
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
|
/** Invoked on the server side from inside tor_tls_read() when the server
|
||||||
* gets a successful TLS renegotiation from the client. */
|
* gets a successful TLS renegotiation from the client. */
|
||||||
static void
|
static void
|
||||||
@ -1195,8 +1206,7 @@ connection_or_tls_renegotiated_cb(tor_tls_t *tls, void *_conn)
|
|||||||
(void)tls;
|
(void)tls;
|
||||||
|
|
||||||
/* Don't invoke this again. */
|
/* Don't invoke this again. */
|
||||||
tor_tls_set_renegotiate_callback(tls, NULL, NULL);
|
connection_or_block_renegotiation(conn);
|
||||||
tor_tls_block_renegotiation(tls);
|
|
||||||
|
|
||||||
if (connection_tls_finish_handshake(conn) < 0) {
|
if (connection_tls_finish_handshake(conn) < 0) {
|
||||||
/* XXXX_TLS double-check that it's ok to do this from inside read. */
|
/* XXXX_TLS double-check that it's ok to do this from inside read. */
|
||||||
|
@ -21,6 +21,7 @@ or_connection_t *connection_or_get_for_extend(const char *digest,
|
|||||||
int *launch_out);
|
int *launch_out);
|
||||||
void connection_or_set_bad_connections(const char *digest, int force);
|
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_reached_eof(or_connection_t *conn);
|
||||||
int connection_or_process_inbuf(or_connection_t *conn);
|
int connection_or_process_inbuf(or_connection_t *conn);
|
||||||
int connection_or_flushed_some(or_connection_t *conn);
|
int connection_or_flushed_some(or_connection_t *conn);
|
||||||
|
Loading…
Reference in New Issue
Block a user