Skip to content

Instantly share code, notes, and snippets.

@tixxdz
Created November 28, 2017 15:20
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/f73f60e637da4d6b42cecdd154fb01b0 to your computer and use it in GitHub Desktop.
Save tixxdz/f73f60e637da4d6b42cecdd154fb01b0 to your computer and use it in GitHub Desktop.
4.15-rc1 - prctl - module autoload test tool
#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 52
#define PR_GET_MODULES_AUTOLOAD_MODE 53
#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