FAILED: patch "[PATCH] mm: prevent vm_area_struct::anon_name refcount saturation" failed to apply to 5.15-stable tree
Subsystems (5)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 96403e11283def1d1c465c8279514c9a504d8630 Mon Sep 17 00:00:00 2001
From: Suren Baghdasaryan <[email protected]>
Date: Fri, 4 Mar 2022 20:28:55 -0800
Subject: [PATCH] mm: prevent vm_area_struct::anon_name refcount saturation
A deep process chain with many vmas could grow really high. With default sysctl_max_map_count (64k) and default pid_max (32k) the max number of vmas in the system is 2147450880 and the refcounter has headroom of 1073774592 before it reaches REFCOUNT_SATURATED (3221225472).
Therefore it's unlikely that an anonymous name refcounter will overflow with these defaults. Currently the max for pid_max is PID_MAX_LIMIT (4194304) and for sysctl_max_map_count it's INT_MAX (2147483647). In this configuration anon_vma_name refcount overflow becomes theoretically possible (that still require heavy sharing of that anon_vma_name between processes).
kref refcounting interface used in anon_vma_name structure will detect a counter overflow when it reaches REFCOUNT_SATURATED value but will only generate a warning and freeze the ref counter. This would lead to the refcounted object never being freed. A determined attacker could leak memory like that but it would be rather expensive and inefficient way to do so.
To ensure anon_vma_name refcount does not overflow, stop anon_vma_name sharing when the refcount reaches REFCOUNT_MAX (2147483647), which still leaves INT_MAX/2 (1073741823) values before the counter reaches REFCOUNT_SATURATED. This should provide enough headroom for raising the refcounts temporarily.
include/linux/mm_inline.h +14 -4
@@ -161,15 +161,25 @@ static inline void anon_vma_name_put(struct anon_vma_name *anon_name)kref_put (&anon_name->kref, anon_vma_name_free); } +static inline +struct anon_vma_name *anon_vma_name_reuse (struct anon_vma_name *anon_name) +{ +/* Prevent anon_name refcount saturation early on */ +if (kref_read (&anon_name->kref) <REFCOUNT_MAX ) { +anon_vma_name_get (anon_name); +return anon_name; + + } +return anon_vma_name_alloc (anon_name->name); +} +static inline void dup_anon_vma_name (struct vm_area_struct *orig_vma,struct vm_area_struct *new_vma) {struct anon_vma_name *anon_name =anon_vma_name (orig_vma); -if (anon_name) { -anon_vma_name_get (anon_name); - new_vma->anon_name = anon_name; - } +if (anon_name) + new_vma->anon_name =anon_vma_name_reuse (anon_name); }static inline void free_anon_vma_name (struct vm_area_struct *vma)
mm/madvise.c +1 -2
@@ -113,8 +113,7 @@ static int replace_anon_vma_name(struct vm_area_struct *vma,if (anon_vma_name_eq (orig_name, anon_name))return 0 ; -anon_vma_name_get (anon_name); - vma->anon_name = anon_name; + vma->anon_name =anon_vma_name_reuse (anon_name);anon_vma_name_put (orig_name);return 0 ;
Sasha Levin
maintainerQuoted 37 lines · On Sun, Mar 06, 2022 at 10:37:21AM +0100, [email protected] wrote:
The patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From
96403e11283def1d1c465c8279514c9a504d8630Mon Sep 17 00:00:00 2001
From: Suren Baghdasaryan <[email protected]>
Date: Fri, 4 Mar 2022 20:28:55 -0800
Subject: [PATCH] mm: preventvm_area_struct::anon_namerefcount saturationA deep process chain with many vmas could grow really high. With default
sysctl_max_map_count(64k) and defaultpid_max(32k) the max number of vmas in the system is 2147450880 and the refcounter has headroom of 1073774592 before it reachesREFCOUNT_SATURATED(3221225472).Therefore it's unlikely that an anonymous name refcounter will overflow with these defaults. Currently the max for
pid_maxisPID_MAX_LIMIT(4194304) and forsysctl_max_map_countit'sINT_MAX(2147483647). In this configurationanon_vma_namerefcount overflow becomes theoretically possible (that still require heavy sharing of thatanon_vma_namebetween processes).kref refcounting interface used in
anon_vma_namestructure will detect a counter overflow when it reachesREFCOUNT_SATURATEDvalue but will only generate a warning and freeze the ref counter. This would lead to the refcounted object never being freed. A determined attacker could leak memory like that but it would be rather expensive and inefficient way to do so.
Quoted 5 lines
To ensure
anon_vma_namerefcount does not overflow, stopanon_vma_namesharing when the refcount reachesREFCOUNT_MAX(2147483647), which still leaves INT_MAX/2 (1073741823) values before the counter reachesREFCOUNT_SATURATED. This should provide enough headroom for raising the refcounts temporarily.
I think that this patch depends on 78db3412833d ("mm: add anonymous vma name refcounting") which we don't have in any of the stable trees. (is this why it wasn't tagged for stable?).
Signature · 2 lines
Thanks, Sasha
Greg KH
maintainerQuoted 44 lines · Sasha Levin
Quoted 37 lines · On Sun, Mar 06, 2022 at 10:37:21AM +0100, [email protected] wrote:
The patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
96403e11283def1d1c465c8279514c9a504d8630Mon Sep 17 00:00:00 2001From: Suren Baghdasaryan <[email protected]>
Date: Fri, 4 Mar 2022 20:28:55 -0800
Subject: [PATCH] mm: preventvm_area_struct::anon_namerefcount saturationA deep process chain with many vmas could grow really high. With default
sysctl_max_map_count(64k) and defaultpid_max(32k) the max number of vmas in the system is 2147450880 and the refcounter has headroom of 1073774592 before it reachesREFCOUNT_SATURATED(3221225472).Therefore it's unlikely that an anonymous name refcounter will overflow with these defaults. Currently the max for
pid_maxisPID_MAX_LIMIT(4194304) and forsysctl_max_map_countit'sINT_MAX(2147483647). In this configurationanon_vma_namerefcount overflow becomes theoretically possible (that still require heavy sharing of thatanon_vma_namebetween processes).kref refcounting interface used in
anon_vma_namestructure will detect a counter overflow when it reachesREFCOUNT_SATURATEDvalue but will only generate a warning and freeze the ref counter. This would lead to the refcounted object never being freed. A determined attacker could leak memory like that but it would be rather expensive and inefficient way to do so.Quoted 5 lines
To ensure
anon_vma_namerefcount does not overflow, stopanon_vma_namesharing when the refcount reachesREFCOUNT_MAX(2147483647), which still leaves INT_MAX/2 (1073741823) values before the counter reachesREFCOUNT_SATURATED. This should provide enough headroom for raising the refcounts temporarily.
Quoted 3 lines
I think that this patch depends on
78db3412833d("mm: add anonymous vma name refcounting") which we don't have in any of the stable trees. (is this why it wasn't tagged for stable?).
Suren said he would provide a backport on Monday, so let's see what he comes up with :)
thanks,
greg k-h
Suren Baghdasaryan
reviewerQuoted 46 lines · Greg KH
Quoted 44 lines · Sasha Levin
Quoted 42 lines · On Sun, Mar 06, 2022 at 10:37:21AM +0100, [email protected] wrote:
The patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
96403e11283def1d1c465c8279514c9a504d8630Mon Sep 17 00:00:00 2001From: Suren Baghdasaryan <[email protected]>
Date: Fri, 4 Mar 2022 20:28:55 -0800
Subject: [PATCH] mm: preventvm_area_struct::anon_namerefcount saturationA deep process chain with many vmas could grow really high. With default
sysctl_max_map_count(64k) and defaultpid_max(32k) the max number of vmas in the system is 2147450880 and the refcounter has headroom of 1073774592 before it reachesREFCOUNT_SATURATED(3221225472).Therefore it's unlikely that an anonymous name refcounter will overflow with these defaults. Currently the max for
pid_maxisPID_MAX_LIMIT(4194304) and forsysctl_max_map_countit'sINT_MAX(2147483647). In this configurationanon_vma_namerefcount overflow becomes theoretically possible (that still require heavy sharing of thatanon_vma_namebetween processes).kref refcounting interface used in
anon_vma_namestructure will detect a counter overflow when it reachesREFCOUNT_SATURATEDvalue but will only generate a warning and freeze the ref counter. This would lead to the refcounted object never being freed. A determined attacker could leak memory like that but it would be rather expensive and inefficient way to do so.To ensure
anon_vma_namerefcount does not overflow, stopanon_vma_namesharing when the refcount reachesREFCOUNT_MAX(2147483647), which still leaves INT_MAX/2 (1073741823) values before the counter reachesREFCOUNT_SATURATED. This should provide enough headroom for raising the refcounts temporarily.
Quoted 6 lines
Quoted 3 lines
I think that this patch depends on
78db3412833d("mm: add anonymous vma name refcounting") which we don't have in any of the stable trees. (is this why it wasn't tagged for stable?).Suren said he would provide a backport on Monday, so let's see what he comes up with :)
Ah, right. We don't have anonymous vma name support in 5.16 or earlier kernels, so this patch is indeed not needed there.
Quoted 4 lines
thanks,
greg k-h