summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWill McVicker <willmcvicker@google.com>2021-04-13 15:59:41 -0700
committerWill McVicker <willmcvicker@google.com>2021-05-07 22:01:36 +0000
commit365fd304167c24aaa9968f21e8ff6392d16909cc (patch)
treea8c3bd3542b344cf0c62e9186c4f5c52693429f0
parentb230f517500e6dc358ba65dafb4a6ed18449500e (diff)
ANDROID: xt_qtaguid: fix UAF race
Make sure to hold the sock_tag_list_lock while accessing the tag to avoid a race between getting the tag and free'ing the tag. Bug: 184018316 Fixes: c7ca0ac69702 ("ANDROID: netfilter: xt_qtaguid: add qtaguid matching module") Signed-off-by: Will McVicker <willmcvicker@google.com> Change-Id: I62404bdaa602586e00821a7d4c5f9b9868a0e90a
-rw-r--r--net/netfilter/xt_qtaguid.c19
1 files changed, 5 insertions, 14 deletions
diff --git a/net/netfilter/xt_qtaguid.c b/net/netfilter/xt_qtaguid.c
index 4e6c6842e5de..500b5c944a41 100644
--- a/net/netfilter/xt_qtaguid.c
+++ b/net/netfilter/xt_qtaguid.c
@@ -1067,18 +1067,6 @@ static struct sock_tag *get_sock_stat_nl(const struct sock *sk)
return sock_tag_tree_search(&sock_tag_tree, sk);
}
-static struct sock_tag *get_sock_stat(const struct sock *sk)
-{
- struct sock_tag *sock_tag_entry;
- MT_DEBUG("qtaguid: get_sock_stat(sk=%p)\n", sk);
- if (!sk)
- return NULL;
- spin_lock_bh(&sock_tag_list_lock);
- sock_tag_entry = get_sock_stat_nl(sk);
- spin_unlock_bh(&sock_tag_list_lock);
- return sock_tag_entry;
-}
-
static int ipx_proto(const struct sk_buff *skb,
struct xt_action_param *par)
{
@@ -1310,12 +1298,15 @@ static void if_tag_stat_update(const char *ifname, uid_t uid,
* Look for a tagged sock.
* It will have an acct_uid.
*/
- sock_tag_entry = get_sock_stat(sk);
+ spin_lock_bh(&sock_tag_list_lock);
+ sock_tag_entry = sk ? get_sock_stat_nl(sk) : NULL;
if (sock_tag_entry) {
tag = sock_tag_entry->tag;
acct_tag = get_atag_from_tag(tag);
uid_tag = get_utag_from_tag(tag);
- } else {
+ }
+ spin_unlock_bh(&sock_tag_list_lock);
+ if (!sock_tag_entry) {
acct_tag = make_atag_from_value(0);
tag = combine_atag_with_uid(acct_tag, uid);
uid_tag = make_tag_from_uid(uid);