[tor-bugs] #31653 [Core Tor/Tor]: padding machine sending padding from relay to client closes circuit

Tor Bug Tracker & Wiki blackhole at torproject.org
Thu Sep 5 16:11:48 UTC 2019


#31653: padding machine sending padding from relay to client closes circuit
-----------------------------+------------------------------
 Reporter:  pulls            |          Owner:  (none)
     Type:  defect           |         Status:  new
 Priority:  Medium           |      Component:  Core Tor/Tor
  Version:  Tor: 0.4.1.5     |       Severity:  Normal
 Keywords:  wtf-pad circpad  |  Actual Points:
Parent ID:                   |         Points:
 Reviewer:                   |        Sponsor:
-----------------------------+------------------------------
 Below appears to be a bug that results in a closed circuit due to a relay
 sending a padding cell (RELAY_COMMAND_DROP) to the client.

 At links below you find code for two circuit padding machines:
 1. circpad_machine_client_close_circuit_minimal
 2. circpad_machine_relay_close_circuit_minimal

 Machine 1 runs on a client on CIRCUIT_PURPOSE_C_GENERAL circuits with 3
 hops as soon as CIRCPAD_CIRC_OPENED: the only thing it does is set a timer
 1000s in the future and waits for the timer to expire. The purpose of the
 machine is to negotiate padding with the relay to activate Machine 2 on
 the middle relay.

 Machine 2 runs at the middle relay and repeatedly sends a padding cell to
 the client 1 usec after the event CIRCPAD_EVENT_NONPADDING_SENT. In other
 words, for every non-padding cell we directly add a padding cell. At the
 client, this causes `relay_decrypt_cell(): Incoming cell at client not
 recognized. Closing.` for all circuits triggering Machine 2 at the relay.
 Closing a circuit by injecting padding cells seems unintended.

 Here is part of a log from a client on info level showing how the machine
 registers, negotiates with the relay (starting Machine 2 at the relay),
 eventually fails to decrypt, and the circuit closes.

 {{{
 Sep 05 10:32:19.000 [info] circpad_setup_machine_on_circ(): Registering
 machine client_close_circuit_minimal to origin circ 3 (5)
 Sep 05 10:32:19.000 [info] circpad_node_supports_padding(): Checking
 padding: supported
 Sep 05 10:32:19.000 [info] circpad_negotiate_padding(): Negotiating
 padding on circuit 3 (5), command 2
 Sep 05 10:32:19.000 [info] link_apconn_to_circ(): Looks like completed
 circuit to [scrubbed] does allow optimistic data for connection to
 [scrubbed]
 Sep 05 10:32:19.000 [info] connection_ap_handshake_send_begin(): Sending
 relay cell 0 on circ 3296464733 to begin stream 20575.
 Sep 05 10:32:19.000 [info] connection_ap_handshake_send_begin():
 Address/port sent, ap socket 13, n_circ_id 3296464733
 Sep 05 10:32:19.000 [info] rep_hist_note_used_port(): New port prediction
 added. Will continue predictive circ building for 2355 more seconds.
 Sep 05 10:32:19.000 [info] connection_edge_process_inbuf(): data from edge
 while in 'waiting for circuit' state. Leaving it on buffer.
 Sep 05 10:32:19.000 [info] exit circ (length 3): $[manually-
 scrubbed](open) $[manually-scrubbed](open) $[manually-scrubbed](open)
 Sep 05 10:32:19.000 [info] pathbias_count_use_attempt(): Used circuit 3 is
 already in path state use attempted. Circuit is a General-purpose client
 currently open.
 Sep 05 10:32:19.000 [info] link_apconn_to_circ(): Looks like completed
 circuit to [scrubbed] does allow optimistic data for connection to
 [scrubbed]
 Sep 05 10:32:19.000 [info] connection_ap_handshake_send_begin(): Sending
 relay cell 0 on circ 3296464733 to begin stream 20576.
 Sep 05 10:32:19.000 [info] connection_ap_handshake_send_begin():
 Address/port sent, ap socket 14, n_circ_id 3296464733
 Sep 05 10:32:19.000 [info] circpad_deliver_recognized_relay_cell_events():
 Got padding cell on origin circuit 3.
 Sep 05 10:32:20.000 [info] relay_decrypt_cell(): Incoming cell at client
 not recognized. Closing.
 Sep 05 10:32:20.000 [info] circuit_receive_relay_cell(): relay crypt
 failed. Dropping connection.
 Sep 05 10:32:20.000 [info] command_process_relay_cell():
 circuit_receive_relay_cell (backward) failed. Closing.
 Sep 05 10:32:20.000 [info] circpad_circuit_machineinfo_free_idx(): Freeing
 padding info idx 0 on circuit 3 (23)
 Sep 05 10:32:20.000 [info] circpad_node_supports_padding(): Checking
 padding: supported
 Sep 05 10:32:20.000 [info] circpad_negotiate_padding(): Negotiating
 padding on circuit 3 (23), command 1
 Sep 05 10:32:20.000 [info] pathbias_send_usable_probe(): Sending pathbias
 testing cell to 0.233.9.53:25 on stream 20577 for circ 3.
 Sep 05 10:32:20.000 [info] relay_decrypt_cell(): Incoming cell at client
 not recognized. Closing.
 Sep 05 10:32:20.000 [info] circuit_receive_relay_cell(): relay crypt
 failed. Dropping connection.
 Sep 05 10:32:20.000 [info] command_process_relay_cell():
 circuit_receive_relay_cell (backward) failed. Closing.
 Sep 05 10:32:20.000 [info] pathbias_send_usable_probe(): Got pathbias
 probe request for circuit 3 with outstanding probe
 Sep 05 10:32:20.000 [info] pathbias_check_close(): Circuit 3 closed
 without successful use for reason 2. Circuit purpose 23 currently 1,open.
 Len 3.
 Sep 05 10:32:20.000 [info] circuit_mark_for_close_(): Circuit 3296464733
 (id: 3) marked for close at src/core/or/command.c:582 (orig reason: 2, new
 reason: 0)
 Sep 05 10:32:20.000 [info] connection_edge_destroy(): CircID 0: At an
 edge. Marking connection for close.
 Sep 05 10:32:20.000 [info] connection_edge_destroy(): CircID 0: At an
 edge. Marking connection for close.
 Sep 05 10:32:20.000 [info] circuit_free_(): Circuit 0 (id: 3) has been
 freed.
 }}}

 If we delay sending the padding from the relay I cannot trigger the bug
 (see commented out fix in the Machine 2 function). With the code below,
 the code triggers on every circuit that has the machine negotiated.

 Code: https://github.com/pylls/tor/tree/circuit-padding-relay-padding-bug
 (https://github.com/pylls/tor/blob/circuit-padding-relay-padding-
 bug/src/core/or/circuitpadding_machines.c#L460, as well as
 circuitpadding_machines.h and registration in circpad_machines_init() of
 circuitpadding.c).

--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/31653>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online


More information about the tor-bugs mailing list