Skip to content
Permalink
Browse files
security/fbfam: Detect a fork brute force attack
To detect a fork brute force attack it is necessary to compute the
crashing rate of the application. This calculation is performed in each
fatal fail of a task, or in other words, when a core dump is triggered.
If this rate shows that the application is crashing quickly, there is a
clear signal that an attack is happening.

Since the crashing rate is computed in milliseconds per fault, if this
rate goes under a certain threshold a warning is triggered.

Signed-off-by: John Wood <john.wood@gmx.com>
  • Loading branch information
johwood authored and intel-lab-lkp committed Sep 10, 2020
1 parent 3c41a9b commit 2a9c0b8f7327cdab5ef73c9a9a4447d25c084bca
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 0 deletions.
@@ -51,6 +51,7 @@
#include "internal.h"

#include <trace/events/sched.h>
#include <fbfam/fbfam.h>

int core_uses_pid;
unsigned int core_pipe_limit;
@@ -825,6 +826,7 @@ void do_coredump(const kernel_siginfo_t *siginfo)
fail_creds:
put_cred(cred);
fail:
fbfam_handle_attack(siginfo->si_signo);
return;
}

@@ -12,10 +12,12 @@ extern struct ctl_table fbfam_sysctls[];
int fbfam_fork(struct task_struct *child);
int fbfam_execve(void);
int fbfam_exit(void);
int fbfam_handle_attack(int signal);
#else
static inline int fbfam_fork(struct task_struct *child) { return 0; }
static inline int fbfam_execve(void) { return 0; }
static inline int fbfam_exit(void) { return 0; }
static inline int fbfam_handle_attack(int signal) { return 0; }
#endif

#endif /* _FBFAM_H_ */
@@ -4,7 +4,9 @@
#include <linux/errno.h>
#include <linux/gfp.h>
#include <linux/jiffies.h>
#include <linux/printk.h>
#include <linux/refcount.h>
#include <linux/signal.h>
#include <linux/slab.h>

/**
@@ -172,3 +174,40 @@ int fbfam_exit(void)
return 0;
}

/**
* fbfam_handle_attack() - Fork brute force attack detection.
* @signal: Signal number that causes the core dump.
*
* The crashing rate of an application is computed in milliseconds per fault in
* each crash. So, if this rate goes under a certain threshold there is a clear
* signal that the application is crashing quickly. At this moment, a fork brute
* force attack is happening.
*
* Return: -EFAULT if the current task doesn't have statistical data. Zero
* otherwise.
*/
int fbfam_handle_attack(int signal)
{
struct fbfam_stats *stats = current->fbfam_stats;
u64 delta_jiffies, delta_time;
u64 crashing_rate;

if (!stats)
return -EFAULT;

if (!(signal == SIGILL || signal == SIGBUS || signal == SIGKILL ||
signal == SIGSEGV || signal == SIGSYS))
return 0;

stats->faults += 1;

delta_jiffies = get_jiffies_64() - stats->jiffies;
delta_time = jiffies64_to_msecs(delta_jiffies);
crashing_rate = delta_time / (u64)stats->faults;

if (crashing_rate < (u64)sysctl_crashing_rate_threshold)
pr_warn("fbfam: Fork brute force attack detected\n");

return 0;
}

0 comments on commit 2a9c0b8

Please sign in to comment.