Bug 1829 - auth-rsa.c: move auth_key_is_revoked() call from auth_rsa_verify_response() to auth_rsa_key_allowed()
Summary: auth-rsa.c: move auth_key_is_revoked() call from auth_rsa_verify_response() t...
Status: CLOSED FIXED
Alias: None
Product: Portable OpenSSH
Classification: Unclassified
Component: sshd (show other bugs)
Version: 5.6p1
Hardware: All All
: P2 normal
Assignee: Assigned to nobody
URL:
Keywords:
Depends on:
Blocks: V_5_7
  Show dependency treegraph
 
Reported: 2010-10-19 09:07 AEDT by Dmitry V. Levin
Modified: 2011-10-05 09:12 AEDT (History)
1 user (show)

See Also:


Attachments
proposed patch (1.72 KB, patch)
2010-10-19 09:07 AEDT, Dmitry V. Levin
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Dmitry V. Levin 2010-10-19 09:07:14 AEDT
Created attachment 1936 [details]
proposed patch

Both auth_rsa_verify_response() and auth_rsa_key_allowed() are
PRIVSEP'ed, so there should be no security degradation.

auth_rsa_key_allowed() is called from auth_rsa() only;
auth_rsa_verify_response() is called only from
auth_rsa_challenge_dialog(), which in turn is called
- either from auth_rsa(), right after auth_rsa_key_allowed() call,
- or from auth_rhosts_rsa(), right after auth_rhosts_rsa_key_allowed()
call, which already calls auth_key_is_revoked().

As result of this change, auth_rsa_key_allowed() will be called earlier
on the auth_rsa() path, before starting challenge-response, which is
good, and won't be called second time on the auth_rhosts_rsa() path,
which is also good.
Comment 1 Damien Miller 2010-11-05 11:22:28 AEDT
What is the practical intent of this change?
Comment 2 Dmitry V. Levin 2010-11-05 11:56:03 AEDT
(In reply to comment #1)
> What is the practical intent of this change?

The proposed change is result of code inspection.

I maintain an OpenSSH key blacklisting patch (see http://www.openwall.com/lists/oss-security/2008/05/27/3 for more details) which was originally implemented for 5.0p1, before certificate authentication support (which was introduced later in 5.4p1).

While merging my changes to use auth_key_is_revoked() infrastructure, I found out that one auth_key_is_revoked() call is not placed quite well:
there is no use for server to start a challenge-response dialog with the key that is not allowed for authentication.
Comment 3 Damien Miller 2010-12-04 10:57:44 AEDT
Patch applied and will be released in OpenSSH-5.7 - thanks!
Comment 4 Damien Miller 2011-01-24 12:33:31 AEDT
Move resolved bugs to CLOSED after 5.7 release
Comment 5 Dmitry V. Levin 2011-09-13 08:46:42 AEST
(In reply to comment #3)
> Patch applied and will be released in OpenSSH-5.7 - thanks!

The patch was changed before applying, with result that the rest of the file passed to rsa_key_allowed_in_file() is going to be skipped once a revoked key is detected, while the intended behavior is to skip just those lines that define revoked keys.

Please compare the original proposal
https://bugzilla.mindrot.org/attachment.cgi?id=1936
with actually applied change
http://hg.mindrot.org/openssh/rev/a82eca01db5b
and consider applying the change in its original form.
Comment 6 Damien Miller 2011-10-05 00:59:23 AEDT
I think the behaviour that I committed is correct: the key that is being matched has been confirmed as revoked, there is no point continuing to match and it's probably dangerous to do so - e.g. a subsequent listing of the same key will cause it to be "unrevoked"
Comment 7 Dmitry V. Levin 2011-10-05 02:58:46 AEDT
(In reply to comment #6)
> I think the behaviour that I committed is correct: the key that is
> being matched has been confirmed as revoked, there is no point
> continuing to match

The file may still contain valid keys.
Even in case of syntax error the code just skips broken lines.

> and it's probably dangerous to do so - e.g. a
> subsequent listing of the same key will cause it to be "unrevoked"

Would it?  How a key that is already revoked could be "unrevoked"?
Comment 8 Damien Miller 2011-10-05 08:44:08 AEDT
Remember what is happening here: a key has been suggested by the client and is being compared against the lines in authorized_keys. *After* the modulus has been matched, we check whether the key is revoked. If it is revoked, then there is no point in checking further in the file to see if an non-revoked entry of the same key exists.
Comment 9 Dmitry V. Levin 2011-10-05 09:12:28 AEDT
Agreed.