Implement basic replay protection #173
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Currently PySyncObj implements replay protection via
recvRandKey
andsendRandKey
. This is good, but protects only when attackers open a new TCP connection or try to inject messages captured on one connection to another, but nothing prevents attackers transparently proxying our TCP connections toreplay
/delay
/reorder
/drop
messages within this TCP connection arbitrarily.This PR implements basic replay protection by enforcing monotonicity of received timestamps. This restricts
Reordering
/replaying
for attackers only to messages with the same timestamp.Delaying
is still possible, but the messages now have to be either dropped or, with respect to the 1 second precision of the timestamp, delivered in the original order.Advantage of this partial protection over more effective one is that this is no change to message format. This means that connection between patched an unpatched servers will still work except connection will be closed and immediately reopened when somebody turns clocks on their unpatched servers back.
Also, strength of this protection will improve with fernet/spec#12 .