Test Case:
---------
$ cat aa-refcnt-af_alg.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <linux/if_alg.h>
int main() {
int sockfd;
struct sockaddr_alg sa;
/* Setup the crypto API socket */
sockfd = socket(AF_ALG, SOCK_SEQPACKET, 0);
if (sockfd < 0) {
perror("socket");
return 1;
}
memset(&sa, 0, sizeof(sa));
sa.salg_family = AF_ALG;
strcpy((char *) sa.salg_type, "rng");
strcpy((char *) sa.salg_name, "stdrng");
if (bind(sockfd, (struct sockaddr *) &sa, sizeof(sa)) < 0) {
perror("bind");
return 1;
}
/* Accept a "connection" and close it; repeat. */
while (!close(accept(sockfd, NULL, 0)));
return 0;
}
$ gcc -o aa-refcnt-af_alg aa-refcnt-af_alg.c
$ ./aa-refcnt-af_alg
<a few hours later>
[ 9928.475953] refcount_t overflow at apparmor_sk_clone_security+0x37/0x70 in
aa-refcnt-af_alg[1322], uid/euid: 1000/1000
...
[ 9928.507443] RIP: 0010:apparmor_sk_clone_security+0x37/0x70
...
[ 9928.514286] security_sk_clone+0x33/0x50
[ 9928.514807] af_alg_accept+0x81/0x1c0 [af_alg]
[ 9928.516091] alg_accept+0x15/0x20 [af_alg]
[ 9928.516682] SYSC_accept4+0xff/0x210
[ 9928.519609] SyS_accept+0x10/0x20
[ 9928.520190] do_syscall_64+0x73/0x130
[ 9928.520808] entry_SYSCALL_64_after_hwframe+0x3d/0xa2
Note that other messages may be seen, not just overflow, depending on
the value being incremented by kref_get(); on another run:
[ 7273.182666] refcount_t: saturated; leaking memory.
...
[ 7273.185789] refcount_t: underflow; use-after-free.
** Description changed:
[Impact]
- * Users of the Crypto (user-space) API (i.e., AF_ALG)
- can trigger refcount errors in AppArmor under high
- load (might lead to memory leak or use after free.)
+ * Users of the Crypto (user-space) API (i.e., AF_ALG)
+ can trigger refcount errors in AppArmor under high
+ load (might lead to memory leak or use after free.)
- * There is a reference leak in AppArmor when af_alg_accept()
- calls security_sock_graft() and then security_sk_clone().
-
- * Both acquire a reference to a label, to assign it to the
- same pointer, but the latter does not release the former's
- acquired reference (before overwriting the pointer value.)
-
- * This reference leak builds up over time, and under high
- load can eventually overflow/underflow/saturate refcount,
- depending on which value it has when a program hits that.
-
- * The fix just checks if the pointer has an assigned label,
- then releases its acquired reference.
+ * There is a reference leak in AppArmor when af_alg_accept()
+ calls security_sock_graft() and then security_sk_clone().
+
+ * Both acquire a reference to a label, to assign it to the
+ same pointer, but the latter does not release the former's
+ acquired reference (before overwriting the pointer value.)
+
+ * This reference leak builds up over time, and under high
+ load can eventually overflow/underflow/saturate refcount,
+ depending on which value it has when a program hits that.
+
+ * The fix just checks if the pointer has an assigned label,
+ then releases its acquired reference.
[Test Case]
- * See comment # for the test-case 'aa-refcnt-af_alg.c'.
+ * Exercise that code path indefinitely until it hits
+ the refcount_t overflow/underflow/saturate message
+ (or not, with the patch.)
- * Exercise that code path indefinitely until it hits
- the refcount_t overflow/underflow/saturate message.
- (in a few hours.)
-
- * It's possible to monitor refcount values with kprobes.
+ * See comment #1 for the test-case 'aa-refcnt-af_alg.c'.
+
+ If the problem happens, in a few hours there is an
+ error message in the kernel logs (see comment #1.)
+
+ * It's possible to monitor refcount values with kprobes,
+ to confirm whether or not the problem is happening.
[Other Info]
- * Patch applied upstream on v5.8-rc1 [1]
- * Applied on Unstable (tag Ubuntu-5.8-5.8.0-0.1)
- * Not required on Groovy (still 5.4; should sync from Unstable)
- * Not required on Eoan (EOL date before SRU cycle release date)
- * Required on Bionic and Focal.
+ * Patch applied upstream on v5.8-rc1 [1]
+ * Applied on Unstable (tag Ubuntu-5.8-5.8.0-0.1)
+ * Not required on Groovy (still 5.4; should sync from Unstable)
+ * Not required on Eoan (EOL date before SRU cycle release date)
+ * Required on Bionic and Focal.
[1]
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit?id=3b646abc5bc6c0df649daea4c2c976bd4d47e4c8
--
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to linux in Ubuntu.
https://bugs.launchpad.net/bugs/1883962
Title:
apparmor reference leak causes refcount_t overflow with
af_alg_accept()
Status in linux package in Ubuntu:
Fix Committed
Status in linux source package in Bionic:
In Progress
Status in linux source package in Eoan:
Won't Fix
Status in linux source package in Focal:
In Progress
Status in linux source package in Groovy:
Won't Fix
Bug description:
[Impact]
* Users of the Crypto (user-space) API (i.e., AF_ALG)
can trigger refcount errors in AppArmor under high
load (might lead to memory leak or use after free.)
* There is a reference leak in AppArmor when af_alg_accept()
calls security_sock_graft() and then security_sk_clone().
* Both acquire a reference to a label, to assign it to the
same pointer, but the latter does not release the former's
acquired reference (before overwriting the pointer value.)
* This reference leak builds up over time, and under high
load can eventually overflow/underflow/saturate refcount,
depending on which value it has when a program hits that.
* The fix just checks if the pointer has an assigned label,
then releases its acquired reference.
[Test Case]
* Exercise that code path indefinitely until it hits
the refcount_t overflow/underflow/saturate message
(or not, with the patch.)
* See comment #1 for the test-case 'aa-refcnt-af_alg.c'.
If the problem happens, in a few hours there is an
error message in the kernel logs (see comment #1.)
* It's possible to monitor refcount values with kprobes,
to confirm whether or not the problem is happening.
[Other Info]
* Patch applied upstream on v5.8-rc1 [1]
* Applied on Unstable (tag Ubuntu-5.8-5.8.0-0.1)
* Not required on Groovy (still 5.4; should sync from Unstable)
* Not required on Eoan (EOL date before SRU cycle release date)
* Required on Bionic and Focal.
[1]
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit?id=3b646abc5bc6c0df649daea4c2c976bd4d47e4c8
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1883962/+subscriptions
--
Mailing list: https://launchpad.net/~kernel-packages
Post to : [email protected]
Unsubscribe : https://launchpad.net/~kernel-packages
More help : https://help.launchpad.net/ListHelp