mirror of
https://github.com/berlin-open-wireless-lab/DAWN.git
synced 2025-03-09 15:40:12 +00:00
add a denied auths array
This commit is contained in:
parent
65d26ea5a1
commit
16706d49f7
6 changed files with 170 additions and 1 deletions
|
@ -14,6 +14,7 @@ config hostapd
|
||||||
|
|
||||||
config times
|
config times
|
||||||
option update_client '10'
|
option update_client '10'
|
||||||
|
option denied_req_threshold '15'
|
||||||
option remove_client '15'
|
option remove_client '15'
|
||||||
option remove_probe '120'
|
option remove_probe '120'
|
||||||
option remove_ap '460'
|
option remove_ap '460'
|
||||||
|
|
|
@ -67,6 +67,7 @@ struct time_config_s {
|
||||||
time_t remove_ap;
|
time_t remove_ap;
|
||||||
time_t update_hostapd;
|
time_t update_hostapd;
|
||||||
time_t update_tcp_con;
|
time_t update_tcp_con;
|
||||||
|
time_t denied_req_threshold;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct network_config_s {
|
struct network_config_s {
|
||||||
|
@ -100,6 +101,7 @@ typedef struct probe_entry_s {
|
||||||
uint8_t vht_support;
|
uint8_t vht_support;
|
||||||
time_t time;
|
time_t time;
|
||||||
int counter;
|
int counter;
|
||||||
|
int deny_counter;
|
||||||
} probe_entry;
|
} probe_entry;
|
||||||
|
|
||||||
typedef struct auth_entry_s {
|
typedef struct auth_entry_s {
|
||||||
|
@ -108,6 +110,8 @@ typedef struct auth_entry_s {
|
||||||
uint8_t target_addr[ETH_ALEN];
|
uint8_t target_addr[ETH_ALEN];
|
||||||
uint32_t signal;
|
uint32_t signal;
|
||||||
uint32_t freq;
|
uint32_t freq;
|
||||||
|
time_t time;
|
||||||
|
int counter;
|
||||||
} auth_entry;
|
} auth_entry;
|
||||||
|
|
||||||
typedef struct hostapd_notify_entry_s {
|
typedef struct hostapd_notify_entry_s {
|
||||||
|
@ -117,6 +121,11 @@ typedef struct hostapd_notify_entry_s {
|
||||||
|
|
||||||
typedef struct auth_entry_s assoc_entry;
|
typedef struct auth_entry_s assoc_entry;
|
||||||
|
|
||||||
|
#define DENY_REQ_ARRAY_LEN 100
|
||||||
|
struct auth_entry_s denied_req_array[DENY_REQ_ARRAY_LEN];
|
||||||
|
pthread_mutex_t denied_array_mutex;
|
||||||
|
auth_entry insert_to_denied_req_array(auth_entry entry, int inc_counter);
|
||||||
|
|
||||||
// ---------------- Defines ----------------
|
// ---------------- Defines ----------------
|
||||||
#define PROBE_ARRAY_LEN 1000
|
#define PROBE_ARRAY_LEN 1000
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,11 @@ int init_mutex() {
|
||||||
printf("\n mutex init failed\n");
|
printf("\n mutex init failed\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pthread_mutex_init(&denied_array_mutex, NULL) != 0) {
|
||||||
|
printf("\n mutex init failed\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,10 +45,21 @@ int compare_station_count(uint8_t *bssid_addr_own, uint8_t *bssid_addr_to_compar
|
||||||
int automatic_kick);
|
int automatic_kick);
|
||||||
int compare_ssid(uint8_t *bssid_addr_own, uint8_t *bssid_addr_to_compare);
|
int compare_ssid(uint8_t *bssid_addr_own, uint8_t *bssid_addr_to_compare);
|
||||||
|
|
||||||
|
void denied_req_array_insert(auth_entry entry);
|
||||||
|
|
||||||
|
auth_entry denied_req_array_delete(auth_entry entry);
|
||||||
|
|
||||||
|
int denied_req_array_go_next(char sort_order[], int i, auth_entry entry,
|
||||||
|
auth_entry next_entry);
|
||||||
|
|
||||||
|
int denied_req_array_go_next_help(char sort_order[], int i, auth_entry entry,
|
||||||
|
auth_entry next_entry);
|
||||||
|
|
||||||
int probe_entry_last = -1;
|
int probe_entry_last = -1;
|
||||||
int client_entry_last = -1;
|
int client_entry_last = -1;
|
||||||
int ap_entry_last = -1;
|
int ap_entry_last = -1;
|
||||||
int mac_list_entry_last = -1;
|
int mac_list_entry_last = -1;
|
||||||
|
int denied_req_last = -1;
|
||||||
|
|
||||||
void remove_probe_array_cb(struct uloop_timeout *t);
|
void remove_probe_array_cb(struct uloop_timeout *t);
|
||||||
|
|
||||||
|
@ -68,6 +79,12 @@ struct uloop_timeout ap_timeout = {
|
||||||
.cb = remove_ap_array_cb
|
.cb = remove_ap_array_cb
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void denied_req_array_cb(struct uloop_timeout *t);
|
||||||
|
|
||||||
|
struct uloop_timeout denied_req_timeout = {
|
||||||
|
.cb = denied_req_array_cb
|
||||||
|
};
|
||||||
|
|
||||||
int build_hearing_map_sort_client(struct blob_buf *b)
|
int build_hearing_map_sort_client(struct blob_buf *b)
|
||||||
{
|
{
|
||||||
print_probe_array();
|
print_probe_array();
|
||||||
|
@ -830,6 +847,7 @@ void uloop_add_data_cbs() {
|
||||||
uloop_timeout_add(&probe_timeout);
|
uloop_timeout_add(&probe_timeout);
|
||||||
uloop_timeout_add(&client_timeout);
|
uloop_timeout_add(&client_timeout);
|
||||||
uloop_timeout_add(&ap_timeout);
|
uloop_timeout_add(&ap_timeout);
|
||||||
|
uloop_timeout_add(&denied_req_timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove_probe_array_cb(struct uloop_timeout *t) {
|
void remove_probe_array_cb(struct uloop_timeout *t) {
|
||||||
|
@ -857,6 +875,34 @@ void remove_ap_array_cb(struct uloop_timeout *t) {
|
||||||
uloop_timeout_set(&ap_timeout, timeout_config.remove_ap * 1000);
|
uloop_timeout_set(&ap_timeout, timeout_config.remove_ap * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void denied_req_array_cb(struct uloop_timeout *t) {
|
||||||
|
pthread_mutex_lock(&denied_array_mutex);
|
||||||
|
printf("[ULOOP] : Processing denied AUTH!\n");
|
||||||
|
|
||||||
|
time_t current_time = time(0);
|
||||||
|
|
||||||
|
for (int i = 0; i <= denied_req_last; i++) {
|
||||||
|
// check counter
|
||||||
|
|
||||||
|
//check timer
|
||||||
|
if (denied_req_array[i].time < current_time - timeout_config.denied_req_threshold) {
|
||||||
|
|
||||||
|
// client is not connected for a given time threshold!
|
||||||
|
if(!is_connected(denied_req_array[i].bssid_addr, denied_req_array[i].client_addr))
|
||||||
|
{
|
||||||
|
printf("Client has propaly a BAD DRIVER!\n");
|
||||||
|
if (insert_to_maclist(denied_req_array[i].client_addr) == 0) {
|
||||||
|
send_add_mac(denied_req_array[i].client_addr);
|
||||||
|
write_mac_to_file("/etc/dawn/mac_list", denied_req_array[i].client_addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
denied_req_array_delete(denied_req_array[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&denied_array_mutex);
|
||||||
|
uloop_timeout_set(&denied_req_timeout, timeout_config.denied_req_threshold * 1000);
|
||||||
|
}
|
||||||
|
|
||||||
void insert_client_to_array(client entry) {
|
void insert_client_to_array(client entry) {
|
||||||
pthread_mutex_lock(&client_array_mutex);
|
pthread_mutex_lock(&client_array_mutex);
|
||||||
entry.time = time(0);
|
entry.time = time(0);
|
||||||
|
@ -933,7 +979,108 @@ int mac_in_maclist(uint8_t mac[])
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auth_entry insert_to_denied_req_array(auth_entry entry, int inc_counter) {
|
||||||
|
pthread_mutex_lock(&denied_array_mutex);
|
||||||
|
|
||||||
|
entry.time = time(0);
|
||||||
|
entry.counter = 0;
|
||||||
|
auth_entry tmp = denied_req_array_delete(entry);
|
||||||
|
|
||||||
|
if (mac_is_equal(entry.bssid_addr, tmp.bssid_addr)
|
||||||
|
&& mac_is_equal(entry.client_addr, tmp.client_addr)) {
|
||||||
|
entry.counter = tmp.counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inc_counter) {
|
||||||
|
|
||||||
|
entry.counter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
denied_req_array_insert(entry);
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&denied_array_mutex);
|
||||||
|
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
int denied_req_array_go_next_help(char sort_order[], int i, auth_entry entry,
|
||||||
|
auth_entry next_entry) {
|
||||||
|
switch (sort_order[i]) {
|
||||||
|
// bssid-mac
|
||||||
|
case 'b':
|
||||||
|
return mac_is_greater(entry.bssid_addr, next_entry.bssid_addr);
|
||||||
|
// client-mac
|
||||||
|
case 'c':
|
||||||
|
return mac_is_greater(entry.client_addr, next_entry.client_addr) &&
|
||||||
|
mac_is_equal(entry.bssid_addr, next_entry.bssid_addr);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int denied_req_array_go_next(char sort_order[], int i, auth_entry entry,
|
||||||
|
auth_entry next_entry) {
|
||||||
|
int conditions = 1;
|
||||||
|
for (int j = 0; j < i; j++) {
|
||||||
|
i &= !(denied_req_array_go_next(sort_order, j, entry, next_entry));
|
||||||
|
}
|
||||||
|
return conditions && denied_req_array_go_next_help(sort_order, i, entry, next_entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
void denied_req_array_insert(auth_entry entry) {
|
||||||
|
if (denied_req_last == -1) {
|
||||||
|
denied_req_array[0] = entry;
|
||||||
|
denied_req_last++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i <= denied_req_last; i++) {
|
||||||
|
if (!denied_req_array_go_next("bc", 2, entry, denied_req_array[i])) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j = denied_req_last; j >= i; j--) {
|
||||||
|
if (j + 1 <= DENY_REQ_ARRAY_LEN) {
|
||||||
|
denied_req_array[j + 1] = denied_req_array[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
denied_req_array[i] = entry;
|
||||||
|
|
||||||
|
if (denied_req_last < DENY_REQ_ARRAY_LEN) {
|
||||||
|
denied_req_last++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auth_entry denied_req_array_delete(auth_entry entry) {
|
||||||
|
|
||||||
|
int i;
|
||||||
|
int found_in_array = 0;
|
||||||
|
auth_entry tmp;
|
||||||
|
|
||||||
|
if (denied_req_last == -1) {
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i <= denied_req_last; i++) {
|
||||||
|
if (mac_is_equal(entry.bssid_addr, denied_req_array[i].bssid_addr) &&
|
||||||
|
mac_is_equal(entry.client_addr, denied_req_array[i].client_addr)) {
|
||||||
|
found_in_array = 1;
|
||||||
|
tmp = denied_req_array[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int j = i; j < denied_req_last; j++) {
|
||||||
|
denied_req_array[j] = denied_req_array[j + 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (denied_req_last > -1 && found_in_array) {
|
||||||
|
denied_req_last--;
|
||||||
|
}
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ struct time_config_s uci_get_time_config() {
|
||||||
ret.update_hostapd = uci_lookup_option_int(uci_ctx, s, "update_hostapd");
|
ret.update_hostapd = uci_lookup_option_int(uci_ctx, s, "update_hostapd");
|
||||||
ret.remove_ap = uci_lookup_option_int(uci_ctx, s, "remove_ap");
|
ret.remove_ap = uci_lookup_option_int(uci_ctx, s, "remove_ap");
|
||||||
ret.update_tcp_con = uci_lookup_option_int(uci_ctx, s, "update_tcp_con");
|
ret.update_tcp_con = uci_lookup_option_int(uci_ctx, s, "update_tcp_con");
|
||||||
|
ret.denied_req_threshold = uci_lookup_option_int(uci_ctx, s, "denied_req_threshold");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -405,6 +405,7 @@ static int handle_auth_req(struct blob_attr *msg) {
|
||||||
print_probe_array();
|
print_probe_array();
|
||||||
auth_entry auth_req;
|
auth_entry auth_req;
|
||||||
parse_to_auth_req(msg, &auth_req);
|
parse_to_auth_req(msg, &auth_req);
|
||||||
|
|
||||||
printf("AUTH Entry: ");
|
printf("AUTH Entry: ");
|
||||||
print_auth_entry(auth_req);
|
print_auth_entry(auth_req);
|
||||||
|
|
||||||
|
@ -416,15 +417,18 @@ static int handle_auth_req(struct blob_attr *msg) {
|
||||||
// block if entry was not already found in probe database
|
// block if entry was not already found in probe database
|
||||||
if (!(mac_is_equal(tmp.bssid_addr, auth_req.bssid_addr) && mac_is_equal(tmp.client_addr, auth_req.client_addr))) {
|
if (!(mac_is_equal(tmp.bssid_addr, auth_req.bssid_addr) && mac_is_equal(tmp.client_addr, auth_req.client_addr))) {
|
||||||
printf("DENY AUTH!\n");
|
printf("DENY AUTH!\n");
|
||||||
|
insert_to_denied_req_array(auth_req, 1);
|
||||||
return dawn_metric.deny_auth_reason;
|
return dawn_metric.deny_auth_reason;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!decide_function(&tmp, REQ_TYPE_AUTH)) {
|
if (!decide_function(&tmp, REQ_TYPE_AUTH)) {
|
||||||
printf("DENY AUTH\n");
|
printf("DENY AUTH\n");
|
||||||
|
insert_to_denied_req_array(auth_req, 1);
|
||||||
return dawn_metric.deny_auth_reason;
|
return dawn_metric.deny_auth_reason;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// maybe send here that the client is connected?
|
||||||
|
|
||||||
printf("ALLOW AUTH!\n");
|
printf("ALLOW AUTH!\n");
|
||||||
return WLAN_STATUS_SUCCESS;
|
return WLAN_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -445,11 +449,13 @@ static int handle_assoc_req(struct blob_attr *msg) {
|
||||||
// block if entry was not already found in probe database
|
// block if entry was not already found in probe database
|
||||||
if (!(mac_is_equal(tmp.bssid_addr, auth_req.bssid_addr) && mac_is_equal(tmp.client_addr, auth_req.client_addr))) {
|
if (!(mac_is_equal(tmp.bssid_addr, auth_req.bssid_addr) && mac_is_equal(tmp.client_addr, auth_req.client_addr))) {
|
||||||
printf("DENY ASSOC!\n");
|
printf("DENY ASSOC!\n");
|
||||||
|
insert_to_denied_req_array(auth_req, 1);
|
||||||
return dawn_metric.deny_assoc_reason;
|
return dawn_metric.deny_assoc_reason;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!decide_function(&tmp, REQ_TYPE_ASSOC)) {
|
if (!decide_function(&tmp, REQ_TYPE_ASSOC)) {
|
||||||
printf("DENY ASSOC\n");
|
printf("DENY ASSOC\n");
|
||||||
|
insert_to_denied_req_array(auth_req, 1);
|
||||||
return dawn_metric.deny_assoc_reason;
|
return dawn_metric.deny_assoc_reason;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue