Skip to content

Instantly share code, notes, and snippets.

@tixxdz
Created November 27, 2017 11:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tixxdz/cf567e4275714199a32c4a80de4ea63a to your computer and use it in GitHub Desktop.
Save tixxdz/cf567e4275714199a32c4a80de4ea63a to your computer and use it in GitHub Desktop.
prctl - module autoload mode - v5
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/prctl.h>
#include <sys/prctl.h>
#include <sys/ptrace.h>
enum {
MODULES_AUTOLOAD_ALLOWED = 0,
MODULES_AUTOLOAD_PRIVILEGED = 1,
MODULES_AUTOLOAD_DISABLED = 2,
};
#ifndef PR_SET_MODULES_AUTOLOAD_MODE
#define PR_SET_MODULES_AUTOLOAD_MODE 50
#define PR_GET_MODULES_AUTOLOAD_MODE 51
#endif
extern char **environ;
static char *args[] = { "/bin/bash", NULL };
int exec_command(int mode)
{
int ret;
ret = prctl(PR_SET_MODULES_AUTOLOAD_MODE, mode, 0, 0, 0);
if (ret < 0) {
fprintf(stderr, "Error PR_SET_MODULES_AUTOLOAD_MODE to 2 failed: %d (%m)\n", -errno);
return EXIT_FAILURE;
}
ret = prctl(PR_GET_MODULES_AUTOLOAD_MODE, 0, 0, 0, 0);
if (ret < 0) {
fprintf(stderr, "Error PR_GET_MODULES_AUTOLOAD_MODE failed: %d (%m)\n", -errno);
return EXIT_FAILURE;
}
printf("task modules_autoload_mode: %d\n", ret);
execv(args[0], args);
fprintf(stderr, "error on execve(): %d (%m)\n", -errno);
exit(EXIT_FAILURE);
}
int main(int argc, const char **argv)
{
int ret;
int mode = 0;
if (argc > 1) {
errno = 0;
mode = strtol(argv[1], NULL, 10);
if (errno != 0 && mode == 0) {
fprintf(stderr, "Error parsing argument\n");
return EXIT_FAILURE;
}
}
if (mode > 0)
return exec_command(mode);
ret = prctl(PR_GET_MODULES_AUTOLOAD_MODE, 0, 0, 0, 0);
if (ret < 0) {
fprintf(stderr, "Error PR_GET_MODULES_AUTOLOAD_MODE failed: %d (%m)\n", -errno);
return EXIT_FAILURE;
}
ret = prctl(PR_SET_MODULES_AUTOLOAD_MODE, MODULES_AUTOLOAD_PRIVILEGED,
0, 0, 0);
if (ret < 0) {
fprintf(stderr, "Error PR_SET_MODULES_AUTOLOAD_MODE to 1 failed: %d (%m)\n", -errno);
return EXIT_FAILURE;
}
/* Pass extra non-zero argument */
ret = prctl(PR_GET_MODULES_AUTOLOAD_MODE, 1, 0, 0, 0);
if (ret >= 0 || errno != EINVAL) {
printf("Error PR_GET_MODULES_AUTOLOAD_MODE should fail with -EINVAL");
return EXIT_FAILURE;
}
ret = prctl(PR_GET_MODULES_AUTOLOAD_MODE, 0, 0, 0, 0);
if (ret < 0) {
fprintf(stderr, "Error PR_GET_MODULES_AUTOLOAD_MODE failed: %d (%m)\n", -errno);
return EXIT_FAILURE;
}
printf("task modules_autoload_mode: %d\n", ret);
if (ret != 1) {
fprintf(stderr, "Error PR_GET_MODULES_AUTOLOAD_MODE should return 1\n");
return EXIT_FAILURE;
}
/* Should fail with -EPERM */
ret = prctl(PR_SET_MODULES_AUTOLOAD_MODE, MODULES_AUTOLOAD_ALLOWED,
0, 0, 0);
if (ret < 0) {
fprintf(stderr, "PR_SET_MODULES_AUTOLOAD_MODE to 0 failed: %d (%m)\n", -errno);
} else {
fprintf(stderr, "Error PR_SET_MODULES_AUTOLOAD_MODE to 0 succeeded\n");
return EXIT_FAILURE;
}
return exec_command(MODULES_AUTOLOAD_DISABLED);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment