fko_client_timeout.c fko_common.h fko_digest.c fko_encode.c \
fko_decode.c fko_encryption.c fko_error.c fko_funcs.c fko_message.c \
fko_message.h fko_nat_access.c fko_rand_value.c fko_server_auth.c \
- fko.h fko_limits.h fko_timestamp.c fko_user.c fko_util.h md5.c md5.h \
- rijndael.c rijndael.h sha1.c sha1.h sha2.c sha2.h strlcat.c \
+ fko.h fko_limits.h fko_timestamp.c fko_user.c fko_user.h fko_util.h \
+ md5.c md5.h rijndael.c rijndael.h sha1.c sha1.h sha2.c sha2.h strlcat.c \
strlcpy.c fko_context.h fko_state.h fko_context.h gpgme_funcs.c \
gpgme_funcs.h
#include "fko_state.h"
#include "fko_context.h"
#include "fko_message.h"
+#include "fko_user.h"
/* Try to cover for those that do not have bzero.
*/
}
b64_decode(tbuf, (unsigned char*)ctx->username);
+ if(validate_username(ctx->username) != FKO_SUCCESS)
+ {
+ free(tbuf);
+ return(FKO_ERROR_INVALID_DATA);
+ }
/* Extract the timestamp value.
*/
fko_set_username(fko_ctx_t ctx, const char *spoof_user)
{
char *username = NULL;
- int i;
+ int res = FKO_SUCCESS;
/* Must be initialized
*/
if(strnlen(username, MAX_SPA_USERNAME_SIZE) == MAX_SPA_USERNAME_SIZE)
*(username + MAX_SPA_USERNAME_SIZE - 1) = '\0';
- /* Make sure it is just alpha-numeric chars and dashes
- */
- if(isalnum(username[0]) == 0)
- return(FKO_ERROR_INVALID_DATA);
-
- for (i=1; i < strnlen(username, MAX_SPA_USERNAME_SIZE); i++)
- if((isalnum(username[i]) == 0) && username[i] != '-')
- return(FKO_ERROR_INVALID_DATA);
+ if((res = validate_username(username)) != FKO_SUCCESS)
+ return res;
/* Just in case this is a subsquent call to this function. We
* do not want to be leaking memory.
return(FKO_SUCCESS);
}
+int
+validate_username(const char *username)
+{
+ int i;
+
+ if(username == NULL || strnlen(username, MAX_SPA_USERNAME_SIZE) == 0)
+ return(FKO_ERROR_INVALID_DATA);
+
+ /* Make sure it is just alpha-numeric chars and dashes
+ */
+ if(isalnum(username[0]) == 0)
+ return(FKO_ERROR_INVALID_DATA);
+
+ for (i=1; i < strnlen(username, MAX_SPA_USERNAME_SIZE); i++)
+ if((isalnum(username[i]) == 0) && username[i] != '-')
+ return(FKO_ERROR_INVALID_DATA);
+
+ return FKO_SUCCESS;
+}
+
/***EOF***/
--- /dev/null
+/*
+ *****************************************************************************
+ *
+ * File: fko_message.h
+ *
+ * Author: Michael Rash
+ *
+ * Purpose: Provide validation functions for SPA messages
+ *
+ * Copyright 2012 Michael Rash (mbr@cipherdyne.org)
+ *
+ * License (GNU Public License):
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA
+ *
+ *****************************************************************************
+*/
+
+#ifndef FKO_USER_H
+#define FKO_USER_H 1
+
+/* SPA message format validation functions.
+*/
+int validate_username(const char *username);
+
+#endif /* FKO_USER_H */
+
+/***EOF***/
[+] TEST: [perl FKO module] [FUZZING] generate invalid SPA pkts
[+] Bogus user: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, SPA packet: 8CDE3EbCA2lPCfaREyVuOb0O7Y4f4X19NhmRLaNbYKM2C9phb61rHl//A/IiKLjvzQwLfFg+Vcw5MRJJNUVFU6fc/KVn8Ga+L1dVs2hmBeqNu6I+owJp2RGMYwBBiaKHa9HfG3bFd+qvxxf8aq9YYLeBE5jS1MztyggXJYl0bjPMB+ldKw2gwJz2YUyQJI/CvJOml4b8/lE16b3KjyMi0VSpQgVTpIV4wp/4pFmAu5BFVzPhNF7aqJdEYJWHgLIlKVbbLBXf9QYw
-[+] Bogus user: -1, SPA packet: 8chLxRMt6BlbbHcSN/JIJRQe3GtlqWA/h2jvNMTIgA1FDn042sIBC9Zi2ooqPXyp52/iGjIiVeIynemhrJ9xm8VSX0ymrqDcy0zeOqk/EtviZF0WRpGSUwNEZL5XIdRQhVPan9iG5NREkWJmkojQXwP4Bv1Fwq1Ak
[+] Bogus user: -1, SPA packet: +E10NRuOugEt1bcWSv7y7R1o3V4SFAaZk2RRJIEbGKiNv8eXRm8pXgA5eqLg7DYmNYB81kR6j7K/HkxARxkQM1WJ1Bo/cyQqFIgRYkS7sfW4Y8xdTCkpV7AdD/gX+3dgi4X3BH5CBXvRHQOu3TJand0vjOkH0Aqmc
-[+] Bogus user: (NULL), SPA packet: /OhXqxE0/q58cTUa+cFm9yWOxJ87OPOTpS3V1CFuxDxknF+ExOYgF2fRCs0F5UXnNzx5KXKy8mTrgspYdSmhpnV7HoP74MrLVbPSeCc1dIpzaTGj74r9RD5mEeW2e/OHf2AWiutw0mt8P86V7w8nobgAMDkyyIIi8
[+] Bogus user: 123%123, SPA packet: +OdiES5bJzsJ2Vgx3g4fTiQAD/D4NraR0yk6tvdPyfhQ5WEvTzeUgon8RRHXp646RDK/jYSQVdgU7sDf9/WSmiqrMiUGXI2Cz4Vl6HwzkK8jvyrR3VyjK8qLCkG/xq+pOsbwWzYmxirJBcJ+j6+dSakgRgtpICF64
[+] Bogus user: 123.123, SPA packet: +nossY0gFa063W/T3MJg7U6WiOBJ9TdPlbPUbSKtlrgSgNBwWyO3IcD3RZLWf5RKnWFInNZ+ltA6mwu1GCrhRIuzUdlDVBi9v2q6LeCR92eRrCsJmnKCbQjHkKfGiitYHbkvZNqcMZjXGfMuC8wbnc85xhOra1z5M
[+] Bogus user: 123$123, SPA packet: 9/dll4vYi5iIf2P6mdlAVw12HtnlnbrkGs9RkrRa8TD+RtnLlFbKH+jhanLGahHYUI8aU9pbWKTc7sjBARNiu8Hh1tc+c36AYCjiIYijxoVCDiTE7WQ9P+USYQdn5dahFqJLDW3R5y9uVxsGniZ2RbRMltMpuCEdM