SHA1 collisions in key names was more exploitable than I thought

Yesterday's SHA1 collision attack could be used to generate eg:

SHA256-sfoo--whatever.good
SHA256-sfoo--whatever.bad

Such that they collide. A repository with the good one could have the
bad one swapped in and signed commits would still verify.

I've already mitigated this.
This commit is contained in:
Joey Hess 2017-02-24 19:54:36 -04:00
parent 27eca014be
commit 6b52fcbb7e
No known key found for this signature in database
GPG key ID: C910D9222512E3C7
3 changed files with 10 additions and 13 deletions

View file

@ -33,8 +33,9 @@ git-annex (6.20170215) UNRELEASED; urgency=medium
to wget, since curl is able to display only errors to stderr, unlike
wget.
* status: Pass --ignore-submodules=when option on to git status.
* Tighten key parser to mitigate against hypothetical SHA1 chosen-prefix
attacks. This ensures that signed git commits of annexed files
* Tighten key parser to prevent SHA1 collision attacks generating
two keys that have the same SHA1. (Only done for keys that contain
a hash). This ensures that signed git commits of annexed files
will remain secure, as long as git-annex is using a secure hashing
backend.

3
Key.hs
View file

@ -127,8 +127,7 @@ file2key s
| otherwise = Nothing
{- When a key HasExt, the length of the extension is limited in order to
- mitigate against SHA1 collision attacks (specifically, chosen-prefix
- attacks).
- mitigate against SHA1 collision attacks.
-
- In such an attack, the extension of the key could be made to contain
- the collision generation data, with the result that a signed git commit

View file

@ -74,13 +74,10 @@ A few other potential problems:
* `*E` backends could embed sha1 collision data in a long filename
extension in a key.
Impact is limited, because even if an attacker does this, the key also
contains the checksum (eg SHA2) of the annexed data. The current SHA1
attack is only a common-prefix attack; it does not allow creating two
colliding keys that contain two different SHA2 checksums. That would
need a chosen-prefix attack.
The recent SHA1 common-prefix attack could be used to exploit this;
the result would be two keys that have the same SHA1.
It might be worth limiting the length
This can be fixed by limiting the length
of an extension allowed in such a key to the longest such extension
git-annex has ever supported (probably < 20 bytes or so), which would
be less than the size of the data needed for current SHA1 collision
@ -92,7 +89,7 @@ A few other potential problems:
Need to review the code and see if such extra fields are allowed.
Update: All fields are numeric, but could contain arbitrary data
after the number. Could have been used in a chosen-prefix attack.
after the number. Could have been used in a common-prefix attack.
This has been fixed; git-annex refuses to parse
such fields, so it won't work with files that try to exploit this.