From: Jian J Wang <jian.j.wang@intel.com>
To: edk2-devel@lists.01.org
Cc: Laszlo Ersek <lersek@redhat.com>, Star Zeng <star.zeng@intel.com>,
Michael D Kinney <michael.d.kinney@intel.com>,
Jiewen Yao <jiewen.yao@intel.com>, Ruiyu Ni <ruiyu.ni@intel.com>
Subject: [PATCH 2/3] UefiCpuPkg/CpuDxe: fix an infinite loop issue
Date: Fri, 19 Oct 2018 09:50:12 +0800 [thread overview]
Message-ID: <20181019015013.7488-3-jian.j.wang@intel.com> (raw)
In-Reply-To: <20181019015013.7488-1-jian.j.wang@intel.com>
The UAF (Use-After-Free) memory detection feature will cause an
infinite calling of InitializePageTablePool(). This is due to a
fact that AllocateAlignedPages() is used to allocate page table
pool memory. This function will most likely call gBS->FreePages
to free unaligned pages and then cause another round of page
attributes change, like below
FreePages() <===============|
=> SetMemoryAttributes() |
=> <out of page table> |
=> InitializePageTablePool() |
=> AllocateAlignedPages() |
=> FreePages() ================|
The solution is add a lock in page table pool allocation function
and fail any other requests if it has not been done.
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Jian J Wang <jian.j.wang@intel.com>
---
UefiCpuPkg/CpuDxe/CpuPageTable.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/UefiCpuPkg/CpuDxe/CpuPageTable.c b/UefiCpuPkg/CpuDxe/CpuPageTable.c
index 33e8ee2d2c..2145e623fa 100644
--- a/UefiCpuPkg/CpuDxe/CpuPageTable.c
+++ b/UefiCpuPkg/CpuDxe/CpuPageTable.c
@@ -100,6 +100,7 @@ PAGE_ATTRIBUTE_TABLE mPageAttributeTable[] = {
};
PAGE_TABLE_POOL *mPageTablePool = NULL;
+EFI_LOCK mPageTablePoolLock = EFI_INITIALIZE_LOCK_VARIABLE (TPL_NOTIFY);
PAGE_TABLE_LIB_PAGING_CONTEXT mPagingContext;
EFI_SMM_BASE2_PROTOCOL *mSmmBase2 = NULL;
@@ -1045,6 +1046,12 @@ InitializePageTablePool (
{
VOID *Buffer;
BOOLEAN IsModified;
+ EFI_STATUS Status;
+
+ Status = EfiAcquireLockOrFail (&mPageTablePoolLock);
+ if (EFI_ERROR (Status)) {
+ return FALSE;
+ }
//
// Always reserve at least PAGE_TABLE_POOL_UNIT_PAGES, including one page for
@@ -1056,7 +1063,10 @@ InitializePageTablePool (
Buffer = AllocateAlignedPages (PoolPages, PAGE_TABLE_POOL_ALIGNMENT);
if (Buffer == NULL) {
DEBUG ((DEBUG_ERROR, "ERROR: Out of aligned pages\r\n"));
+ EfiReleaseLock (&mPageTablePoolLock);
return FALSE;
+ } else {
+ DEBUG ((DEBUG_INFO, "Paging: added %d pages to page table pool\r\n", PoolPages));
}
//
@@ -1092,6 +1102,8 @@ InitializePageTablePool (
);
ASSERT (IsModified == TRUE);
+ EfiReleaseLock (&mPageTablePoolLock);
+
return TRUE;
}
--
2.16.2.windows.1
next prev parent reply other threads:[~2018-10-19 1:50 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-19 1:50 [PATCH 0/3] Add use-after-free memory detection Jian J Wang
2018-10-19 1:50 ` [PATCH 1/3] MdeModulePkg/MdeModulePkg.dec: add new PCD for UAF detection feature Jian J Wang
2018-10-19 11:27 ` Laszlo Ersek
2018-10-22 2:20 ` Zeng, Star
2018-10-19 1:50 ` Jian J Wang [this message]
2018-10-19 11:45 ` [PATCH 2/3] UefiCpuPkg/CpuDxe: fix an infinite loop issue Laszlo Ersek
2018-10-22 7:23 ` Wang, Jian J
2018-10-19 1:50 ` [PATCH 3/3] MdeModulePkg/Core: add use-after-free memory detection Jian J Wang
2018-10-19 12:04 ` Laszlo Ersek
2018-10-22 7:34 ` Wang, Jian J
2018-10-22 2:53 ` Zeng, Star
2018-10-22 7:12 ` Wang, Jian J
2018-10-22 8:23 ` Zeng, Star
2018-10-23 1:24 ` Wang, Jian J
2018-10-23 3:14 ` Zeng, Star
2018-10-19 1:56 ` [PATCH 0/3] Add " Wang, Jian J
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181019015013.7488-3-jian.j.wang@intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox