Commit 1e98ffea authored by Dmitry Vyukov's avatar Dmitry Vyukov Committed by Pablo Neira Ayuso

netfilter: x_tables: fix pointer leaks to userspace

Several netfilter matches and targets put kernel pointers into
info objects, but don't set usersize in descriptors.
This leads to kernel pointer leaks if a match/target is set
and then read back to userspace.

Properly set usersize for these matches/targets.

Found with manual code inspection.

Fixes: ec231890 ("xtables: extend matches and targets with .usersize")
Signed-off-by: default avatarDmitry Vyukov <dvyukov@google.com>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 0b8d9073
...@@ -252,6 +252,7 @@ static struct xt_target idletimer_tg __read_mostly = { ...@@ -252,6 +252,7 @@ static struct xt_target idletimer_tg __read_mostly = {
.family = NFPROTO_UNSPEC, .family = NFPROTO_UNSPEC,
.target = idletimer_tg_target, .target = idletimer_tg_target,
.targetsize = sizeof(struct idletimer_tg_info), .targetsize = sizeof(struct idletimer_tg_info),
.usersize = offsetof(struct idletimer_tg_info, timer),
.checkentry = idletimer_tg_checkentry, .checkentry = idletimer_tg_checkentry,
.destroy = idletimer_tg_destroy, .destroy = idletimer_tg_destroy,
.me = THIS_MODULE, .me = THIS_MODULE,
......
...@@ -198,6 +198,7 @@ static struct xt_target led_tg_reg __read_mostly = { ...@@ -198,6 +198,7 @@ static struct xt_target led_tg_reg __read_mostly = {
.family = NFPROTO_UNSPEC, .family = NFPROTO_UNSPEC,
.target = led_tg, .target = led_tg,
.targetsize = sizeof(struct xt_led_info), .targetsize = sizeof(struct xt_led_info),
.usersize = offsetof(struct xt_led_info, internal_data),
.checkentry = led_tg_check, .checkentry = led_tg_check,
.destroy = led_tg_destroy, .destroy = led_tg_destroy,
.me = THIS_MODULE, .me = THIS_MODULE,
......
...@@ -193,9 +193,8 @@ static struct xt_match limit_mt_reg __read_mostly = { ...@@ -193,9 +193,8 @@ static struct xt_match limit_mt_reg __read_mostly = {
.compatsize = sizeof(struct compat_xt_rateinfo), .compatsize = sizeof(struct compat_xt_rateinfo),
.compat_from_user = limit_mt_compat_from_user, .compat_from_user = limit_mt_compat_from_user,
.compat_to_user = limit_mt_compat_to_user, .compat_to_user = limit_mt_compat_to_user,
#else
.usersize = offsetof(struct xt_rateinfo, prev),
#endif #endif
.usersize = offsetof(struct xt_rateinfo, prev),
.me = THIS_MODULE, .me = THIS_MODULE,
}; };
......
...@@ -62,6 +62,7 @@ static struct xt_match nfacct_mt_reg __read_mostly = { ...@@ -62,6 +62,7 @@ static struct xt_match nfacct_mt_reg __read_mostly = {
.match = nfacct_mt, .match = nfacct_mt,
.destroy = nfacct_mt_destroy, .destroy = nfacct_mt_destroy,
.matchsize = sizeof(struct xt_nfacct_match_info), .matchsize = sizeof(struct xt_nfacct_match_info),
.usersize = offsetof(struct xt_nfacct_match_info, nfacct),
.me = THIS_MODULE, .me = THIS_MODULE,
}; };
......
...@@ -84,6 +84,7 @@ static struct xt_match xt_statistic_mt_reg __read_mostly = { ...@@ -84,6 +84,7 @@ static struct xt_match xt_statistic_mt_reg __read_mostly = {
.checkentry = statistic_mt_check, .checkentry = statistic_mt_check,
.destroy = statistic_mt_destroy, .destroy = statistic_mt_destroy,
.matchsize = sizeof(struct xt_statistic_info), .matchsize = sizeof(struct xt_statistic_info),
.usersize = offsetof(struct xt_statistic_info, master),
.me = THIS_MODULE, .me = THIS_MODULE,
}; };
......
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