After discussing this with the author I realized I had misread the patch.

The new code moves the check in question from before the "if (!SC->bEnabled)" to later 
in the sequence:

    (check used to be here)

    /*
     * We decline operation in various situations...
     */
    if (!sc->bEnabled)
        return DECLINED;
    if (ap_ctx_get(r->connection->client->ctx, "ssl") == NULL)
        return DECLINED;
    if (!(dc->nOptions & SSL_OPT_FAKEBASICAUTH))
        return DECLINED;
    if (r->connection->user)
        return DECLINED;
    if ((clientdn = (char *)ap_ctx_get(r->connection->client->ctx, "ssl::client::dn")) 
== NULL)
      {
      /*
      * Make sure the user is not able to fake the client certificate
      * based authentication by just entering an X.509 Subject DN
      * ("/XX=YYY/XX=YYY/..") as the username and "password" as the
      * password.
      */
      if ((cpAL = ap_table_get(r->headers_in, "Authorization")) != NULL) {
      .
      .
      .

This fixes the problem where the check fails the second time through on a subrequest 
or internal redirect and catches a spoof attempt in the situation when there is no 
client certificate DN.

My only question is: Can a user still "spoof" a FakeBasicAuth request when one of the 
other four previous "DECLINED" conditions are true?

Another way to approach the problem might be to keep the check where it was, but 
enforce it only when (ap_is_initial_req(r)) is true. The spoof can only be attempted 
on the initial request - not on any subrequests or internal redirects and will catch 
spoof attempts for all of the "DECLINED" conditions.

Anyone with more experience with this code care to comment?

Rick Barry

Compaq Computer Corporation   Compaq Secure Web Server Project Team
110 Spit Brook Road           OpenVMS System Software Group
Nashua, NH  03062             Business Critical Server Group
(603) 884-0634

-----Original Message-----
From: Barry, Richard 
Sent: Wednesday, April 24, 2002 10:42 AM
To: '[EMAIL PROTECTED]'
Subject: RE: [BugDB] Client Authentication BUG with FakeBasicAuth
(PR#695)


This submission is missing a conditional expression before line 1161.

What test is performed prior to executing the DN/password check in the
new code?

Rick Barry

Compaq Computer Corporation   Compaq Secure Web Server Project Team
110 Spit Brook Road           OpenVMS System Software Group
Nashua, NH  03062             Business Critical Server Group
(603) 884-0634

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
Sent: Wednesday, April 17, 2002 6:54 AM
To: [EMAIL PROTECTED]
Cc: [EMAIL PROTECTED]
Subject: [BugDB] Client Authentication BUG with FakeBasicAuth (PR#695)


Full_Name: Sergio Rabellino
Version: 2.8.8
OS: Solaris 7
Submission from: (NULL) (130.192.239.73)


The "if" in ssl_engine_kernel.c at line 1130 to check against DN/password
authorization
directly form a client, break also the internal redirect done by apache under
some conditions, as the directory indexing ...

So if you use client auth, with fake basic auth and require an index, you get a
301 followed by a 403 (Forbidden)...

Below i've attached a diff patch to correct this behaviour; i've tested it on my
hosts
and all things should be fine now.

Thanks to Nick Miles for pinpointing me to the solution.

Bye.

---snip
1130,1147d1129
<      * Make sure the user is not able to fake the client certificate
<      * based authentication by just entering an X.509 Subject DN
<      * ("/XX=YYY/XX=YYY/..") as the username and "password" as the
<      * password.
<      */
<     if ((cpAL = ap_table_get(r->headers_in, "Authorization")) != NULL) {
<         if (strcEQ(ap_getword(r->pool, &cpAL, ' '), "Basic")) {
<             while (*cpAL == ' ' || *cpAL == '\t')
<                 cpAL++;
<             cpAL = ap_pbase64decode(r->pool, cpAL);
<             cpUN = ap_getword_nulls(r->pool, &cpAL, ':');
<             cpPW = cpAL;
<             if (cpUN[0] == '/' && strEQ(cpPW, "password"))
<                 return FORBIDDEN;
<         }
<     }
< 
<     /*
1158a1141,1161
>       {
>       /*
>       * Make sure the user is not able to fake the client certificate
>       * based authentication by just entering an X.509 Subject DN
>       * ("/XX=YYY/XX=YYY/..") as the username and "password" as the
>       * password.
>       */
>       if ((cpAL = ap_table_get(r->headers_in, "Authorization")) != NULL) {
>               if (strcEQ(ap_getword(r->pool, &cpAL, ' '), "Basic")) {
>               while (*cpAL == ' ' || *cpAL == '\t')
>                       cpAL++;
>               cpAL = ap_pbase64decode(r->pool, cpAL);
>               cpUN = ap_getword_nulls(r->pool, &cpAL, ':');
>               cpPW = cpAL;
>               if (cpUN[0] == '/' && strEQ(cpPW, "password"))
>               {
>                       ssl_log(r->server, SSL_LOG_INFO, "WARNING: Old mod_ssl
breakthrough solicited (FakeBasicAuth by DN) !");
>                       return FORBIDDEN;
>               }
>               }
>       }
1159a1163
>       }
1160a1165
> 
--snip
______________________________________________________________________
Apache Interface to OpenSSL (mod_ssl)                   www.modssl.org
User Support Mailing List                      [EMAIL PROTECTED]
Automated List Manager                            [EMAIL PROTECTED]
______________________________________________________________________
Apache Interface to OpenSSL (mod_ssl)                   www.modssl.org
User Support Mailing List                      [EMAIL PROTECTED]
Automated List Manager                            [EMAIL PROTECTED]

Reply via email to