[PATCH] httpd: fix username verification with md5 auth

Peter Korsgaard jacmet at uclibc.org
Thu Jun 12 12:43:59 PDT 2008


From: Peter Korsgaard <jacmet at sunsite.dk>

checkPerm only verified as many characters of the username as provided
by the client, so E.G. an empty username would always match.

Cleanup and save a few bytes while we are at it:

function                                             old     new   delta
checkPerm                                            359     350      -9
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-9)               Total: -9 bytes

Based on (incorrect) patch by Lubos Stanek (lubek) sent to the openwrt list:
http://thread.gmane.org/gmane.comp.embedded.openwrt.devel/1464

Signed-off-by: Peter Korsgaard <jacmet at sunsite.dk>
---
 networking/httpd.c |   28 +++++++++++++---------------
 1 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/networking/httpd.c b/networking/httpd.c
index 352a97d..db04cde 100644
--- a/networking/httpd.c
+++ b/networking/httpd.c
@@ -1710,29 +1710,27 @@ static int checkPerm(const char *path, const char *request)
 		if (strncmp(p0, path, l) == 0
 		 && (l == 1 || path[l] == '/' || path[l] == '\0')
 		) {
-			char *u;
 			/* path match found.  Check request */
 			/* for check next /path:user:password */
 			prev = p0;
-			u = strchr(request, ':');
-			if (u == NULL) {
-				/* bad request, ':' required */
-				break;
-			}
 
 			if (ENABLE_FEATURE_HTTPD_AUTH_MD5) {
 				char *pp;
 
-				if (strncmp(p, request, u - request) != 0) {
-					/* user doesn't match */
-					continue;
-				}
 				pp = strchr(p, ':');
 				if (pp && pp[1] == '$' && pp[2] == '1'
-				 && pp[3] == '$' && pp[4]
-				) {
-					char *encrypted = pw_encrypt(u+1, ++pp, 1);
-					int r = strcmp(encrypted, pp);
+				 && pp[3] == '$' && pp[4]) {
+					char *encrypted;
+					int r, len;
+
+					len = 1 + pp - p;
+					if (strncmp(p, request, len) != 0) {
+						/* user doesn't match */
+						continue;
+					}
+
+					encrypted = pw_encrypt(request+len, p+len, 1);
+					r = strcmp(encrypted, p+len);
 					free(encrypted);
 					if (r == 0)
 						goto set_remoteuser_var;   /* Ok */
@@ -1743,7 +1741,7 @@ static int checkPerm(const char *path, const char *request)
 
 			if (strcmp(p, request) == 0) {
  set_remoteuser_var:
-				remoteuser = xstrndup(request, u - request);
+				remoteuser = xstrndup(request, strchr(request, ':') - request);
 				return 1;   /* Ok */
 			}
 			/* unauthorized */
-- 
1.5.5.1



More information about the busybox mailing list