|
|
88c41d |
From 37f2c716f2c6ab14c3ba557a539c3ee3224931b5 Mon Sep 17 00:00:00 2001
|
|
|
88c41d |
From: Seunghun Han <kkamagui@gmail.com>
|
|
|
88c41d |
Date: Wed, 19 Jul 2017 17:04:44 +0900
|
|
|
88c41d |
Subject: [PATCH] acpi: acpica: fix acpi operand cache leak in nseval.c
|
|
|
88c41d |
|
|
|
88c41d |
I found an ACPI cache leak in ACPI early termination and boot continuing case.
|
|
|
88c41d |
|
|
|
88c41d |
When early termination occurs due to malicious ACPI table, Linux kernel
|
|
|
88c41d |
terminates ACPI function and continues to boot process. While kernel terminates
|
|
|
88c41d |
ACPI function, kmem_cache_destroy() reports Acpi-Operand cache leak.
|
|
|
88c41d |
|
|
|
88c41d |
Boot log of ACPI operand cache leak is as follows:
|
|
|
88c41d |
>[ 0.464168] ACPI: Added _OSI(Module Device)
|
|
|
88c41d |
>[ 0.467022] ACPI: Added _OSI(Processor Device)
|
|
|
88c41d |
>[ 0.469376] ACPI: Added _OSI(3.0 _SCP Extensions)
|
|
|
88c41d |
>[ 0.471647] ACPI: Added _OSI(Processor Aggregator Device)
|
|
|
88c41d |
>[ 0.477997] ACPI Error: Null stack entry at ffff880215c0aad8 (20170303/exresop-174)
|
|
|
88c41d |
>[ 0.482706] ACPI Exception: AE_AML_INTERNAL, While resolving operands for [OpcodeName unavailable] (20170303/dswexec-461)
|
|
|
88c41d |
>[ 0.487503] ACPI Error: Method parse/execution failed [\DBG] (Node ffff88021710ab40), AE_AML_INTERNAL (20170303/psparse-543)
|
|
|
88c41d |
>[ 0.492136] ACPI Error: Method parse/execution failed [\_SB._INI] (Node ffff88021710a618), AE_AML_INTERNAL (20170303/psparse-543)
|
|
|
88c41d |
>[ 0.497683] ACPI: Interpreter enabled
|
|
|
88c41d |
>[ 0.499385] ACPI: (supports S0)
|
|
|
88c41d |
>[ 0.501151] ACPI: Using IOAPIC for interrupt routing
|
|
|
88c41d |
>[ 0.503342] ACPI Error: Null stack entry at ffff880215c0aad8 (20170303/exresop-174)
|
|
|
88c41d |
>[ 0.506522] ACPI Exception: AE_AML_INTERNAL, While resolving operands for [OpcodeName unavailable] (20170303/dswexec-461)
|
|
|
88c41d |
>[ 0.510463] ACPI Error: Method parse/execution failed [\DBG] (Node ffff88021710ab40), AE_AML_INTERNAL (20170303/psparse-543)
|
|
|
88c41d |
>[ 0.514477] ACPI Error: Method parse/execution failed [\_PIC] (Node ffff88021710ab18), AE_AML_INTERNAL (20170303/psparse-543)
|
|
|
88c41d |
>[ 0.518867] ACPI Exception: AE_AML_INTERNAL, Evaluating _PIC (20170303/bus-991)
|
|
|
88c41d |
>[ 0.522384] kmem_cache_destroy Acpi-Operand: Slab cache still has objects
|
|
|
88c41d |
>[ 0.524597] CPU: 1 PID: 1 Comm: swapper/0 Not tainted 4.12.0-rc5 #26
|
|
|
88c41d |
>[ 0.526795] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
|
|
|
88c41d |
>[ 0.529668] Call Trace:
|
|
|
88c41d |
>[ 0.530811] ? dump_stack+0x5c/0x81
|
|
|
88c41d |
>[ 0.532240] ? kmem_cache_destroy+0x1aa/0x1c0
|
|
|
88c41d |
>[ 0.533905] ? acpi_os_delete_cache+0xa/0x10
|
|
|
88c41d |
>[ 0.535497] ? acpi_ut_delete_caches+0x3f/0x7b
|
|
|
88c41d |
>[ 0.537237] ? acpi_terminate+0xa/0x14
|
|
|
88c41d |
>[ 0.538701] ? acpi_init+0x2af/0x34f
|
|
|
88c41d |
>[ 0.540008] ? acpi_sleep_proc_init+0x27/0x27
|
|
|
88c41d |
>[ 0.541593] ? do_one_initcall+0x4e/0x1a0
|
|
|
88c41d |
>[ 0.543008] ? kernel_init_freeable+0x19e/0x21f
|
|
|
88c41d |
>[ 0.546202] ? rest_init+0x80/0x80
|
|
|
88c41d |
>[ 0.547513] ? kernel_init+0xa/0x100
|
|
|
88c41d |
>[ 0.548817] ? ret_from_fork+0x25/0x30
|
|
|
88c41d |
>[ 0.550587] vgaarb: loaded
|
|
|
88c41d |
>[ 0.551716] EDAC MC: Ver: 3.0.0
|
|
|
88c41d |
>[ 0.553744] PCI: Probing PCI hardware
|
|
|
88c41d |
>[ 0.555038] PCI host bridge to bus 0000:00
|
|
|
88c41d |
> ... Continue to boot and log is omitted ...
|
|
|
88c41d |
|
|
|
88c41d |
I analyzed this memory leak in detail and found AcpiNsEvaluate() function
|
|
|
88c41d |
only removes Info->ReturnObject in AE_CTRL_RETURN_VALUE case. But, when errors
|
|
|
88c41d |
occur, the status value is not AE_CTRL_RETURN_VALUE, and Info->ReturnObject is
|
|
|
88c41d |
also not null. Therefore, this causes acpi operand memory leak.
|
|
|
88c41d |
|
|
|
88c41d |
This cache leak causes a security threat because an old kernel (<= 4.9) shows
|
|
|
88c41d |
memory locations of kernel functions in stack dump. Some malicious users
|
|
|
88c41d |
could use this information to neutralize kernel ASLR.
|
|
|
88c41d |
|
|
|
88c41d |
I made a patch to fix ACPI operand cache leak.
|
|
|
88c41d |
|
|
|
88c41d |
Signed-off-by: Seunghun Han <kkamagui@gmail.com>
|
|
|
88c41d |
|
|
|
88c41d |
Github-Location: https://github.com/acpica/acpica/pull/296/commits/37f2c716f2c6ab14c3ba557a539c3ee3224931b5
|
|
|
88c41d |
|
|
|
88c41d |
---
|
|
|
88c41d |
source/components/namespace/nseval.c | 10 ++++++++++
|
|
|
88c41d |
1 file changed, 10 insertions(+)
|
|
|
88c41d |
|
|
|
88c41d |
Index: acpica-unix2-20180313/source/components/namespace/nseval.c
|
|
|
88c41d |
===================================================================
|
|
|
88c41d |
--- acpica-unix2-20180313.orig/source/components/namespace/nseval.c
|
|
|
88c41d |
+++ acpica-unix2-20180313/source/components/namespace/nseval.c
|
|
|
88c41d |
@@ -330,6 +330,16 @@ AcpiNsEvaluate (
|
|
|
88c41d |
Info->ReturnObject = NULL;
|
|
|
88c41d |
}
|
|
|
88c41d |
}
|
|
|
88c41d |
+ else if (ACPI_FAILURE(Status))
|
|
|
88c41d |
+ {
|
|
|
88c41d |
+ /* If ReturnObject exists, delete it */
|
|
|
88c41d |
+
|
|
|
88c41d |
+ if (Info->ReturnObject)
|
|
|
88c41d |
+ {
|
|
|
88c41d |
+ AcpiUtRemoveReference (Info->ReturnObject);
|
|
|
88c41d |
+ Info->ReturnObject = NULL;
|
|
|
88c41d |
+ }
|
|
|
88c41d |
+ }
|
|
|
88c41d |
|
|
|
88c41d |
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
|
|
|
88c41d |
"*** Completed evaluation of object %s ***\n",
|