@@ -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;
+}
+
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> --- fs/coredump.c | 2 ++ include/fbfam/fbfam.h | 2 ++ security/fbfam/fbfam.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) -- 2.25.1