Commit ab02a954 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of...

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/security-testing-2.6:
  net: don't allow CAP_NET_ADMIN to load non-netdev kernel modules
parents 684adca4 8909c9ad
...@@ -2392,6 +2392,9 @@ extern int netdev_notice(const struct net_device *dev, const char *format, ...) ...@@ -2392,6 +2392,9 @@ extern int netdev_notice(const struct net_device *dev, const char *format, ...)
extern int netdev_info(const struct net_device *dev, const char *format, ...) extern int netdev_info(const struct net_device *dev, const char *format, ...)
__attribute__ ((format (printf, 2, 3))); __attribute__ ((format (printf, 2, 3)));
#define MODULE_ALIAS_NETDEV(device) \
MODULE_ALIAS("netdev-" device)
#if defined(DEBUG) #if defined(DEBUG)
#define netdev_dbg(__dev, format, args...) \ #define netdev_dbg(__dev, format, args...) \
netdev_printk(KERN_DEBUG, __dev, format, ##args) netdev_printk(KERN_DEBUG, __dev, format, ##args)
......
...@@ -1114,13 +1114,21 @@ EXPORT_SYMBOL(netdev_bonding_change); ...@@ -1114,13 +1114,21 @@ EXPORT_SYMBOL(netdev_bonding_change);
void dev_load(struct net *net, const char *name) void dev_load(struct net *net, const char *name)
{ {
struct net_device *dev; struct net_device *dev;
int no_module;
rcu_read_lock(); rcu_read_lock();
dev = dev_get_by_name_rcu(net, name); dev = dev_get_by_name_rcu(net, name);
rcu_read_unlock(); rcu_read_unlock();
if (!dev && capable(CAP_NET_ADMIN)) no_module = !dev;
request_module("%s", name); if (no_module && capable(CAP_NET_ADMIN))
no_module = request_module("netdev-%s", name);
if (no_module && capable(CAP_SYS_MODULE)) {
if (!request_module("%s", name))
pr_err("Loading kernel module for a network device "
"with CAP_SYS_MODULE (deprecated). Use CAP_NET_ADMIN and alias netdev-%s "
"instead\n", name);
}
} }
EXPORT_SYMBOL(dev_load); EXPORT_SYMBOL(dev_load);
......
...@@ -1765,4 +1765,4 @@ module_exit(ipgre_fini); ...@@ -1765,4 +1765,4 @@ module_exit(ipgre_fini);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS_RTNL_LINK("gre"); MODULE_ALIAS_RTNL_LINK("gre");
MODULE_ALIAS_RTNL_LINK("gretap"); MODULE_ALIAS_RTNL_LINK("gretap");
MODULE_ALIAS("gre0"); MODULE_ALIAS_NETDEV("gre0");
...@@ -913,4 +913,4 @@ static void __exit ipip_fini(void) ...@@ -913,4 +913,4 @@ static void __exit ipip_fini(void)
module_init(ipip_init); module_init(ipip_init);
module_exit(ipip_fini); module_exit(ipip_fini);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("tunl0"); MODULE_ALIAS_NETDEV("tunl0");
...@@ -1290,4 +1290,4 @@ static int __init sit_init(void) ...@@ -1290,4 +1290,4 @@ static int __init sit_init(void)
module_init(sit_init); module_init(sit_init);
module_exit(sit_cleanup); module_exit(sit_cleanup);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS("sit0"); MODULE_ALIAS_NETDEV("sit0");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment