--On Wednesday, April 06, 2011 15:42:11 -0500 john.hayw...@wheaton.edu wrote:

List info/subscribe/unsubscribe? See
http://www.freeradius.org/list/users.html
I don't know if this should be sent to the developers list instead.

=== Background ===
When there is a failure of the client to match the challenge of the
server:

According to rfc2759 a failure packet in section 6 a failure packet
includes a message like:
"E=eeeeeeeeee R=r C=cccccccccccccccccccccccccccccccc V=vvvvvvvvvv M=<msg>"
where E is the error code, R 1/0 allow/disallow retry C an ascii version
of the challenge V=3 and M= some text message.

After this mschap failure message is sent by the server an acknowledgment
which seems to be have a failure code should be returned from the client.

At that point the server can close the eap connection with a failure.

What the 2.1.10 code (and earlier) appears to do is after mschap is
detected immediately close the eap connection with a failure.

The effect for windows XP/7 machines connecting wirelessly using mschapv2
is that they are presented with a dialog box and can enter new
credentials.

What happens with mac/iphones/androids/ubuntu is that they appear to be
confused and time out and re-send (at various rates) authentication
attempts without presenting a dialog box to the user.

For some environments (such as using Novell NDS to authenticate) if
configured modules/ldap edir_account_policy_check=yes then these repeated
failures result in account lock outs.

Scenario: Institution requires periodic change of password - user uses a
web site to change password - user forgets to update their
mac/iphone/android - user turns on their mac/iphone/android - shortly
after user cannot access any resources (such as blackboard/portal etc)
because their account is locked out.

====== proposed fix ====
Modify freeradius to follow rfc2759.

This requires patches to two source files:
o src/modules/rlm_mschap/rlm_mschap.c to include a message which conforms
   to rfc2759
o src/modules/rlm_eap/types/rlm_eap_mschapv2/rlm_eap_mschapv2.c to use the
   response created by rlm_mschap.c and send that back, also accept an
   authentication failure acknowledgment before sending eap failure
packet.

Below are the diffs:

======

==== Comments ====
o Results:
   We have implemented this patch (along with the configuration change
   edir_account_policy_check=no) and observe:
   1) no more lockouts
   2) Mac/Iphones users are now presented with a dialog box where they
      can update their password.
o Code:
   a) I don't like the 100 character msg variable - there is probably a
      better way to do this.
   b) There is probably a function in free radius library to do the
sprintf
      which should be used.
   c) samba locked accounts should probably have a similar message
      generated if they are mschapv2.

I would be happy if someone could look over these patches and incorporate
the ideas into freeradius for future releases.


Hi John,
I had trouble applying the patches to 2.1.x git -- maybe because they got mushed during the email process.

Adding the bits by hand seemed to work, and I can confirm the result is as you describe on an iPhone (that's all I had to hand to test).

Attached are the two 'git diff' that I ended up with.

-James


--
James J J Hooper
Network Specialist, University of Bristol
http://www.wireless.bristol.ac.uk               http://www.jamesjj.net
--

index c512018..3f3fc46 100644
--- a/src/modules/rlm_mschap/rlm_mschap.c
+++ b/src/modules/rlm_mschap/rlm_mschap.c
@@ -1239,9 +1239,21 @@ static int mschap_authenticate(void * instance, REQUEST 
*request)
                              response->vp_octets + 26, nthashhash,
                              do_ntlm_auth) < 0) {
                        RDEBUG2("FAILED: MS-CHAP2-Response is incorrect");
+
+                       /* JCH - changes to include challenge and message */
+                        char msg[100];
+                        strcpy(msg, "E=691 R=0 C=");
+                        int i, offset = strlen(msg);
+                        char *ptr = &msg[offset];
+                        for (i=0; i<16; i++, ptr+=2) {
+                           sprintf(ptr, "%02X", response->vp_octets[i+2]);
+                        }
+                        *ptr = 0;
+                        strcat(msg, " V=3 M=May Need to reset cached 
password");
+
                        mschap_add_reply(request, &request->reply->vps,
                                         *response->vp_octets,
-                                        "MS-CHAP-Error", "E=691 R=1", 9);
+                                        "MS-CHAP-Error", msg, strlen(msg));
                        return RLM_MODULE_REJECT;
                }

index bdf4668..051fe71 100644
--- a/src/modules/rlm_eap/types/rlm_eap_mschapv2/rlm_eap_mschapv2.c
+++ b/src/modules/rlm_eap/types/rlm_eap_mschapv2/rlm_eap_mschapv2.c
@@ -195,7 +195,9 @@ static int eapmschapv2_compose(EAP_HANDLER *handler, 
VALUE_PAIR *reply)
 
        case PW_MSCHAP_ERROR:
                DEBUG2("MSCHAP Failure\n");
-               length = 4 + MSCHAPV2_FAILURE_MESSAGE_LEN;
+               /* JCH need to be change length to work with full v2 message  */
+               // length = 4 + MSCHAPV2_FAILURE_MESSAGE_LEN;
+               length = 4 + reply->length-1;
                eap_ds->request->type.data = malloc(length);
 
                /*
@@ -212,7 +214,11 @@ static int eapmschapv2_compose(EAP_HANDLER *handler, 
VALUE_PAIR *reply)
                eap_ds->request->type.data[1] = eap_ds->response->id;
                length = htons(length);
                memcpy((eap_ds->request->type.data + 2), &length, 
sizeof(uint16_t));
-               memcpy((eap_ds->request->type.data + 4), 
MSCHAPV2_FAILURE_MESSAGE, MSCHAPV2_FAILURE_MESSAGE_LEN);
+               /* JCH need to copy the failure message from mschapv2 - it 
contains ascii version of the challenge C=... */
+                memcpy((eap_ds->request->type.data + 4),
+               (reply->vp_strvalue+1),
+                (reply->length-1));
+               //MSCHAPV2_FAILURE_MESSAGE, MSCHAPV2_FAILURE_MESSAGE_LEN);
                break;
 
        default:
@@ -485,6 +491,18 @@ static int mschapv2_authenticate(void *arg, EAP_HANDLER 
*handler)
                return 1;
                break;
 
+       /*JCH added - is this is an ack of a failure message */
+        case PW_EAP_MSCHAPV2_FAILURE:
+               if (data->code != PW_EAP_MSCHAPV2_FAILURE) {
+                       radlog(L_ERR, "rlm_eap_mschapv2: Unexpected FAILURE 
received");
+                       return 0;
+               }
+               //JCH needed??? handler->request->options &= 
~RAD_REQUEST_OPTION_PROXY_EAP;
+                eap_ds->request->code = PW_EAP_FAILURE;
+                return 1;
+                break;
+
+
                /*
                 *      Something else, we don't know what it is.
                 */
@@ -657,12 +675,12 @@ static int mschapv2_authenticate(void *arg, EAP_HANDLER 
*handler)
                 *      Don't return anything in the error message.
                 */
                eap_ds->request->code = PW_EAP_FAILURE;
-               return 1;
-#if 0
-               pairmove2(&handler->request->reply->vps, &response
+//             return 1;
+//#if 0
+               pairmove2(&response, &handler->request->reply->vps,
                          PW_MSCHAP_ERROR);
                data->code = PW_EAP_MSCHAPV2_FAILURE;
-#endif
+//#endif
        }
 
        /*
-
List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html

Reply via email to