From 44d2b52d308fe22a71c33e4b4619daaa85109144 Mon Sep 17 00:00:00 2001 From: Donald Buczek Date: Tue, 11 Aug 2026 13:47:00 +0200 Subject: [PATCH] Add module load whitelist feature Add an optional module-load whitelist, enforced via modprobe.d directives and parsed by the same libkmod-config.c machinery used for blacklist, options, softdep, etc. Entries live in the normal modprobe.d drop-in directories and are merged the same way as every other directive; there is no separate whitelist config file. Directives: whitelist-enable turn on enforcement whitelist-test-mode audit mode: log what would be denied, but still permit the load whitelist add an entry (hyphens normalised to underscores, same as other module names) Semantics: - No whitelist-enable anywhere in the merged config: all modules allowed (opt-in, no behavior change by default) - whitelist-enable present, no whitelist entries: all modules denied - whitelist-enable present with entries: only listed modules allowed module_is_whitelisted()/module_whitelist_check() in libkmod-module.c mirror the existing blacklist handling and are called from kmod_module_probe_insert_module() after the blacklist check. Since the kernel always invokes the autoload helper as "modprobe -q", which silences NOTICE()-level messages, whitelist denial and test-mode messages are logged via kmod_log() directly so they stay visible despite -q. Whitelist state (whitelists list, whitelist_active/ whitelist_test_mode flags) lives in struct kmod_config with the same per-kmod_ctx lifecycle as blacklist: populated at config load, freed in kmod_config_free(). Unlike the original out-of-tree implementation this version has no process-global state, so it is thread-safe like the rest of libkmod. Covered by testsuite/test-modprobe.c and documented in man/modprobe.d.5.scd. Link: https://github.com/kmod-project/kmod/issues/444 --- libkmod/libkmod-config.c | 38 ++++++++++++ libkmod/libkmod-internal.h | 4 ++ libkmod/libkmod-module.c | 44 ++++++++++++++ libkmod/libkmod.h | 2 +- man/modprobe.d.5.scd | 17 ++++++ scripts/setup-rootfs.sh | 3 + .../etc/modprobe.d/modprobe.conf | 2 + .../lib/modules/3.3.3/modules.alias | 1 + .../lib/modules/3.3.3/modules.alias.bin | Bin 0 -> 12 bytes .../lib/modules/3.3.3/modules.builtin.bin | 0 .../lib/modules/3.3.3/modules.dep | 1 + .../lib/modules/3.3.3/modules.dep.bin | Bin 0 -> 58 bytes .../lib/modules/3.3.3/modules.devname | 1 + .../lib/modules/3.3.3/modules.softdep | 1 + .../lib/modules/3.3.3/modules.symbols | 1 + .../lib/modules/3.3.3/modules.symbols.bin | Bin 0 -> 12 bytes .../whitelist-allowed/proc/modules | 0 .../etc/modprobe.d/modprobe.conf | 1 + .../lib/modules/3.3.3/modules.alias | 1 + .../lib/modules/3.3.3/modules.alias.bin | Bin 0 -> 12 bytes .../lib/modules/3.3.3/modules.builtin.bin | 0 .../lib/modules/3.3.3/modules.dep | 1 + .../lib/modules/3.3.3/modules.dep.bin | Bin 0 -> 58 bytes .../lib/modules/3.3.3/modules.devname | 1 + .../lib/modules/3.3.3/modules.softdep | 1 + .../lib/modules/3.3.3/modules.symbols | 1 + .../lib/modules/3.3.3/modules.symbols.bin | Bin 0 -> 12 bytes .../whitelist-deny-all/proc/modules | 0 .../lib/modules/3.3.3/modules.alias | 1 + .../lib/modules/3.3.3/modules.alias.bin | Bin 0 -> 12 bytes .../lib/modules/3.3.3/modules.builtin.bin | 0 .../lib/modules/3.3.3/modules.dep | 1 + .../lib/modules/3.3.3/modules.dep.bin | Bin 0 -> 58 bytes .../lib/modules/3.3.3/modules.devname | 1 + .../lib/modules/3.3.3/modules.softdep | 1 + .../lib/modules/3.3.3/modules.symbols | 1 + .../lib/modules/3.3.3/modules.symbols.bin | Bin 0 -> 12 bytes .../whitelist-inactive/proc/modules | 0 .../etc/modprobe.d/modprobe.conf | 2 + .../lib/modules/3.3.3/modules.alias | 1 + .../lib/modules/3.3.3/modules.alias.bin | Bin 0 -> 12 bytes .../lib/modules/3.3.3/modules.builtin.bin | 0 .../lib/modules/3.3.3/modules.dep | 1 + .../lib/modules/3.3.3/modules.dep.bin | Bin 0 -> 58 bytes .../lib/modules/3.3.3/modules.devname | 1 + .../lib/modules/3.3.3/modules.softdep | 1 + .../lib/modules/3.3.3/modules.symbols | 1 + .../lib/modules/3.3.3/modules.symbols.bin | Bin 0 -> 12 bytes .../whitelist-test-mode/proc/modules | 0 testsuite/test-modprobe.c | 56 ++++++++++++++++++ 50 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/etc/modprobe.d/modprobe.conf create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.alias create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.builtin.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.dep create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.devname create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/proc/modules create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/etc/modprobe.d/modprobe.conf create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.alias create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.builtin.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.dep create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.devname create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/proc/modules create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.alias create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.builtin.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.dep create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.devname create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/proc/modules create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/etc/modprobe.d/modprobe.conf create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.alias create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.alias.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.builtin.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.dep create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.dep.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.devname create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.softdep create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.symbols create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.symbols.bin create mode 100644 testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/proc/modules diff --git a/libkmod/libkmod-config.c b/libkmod/libkmod-config.c index 6938ff999..09f10a5f7 100644 --- a/libkmod/libkmod-config.c +++ b/libkmod/libkmod-config.c @@ -56,6 +56,11 @@ const char *kmod_blacklist_get_modname(const struct kmod_list *l) return l->data; } +const char *kmod_whitelist_get_modname(const struct kmod_list *l) +{ + return l->data; +} + const char *kmod_alias_get_name(const struct kmod_list *l) { const struct kmod_alias *alias = l->data; @@ -232,6 +237,27 @@ static int kmod_config_add_blacklist(struct kmod_config *config, const char *mod return 0; } +static int kmod_config_add_whitelist(struct kmod_config *config, const char *modname) +{ + _cleanup_free_ char *p; + struct kmod_list *list; + + DBG(config->ctx, "modname=%s\n", modname); + + _clang_suppress_alloc_ p = strdup(modname); + if (!p) + return -ENOMEM; + + list = kmod_list_append(config->whitelists, p); + if (!list) + return -ENOMEM; + + TAKE_PTR(p); + config->whitelists = list; + + return 0; +} + static int kmod_config_add_softdep(struct kmod_config *config, const char *modname, const char *line) { @@ -810,6 +836,17 @@ static int kmod_config_parse(struct kmod_config *config, int fd, const char *fil goto syntax_error; kmod_config_add_blacklist(config, modname); + } else if (streq(cmd, "whitelist")) { + char *modname = strtok_r(NULL, "\t ", &saveptr); + + if (underscores(modname) < 0) + goto syntax_error; + + kmod_config_add_whitelist(config, modname); + } else if (streq(cmd, "whitelist-enable")) { + config->whitelist_active = true; + } else if (streq(cmd, "whitelist-test-mode")) { + config->whitelist_test_mode = true; } else if (streq(cmd, "options")) { char *modname = strtok_r(NULL, "\t ", &saveptr); char *options = strtok_r(NULL, "\0", &saveptr); @@ -879,6 +916,7 @@ void kmod_config_free(struct kmod_config *config) kmod_list_release(config->remove_commands, free); kmod_list_release(config->softdeps, free); kmod_list_release(config->weakdeps, free); + kmod_list_release(config->whitelists, free); kmod_list_release(config->paths, free); free(config); } diff --git a/libkmod/libkmod-internal.h b/libkmod/libkmod-internal.h index e85666234..2f327477c 100644 --- a/libkmod/libkmod-internal.h +++ b/libkmod/libkmod-internal.h @@ -103,6 +103,9 @@ struct kmod_config { struct kmod_list *install_commands; struct kmod_list *softdeps; struct kmod_list *weakdeps; + struct kmod_list *whitelists; + bool whitelist_active; + bool whitelist_test_mode; struct kmod_list *paths; }; @@ -110,6 +113,7 @@ struct kmod_config { _nonnull_all_ int kmod_config_new(struct kmod_ctx *ctx, struct kmod_config **config, const char *const *config_paths); _nonnull_all_ void kmod_config_free(struct kmod_config *config); _nonnull_all_ const char *kmod_blacklist_get_modname(const struct kmod_list *l); +_nonnull_all_ const char *kmod_whitelist_get_modname(const struct kmod_list *l); _nonnull_all_ const char *kmod_alias_get_name(const struct kmod_list *l); _nonnull_all_ const char *kmod_alias_get_modname(const struct kmod_list *l); _nonnull_all_ const char *kmod_option_get_options(const struct kmod_list *l); diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c index 4d8ca9503..5d4fd7f0d 100644 --- a/libkmod/libkmod-module.c +++ b/libkmod/libkmod-module.c @@ -737,6 +737,23 @@ static bool module_is_blacklisted(const struct kmod_module *mod) return false; } +static bool module_is_whitelisted(const struct kmod_module *mod) +{ + const struct kmod_ctx *ctx = mod->ctx; + const struct kmod_config *config = kmod_get_config(ctx); + const struct kmod_list *wl = config->whitelists; + const struct kmod_list *l; + + kmod_list_foreach(l, wl) { + const char *modname = kmod_whitelist_get_modname(l); + + if (streq(modname, mod->name)) + return true; + } + + return false; +} + KMOD_EXPORT int kmod_module_apply_filter(const struct kmod_ctx *ctx, enum kmod_filter filter_type, const struct kmod_list *input, @@ -1002,6 +1019,30 @@ static int kmod_module_get_probe_list(struct kmod_module *mod, bool ignorecmd, return err; } +static bool module_whitelist_check(struct kmod_module *mod) +{ + const struct kmod_config *config = kmod_get_config(mod->ctx); + + if (!config->whitelist_active || module_is_whitelisted(mod)) + return true; + + /* + * Bypass the usual NOTICE() verbosity gate: the kernel always invokes + * the modprobe autoload helper with -q, which would otherwise + * silence this message entirely, defeating whitelist auditing. + */ + if (config->whitelist_test_mode) { + kmod_log(mod->ctx, LOG_NOTICE, __FILE__, __LINE__, __func__, + "whitelist: module '%s' would be denied (test mode active, load permitted)\n", + mod->name); + return true; + } + + kmod_log(mod->ctx, LOG_NOTICE, __FILE__, __LINE__, __func__, + "whitelist: module '%s' not in whitelist, denied\n", mod->name); + return false; +} + KMOD_EXPORT int kmod_module_probe_insert_module( struct kmod_module *mod, unsigned int flags, const char *extra_options, int (*run_install)(struct kmod_module *m, const char *cmd, void *data), @@ -1033,6 +1074,9 @@ KMOD_EXPORT int kmod_module_probe_insert_module( return KMOD_PROBE_APPLY_BLACKLIST; } + if (!module_whitelist_check(mod)) + return -EPERM; + err = kmod_module_get_probe_list(mod, !!(flags & KMOD_PROBE_IGNORE_COMMAND), &list); if (err < 0) diff --git a/libkmod/libkmod.h b/libkmod/libkmod.h index 04920b7c6..073f35723 100644 --- a/libkmod/libkmod.h +++ b/libkmod/libkmod.h @@ -780,7 +780,7 @@ enum kmod_probe { * output or in dry-run mode. * * Insert a module in the kernel resolving dependencies, soft dependencies, - * install commands and applying blacklist. + * install commands and applying blacklist and whitelist. * * If @run_install is NULL, this function will fork and exec by calling * system(3). Don't pass a NULL argument in @run_install if your binary is diff --git a/man/modprobe.d.5.scd b/man/modprobe.d.5.scd index d57b7c6f7..62fb6d72b 100644 --- a/man/modprobe.d.5.scd +++ b/man/modprobe.d.5.scd @@ -156,6 +156,23 @@ weakdep _modulename_ _modules_ required/desired at runtime. When c is loaded and is being probed, it may issue calls to request_module() causing a or b to also be loaded. +whitelist _modulename_ + Adds _modulename_ to the whitelist of modules that are permitted to + load. This command only has an effect once *whitelist-enable* is + also given (in this or any other configuration file); by itself, a + *whitelist* entry is parsed but has no effect. + +whitelist-enable + Enables whitelist enforcement, where only modules listed via + *whitelist* commands are permitted to load, and all other modules + are denied. + +whitelist-test-mode + Used together with *whitelist-enable*. Modules that the whitelist + would otherwise deny are still permitted to load; a notice is logged + instead, reporting which module would have been denied. This allows + auditing the effect of a whitelist before enforcing it. + # COMPATIBILITY A future version of kmod will come with a strong warning to avoid use of the diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh index 07e3369cf..f70d968c7 100755 --- a/scripts/setup-rootfs.sh +++ b/scripts/setup-rootfs.sh @@ -111,6 +111,9 @@ map=( ["test-modprobe/blacklist-loaded$MODULE_DIRECTORY/4.4.4/kernel/"]="mod-simple.ko" ["test-modprobe/blacklist-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-foo-a.ko"]="mod-foo-a.ko" ["test-modprobe/blacklist-softdep$MODULE_DIRECTORY/4.4.4/kernel/mod-simple.ko"]="mod-simple.ko" + ["test-modprobe/whitelist-inactive$MODULE_DIRECTORY/3.3.3/kernel/"]="mod-simple.ko" + ["test-modprobe/whitelist-allowed$MODULE_DIRECTORY/3.3.3/kernel/"]="mod-simple.ko" + ["test-modprobe/whitelist-test-mode$MODULE_DIRECTORY/3.3.3/kernel/"]="mod-simple.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/block/cciss.ko"]="mod-fake-cciss.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/scsi/hpsa.ko"]="mod-fake-hpsa.ko" ["test-depmod/modules-order-compressed$MODULE_DIRECTORY/4.4.4/kernel/drivers/scsi/scsi_mod.ko"]="mod-fake-scsi-mod.ko" diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/etc/modprobe.d/modprobe.conf b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/etc/modprobe.d/modprobe.conf new file mode 100644 index 000000000..182fc5560 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/etc/modprobe.d/modprobe.conf @@ -0,0 +1,2 @@ +whitelist-enable +whitelist mod-simple diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.alias b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.alias new file mode 100644 index 000000000..ba76e1815 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.alias.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.builtin.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.builtin.bin new file mode 100644 index 000000000..e69de29bb diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.dep b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.dep new file mode 100644 index 000000000..54766537f --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.dep @@ -0,0 +1 @@ +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.dep.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..b09a85432309c43f99500d6cc3473bcb1ef0a80e GIT binary patch literal 58 zcmdnM{w17&iGfjpfx#p{CB8T_w;(5#0SFjDM0RRXUTThhZhnd`L`E+=--;nO_W%O} F4*<8l52gSB literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.devname b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.devname new file mode 100644 index 000000000..58f6d6d69 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.softdep b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.softdep new file mode 100644 index 000000000..5554ccca7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.symbols b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.symbols new file mode 100644 index 000000000..618c345f7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.symbols @@ -0,0 +1 @@ +# Aliases for symbols, used by symbol_request(). diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.symbols.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/lib/modules/3.3.3/modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/proc/modules b/testsuite/rootfs-pristine/test-modprobe/whitelist-allowed/proc/modules new file mode 100644 index 000000000..e69de29bb diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/etc/modprobe.d/modprobe.conf b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/etc/modprobe.d/modprobe.conf new file mode 100644 index 000000000..f62548a7a --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/etc/modprobe.d/modprobe.conf @@ -0,0 +1 @@ +whitelist-enable diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.alias b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.alias new file mode 100644 index 000000000..ba76e1815 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.alias.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.builtin.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.builtin.bin new file mode 100644 index 000000000..e69de29bb diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.dep b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.dep new file mode 100644 index 000000000..54766537f --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.dep @@ -0,0 +1 @@ +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.dep.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..b09a85432309c43f99500d6cc3473bcb1ef0a80e GIT binary patch literal 58 zcmdnM{w17&iGfjpfx#p{CB8T_w;(5#0SFjDM0RRXUTThhZhnd`L`E+=--;nO_W%O} F4*<8l52gSB literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.devname b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.devname new file mode 100644 index 000000000..58f6d6d69 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.softdep b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.softdep new file mode 100644 index 000000000..5554ccca7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.symbols b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.symbols new file mode 100644 index 000000000..618c345f7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.symbols @@ -0,0 +1 @@ +# Aliases for symbols, used by symbol_request(). diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.symbols.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/lib/modules/3.3.3/modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/proc/modules b/testsuite/rootfs-pristine/test-modprobe/whitelist-deny-all/proc/modules new file mode 100644 index 000000000..e69de29bb diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.alias b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.alias new file mode 100644 index 000000000..ba76e1815 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.alias.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.builtin.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.builtin.bin new file mode 100644 index 000000000..e69de29bb diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.dep b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.dep new file mode 100644 index 000000000..54766537f --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.dep @@ -0,0 +1 @@ +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.dep.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..b09a85432309c43f99500d6cc3473bcb1ef0a80e GIT binary patch literal 58 zcmdnM{w17&iGfjpfx#p{CB8T_w;(5#0SFjDM0RRXUTThhZhnd`L`E+=--;nO_W%O} F4*<8l52gSB literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.devname b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.devname new file mode 100644 index 000000000..58f6d6d69 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.softdep b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.softdep new file mode 100644 index 000000000..5554ccca7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.symbols b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.symbols new file mode 100644 index 000000000..618c345f7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.symbols @@ -0,0 +1 @@ +# Aliases for symbols, used by symbol_request(). diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.symbols.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/lib/modules/3.3.3/modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/proc/modules b/testsuite/rootfs-pristine/test-modprobe/whitelist-inactive/proc/modules new file mode 100644 index 000000000..e69de29bb diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/etc/modprobe.d/modprobe.conf b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/etc/modprobe.d/modprobe.conf new file mode 100644 index 000000000..4109b98ff --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/etc/modprobe.d/modprobe.conf @@ -0,0 +1,2 @@ +whitelist-enable +whitelist-test-mode diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.alias b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.alias new file mode 100644 index 000000000..ba76e1815 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.alias @@ -0,0 +1 @@ +# Aliases extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.alias.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.alias.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.builtin.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.builtin.bin new file mode 100644 index 000000000..e69de29bb diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.dep b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.dep new file mode 100644 index 000000000..54766537f --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.dep @@ -0,0 +1 @@ +kernel/mod-simple.ko: diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.dep.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.dep.bin new file mode 100644 index 0000000000000000000000000000000000000000..b09a85432309c43f99500d6cc3473bcb1ef0a80e GIT binary patch literal 58 zcmdnM{w17&iGfjpfx#p{CB8T_w;(5#0SFjDM0RRXUTThhZhnd`L`E+=--;nO_W%O} F4*<8l52gSB literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.devname b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.devname new file mode 100644 index 000000000..58f6d6d69 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.devname @@ -0,0 +1 @@ +# Device nodes to trigger on-demand module loading. diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.softdep b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.softdep new file mode 100644 index 000000000..5554ccca7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.softdep @@ -0,0 +1 @@ +# Soft dependencies extracted from modules themselves. diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.symbols b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.symbols new file mode 100644 index 000000000..618c345f7 --- /dev/null +++ b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.symbols @@ -0,0 +1 @@ +# Aliases for symbols, used by symbol_request(). diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.symbols.bin b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/lib/modules/3.3.3/modules.symbols.bin new file mode 100644 index 0000000000000000000000000000000000000000..7075435f6268c4d815aec093d61e26647666ba76 GIT binary patch literal 12 TcmdnM{w17&iGh)Ufq@4A6;A>Z literal 0 HcmV?d00001 diff --git a/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/proc/modules b/testsuite/rootfs-pristine/test-modprobe/whitelist-test-mode/proc/modules new file mode 100644 index 000000000..e69de29bb diff --git a/testsuite/test-modprobe.c b/testsuite/test-modprobe.c index 7a3cd4f88..caec5c314 100644 --- a/testsuite/test-modprobe.c +++ b/testsuite/test-modprobe.c @@ -493,4 +493,60 @@ DEFINE_TEST(modprobe_blacklisted_softdep, .modules_loaded = "mod-simple,mod-foo-a", ); +static int modprobe_whitelist_inactive(void) +{ + return EXEC_TOOL(modprobe, "mod-simple"); +} +DEFINE_TEST(modprobe_whitelist_inactive, + .description = "check that modules load normally when no whitelist directive is configured", + .config = { + [TC_UNAME_R] = "3.3.3", + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/whitelist-inactive", + [TC_INIT_MODULE_RETCODES] = "", + }, + .modules_loaded = "mod-simple", + ); + +static int modprobe_whitelist_deny_all(void) +{ + return EXEC_TOOL(modprobe, "mod-simple"); +} +DEFINE_TEST(modprobe_whitelist_deny_all, + .description = "check that modules are denied when whitelist-enable is set with no entries", + .config = { + [TC_UNAME_R] = "3.3.3", + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/whitelist-deny-all", + [TC_INIT_MODULE_RETCODES] = "", + }, + .expected_fail = true, + ); + +static int modprobe_whitelist_allowed(void) +{ + return EXEC_TOOL(modprobe, "mod-simple"); +} +DEFINE_TEST(modprobe_whitelist_allowed, + .description = "check that a listed module loads, also verifying hyphen/underscore normalisation", + .config = { + [TC_UNAME_R] = "3.3.3", + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/whitelist-allowed", + [TC_INIT_MODULE_RETCODES] = "", + }, + .modules_loaded = "mod-simple", + ); + +static int modprobe_whitelist_test_mode(void) +{ + return EXEC_TOOL(modprobe, "mod-simple"); +} +DEFINE_TEST(modprobe_whitelist_test_mode, + .description = "check that whitelist-test-mode permits loading a module that would otherwise be denied", + .config = { + [TC_UNAME_R] = "3.3.3", + [TC_ROOTFS] = TESTSUITE_ROOTFS "test-modprobe/whitelist-test-mode", + [TC_INIT_MODULE_RETCODES] = "", + }, + .modules_loaded = "mod-simple", + ); + TESTSUITE_MAIN();