Browse Source
The "SECURITY" section of the gitnamespaces(7) man page described two ways for a client to steal data from a server that wasn't intended to be shared. Similar attacks can be performed by a server on a client, so adapt the section to cover both directions and add it to the git-fetch(1), git-pull(1), and git-push(1) man pages. Also add references to this section from the documentation of server configuration options that attempt to control data leakage but may not be fully effective. Signed-off-by: Matt McCutchen <matt@mattmccutchen.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint


6 changed files with 51 additions and 22 deletions
@ -0,0 +1,30 @@
@@ -0,0 +1,30 @@
|
||||
SECURITY |
||||
-------- |
||||
The fetch and push protocols are not designed to prevent one side from |
||||
stealing data from the other repository that was not intended to be |
||||
shared. If you have private data that you need to protect from a malicious |
||||
peer, your best option is to store it in another repository. This applies |
||||
to both clients and servers. In particular, namespaces on a server are not |
||||
effective for read access control; you should only grant read access to a |
||||
namespace to clients that you would trust with read access to the entire |
||||
repository. |
||||
|
||||
The known attack vectors are as follows: |
||||
|
||||
. The victim sends "have" lines advertising the IDs of objects it has that |
||||
are not explicitly intended to be shared but can be used to optimize the |
||||
transfer if the peer also has them. The attacker chooses an object ID X |
||||
to steal and sends a ref to X, but isn't required to send the content of |
||||
X because the victim already has it. Now the victim believes that the |
||||
attacker has X, and it sends the content of X back to the attacker |
||||
later. (This attack is most straightforward for a client to perform on a |
||||
server, by creating a ref to X in the namespace the client has access |
||||
to and then fetching it. The most likely way for a server to perform it |
||||
on a client is to "merge" X into a public branch and hope that the user |
||||
does additional work on this branch and pushes it back to the server |
||||
without noticing the merge.) |
||||
|
||||
. As in #1, the attacker chooses an object ID X to steal. The victim sends |
||||
an object Y that the attacker already has, and the attacker falsely |
||||
claims to have X and not Y, so the victim sends Y as a delta against X. |
||||
The delta reveals regions of X that are similar to Y to the attacker. |
Loading…
Reference in new issue