diff options
author | Siddhesh Poyarekar <siddhesh@sourceware.org> | 2023-09-15 13:51:12 -0400 |
---|---|---|
committer | Siddhesh Poyarekar <siddhesh@sourceware.org> | 2023-09-15 14:38:28 -0400 |
commit | 973fe93a5675c42798b2161c6f29c01b0e243994 (patch) | |
tree | cc0af798900de7b19816445d0a8157f52d696f30 /nss/tst-nss-gai-hv2-canonname.root | |
parent | 780adf7aeab9308c02d89260df6ffa84dc2289a5 (diff) | |
download | glibc-973fe93a5675c42798b2161c6f29c01b0e243994.tar.gz glibc-973fe93a5675c42798b2161c6f29c01b0e243994.tar.xz glibc-973fe93a5675c42798b2161c6f29c01b0e243994.zip |
getaddrinfo: Fix use after free in getcanonname (CVE-2023-4806)
When an NSS plugin only implements the _gethostbyname2_r and _getcanonname_r callbacks, getaddrinfo could use memory that was freed during tmpbuf resizing, through h_name in a previous query response. The backing store for res->at->name when doing a query with gethostbyname3_r or gethostbyname2_r is tmpbuf, which is reallocated in gethosts during the query. For AF_INET6 lookup with AI_ALL | AI_V4MAPPED, gethosts gets called twice, once for a v6 lookup and second for a v4 lookup. In this case, if the first call reallocates tmpbuf enough number of times, resulting in a malloc, th->h_name (that res->at->name refers to) ends up on a heap allocated storage in tmpbuf. Now if the second call to gethosts also causes the plugin callback to return NSS_STATUS_TRYAGAIN, tmpbuf will get freed, resulting in a UAF reference in res->at->name. This then gets dereferenced in the getcanonname_r plugin call, resulting in the use after free. Fix this by copying h_name over and freeing it at the end. This resolves BZ #30843, which is assigned CVE-2023-4806. Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
Diffstat (limited to 'nss/tst-nss-gai-hv2-canonname.root')
-rw-r--r-- | nss/tst-nss-gai-hv2-canonname.root/postclean.req | 0 | ||||
-rw-r--r-- | nss/tst-nss-gai-hv2-canonname.root/tst-nss-gai-hv2-canonname.script | 2 |
2 files changed, 2 insertions, 0 deletions
diff --git a/nss/tst-nss-gai-hv2-canonname.root/postclean.req b/nss/tst-nss-gai-hv2-canonname.root/postclean.req new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/nss/tst-nss-gai-hv2-canonname.root/postclean.req diff --git a/nss/tst-nss-gai-hv2-canonname.root/tst-nss-gai-hv2-canonname.script b/nss/tst-nss-gai-hv2-canonname.root/tst-nss-gai-hv2-canonname.script new file mode 100644 index 0000000000..31848b4a28 --- /dev/null +++ b/nss/tst-nss-gai-hv2-canonname.root/tst-nss-gai-hv2-canonname.script @@ -0,0 +1,2 @@ +cp $B/nss/libnss_test_gai_hv2_canonname.so $L/libnss_test_gai_hv2_canonname.so.2 +su |