Corrupted BIOS on an Acer X541UJ compromising Linux

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

unfortunately my notebook (an Asus R541UJ) is infected by an obviously highly-sophisticated firmware-based rootkit, which compromises any Linux or Windows system through the execution of its manipulated ACPI code. Performing a BIOS flash doesn't override this ACPI code.


When testing the firmware components using FirmwareTestSuiteLive, it reports various error messages, most of them related to the ACPI tables:

High failures: 6
klog: HIGH Kernel message: [ 0.024112] ACPI Error: [PRT0] Namespace lookup failure, AE_ALREADY_EXISTS (20150930/dswload-378) klog: HIGH Kernel message: [ 0.024116] ACPI Exception: AE_ALREADY_EXISTS, During name lookup/catalog (20150930/psobject-227) klog: HIGH Kernel message: [ 0.024181] ACPI Exception: AE_ALREADY_EXISTS, (SSDT:SataTabl) while loading table (20150930/tbxfload-193) klog: HIGH Kernel message: [ 0.036857] ACPI Error: 1 table load failures, 8 successful (20150930/tbxfload-214) klog: HIGH Kernel message: [ 3.159686] ACPI Warning: \_SB_.PCI0.GFX0._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20150930/nsarguments-95) klog: HIGH Kernel message: [ 3.159739] ACPI Warning: \_SB_.PCI0.RP01.PEGP._DSM: Argument #4 type mismatch - Found [Buffer], ACPI requires [Package] (20150930/nsarguments-95)

Medium failures: 16
mtrr: Memory range 0xc0000000 to 0xcfffffff (0000:00:02.0) has incorrect attribute Uncached. mtrr: Memory range 0xd0000000 to 0xdfffffff (0000:01:00.0) has incorrect attribute Uncached. mtrr: Memory range 0xe0000000 to 0xe1ffffff (0000:01:00.0) has incorrect attribute Uncached. mtrr: Memory range 0xe2100000 to 0xe2103fff (0000:02:00.2) has incorrect attribute Uncached. method: \_SB_.PCI0.SPI1.FPNT._HID returned a string 'FPNT_DIS' but it was not a valid PNP ID or a valid ACPI ID. method: \_SB_.PCI0.B0D4._TSD should return package of 1 element, got 2 elements instead. method: \_SB_.PCI0.B0D4._TSS sub-package 0 element 0was expected to have value 1..100, instead was 0. method: \_SB_.PCI0.B0D4._TSS sub-package 1 element 0was expected to have value 1..100, instead was 0.
madt: MADT revision is not in sync with the FADT revision;
MADT 3 expects FADT 6.0 but found 6.1 instead.
fan: Fan present but has no cur_state present.
fadt: FADT first reserved field is not zero: 0x01
fadt: FADT PM1A_EVT_BLK has both a 32-bit and a 64-bit address set; only one should be used. fadt: FADT PM1A_CNT_BLK field has both the 32-bit and the 64-bit field set. fadt: FADT PM2_CNT_BLK field has both the 32-bit and the 64-bit field set. fadt: FADT PM_TMR_BLK field has both the 32-bit and the 64-bit field set. ecdt: Failed to evaluate ECDT UID \_SB.PCI0.LPCB.EC0._UID, cannot check UID


I posted the full scan result on pastebin.com:
https://pastebin.com/UbhNCV4n


The execution of this ACPI code leads to the manipulation of any Linux system (which I was able to detect by performing a thorough analysis) by interfering with the IRQ interrupting and by remapping the memory, which is visible in the kernel output of Ubuntu and Alpine Linux e. g.:

[ 0.160156] ACPI : EC: EC description table is found, configuring boot EC
[    0.160173] ACPI : EC: EC started
[ 0.164583] ACPI: Executed 34 blocks of module-level executable AML code
[    0.171071] [Firmware Bug]: ACPI: BIOS _OSI(Linux) query ignored
[    0.176182] ACPI: Dynamic OEM Table Load:
[ 0.176188] ACPI: SSDT 0xFFFF880360262000 0006B4 (v02 PmRef Cpu0Ist 00003000 INTL 20160422) [ 0.177081] ACPI: Executed 1 blocks of module-level executable AML code
[    0.177137] ACPI: \_PR_.CPU0: _OSC native thermal LVT Acked
[    0.178196] ACPI: Dynamic OEM Table Load:
[ 0.178201] ACPI: SSDT 0xFFFF88035FD94800 0003FF (v02 PmRef Cpu0Cst 00003001 INTL 20160422) [ 0.179077] ACPI: Executed 1 blocks of module-level executable AML code
[    0.179373] ACPI: Dynamic OEM Table Load:
[ 0.179378] ACPI: SSDT 0xFFFF880360262800 00065C (v02 PmRef ApIst 00003000 INTL 20160422) [ 0.180429] ACPI: Executed 1 blocks of module-level executable AML code
[    0.180541] ACPI: Dynamic OEM Table Load:
[ 0.180544] ACPI: SSDT 0xFFFF88035FD98000 00018A (v02 PmRef ApCst 00003000 INTL 20160422) [ 0.181430] ACPI: Executed 1 blocks of module-level executable AML code
[    0.182638] ACPI: Interpreter enabled
[    0.182668] ACPI: (supports S0 S3 S4 S5)
[    0.182669] ACPI: Using IOAPIC for interrupt routing
[ 0.182699] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug


[ 9.844078] WARNING: CPU: 3 PID: 2049 at /home/buildozer/aports/main/linux-hardened/src/linux-4.9/kernel/memremap.c:85 memremap+0x7d/0x1b2 [ 9.844081] memremap attempted on mixed range 0x0000000000000000 size: 0x0 [ 9.844083] Modules linked in: joydev hid_multitouch snd_soc_skl(+) snd_soc_skl_ipc snd_soc_sst_ipc snd_soc_sst_dsp snd_hda_ext_core snd_soc_sst_match snd_soc_core snd_compress i2c_designware_platform snd_hda_core i2c_designware_core snd_pcm snd_timer snd soundcore idma64 virt_dma iTCO_wdt intel_lpss_pci iTCO_vendor_support mei_me mei intel_pch_thermal i2c_i801 fbcon i2c_smbus bitblit shpchp fbcon_rotate fbcon_ccw fbcon_ud fbcon_cw softcursor font tileblit i915 intel_gtt processor_thermal_device intel_soc_dts_iosf arc4 rtl8723be btcoexist rtl8723_common rtl_pci rtlwifi mac80211 cfg80211 r8169 mii nouveau ttm drm_kms_helper asus_nb_wmi asus_wmi drm sparse_keymap hwmon mxm_wmi agpgart i2c_algo_bit fb_sys_fops syscopyarea sysfillrect sysimgblt input_leds mousedev wmi battery tpm_crb video thermal button [ 9.844159] tpm_tis tpm_tis_core tpm pinctrl_sunrisepoint pinctrl_intel intel_lpss_acpi intel_lpss int3403_thermal int340x_thermal_zone int3400_thermal acpi_thermal_rel hci_uart btbcm btqca btintel bluetooth rfkill fjes i2c_hid evdev i2c_core asus_wireless ac isofs uas ext4 crc16 jbd2 mbcache nls_utf8 nls_cp437 vfat fat hid_generic usbhid hid rtsx_pci_sdmmc mmc_core sr_mod cdrom crc32_pclmul crc32c_intel rtsx_pci mfd_core ahci libahci libata xhci_pci xhci_hcd usb_storage sd_mod scsi_mod squashfs lz4_decompress loop [ 9.844219] CPU: 3 PID: 2049 Comm: modprobe Not tainted 4.9.32-0-hardened #1-Alpine [ 9.844221] Hardware name: ASUSTeK COMPUTER INC. X541UJ/X541UJ, BIOS X541UJ.302 03/30/2017 [ 9.844225] ffffc9000310fa00 ffffffff813034ae ffffffff81119d37 9efedbfba3eec2b0 [ 9.844231] ffffc9000310fa50 ffffffff81957ef9 ffffc9000310fa40 ffffffff8107b854 [ 9.844236] 000000550310fac0 0000000000000001 0000000000000000 0000000000000002
[    9.844242] Call Trace:
[    9.844250]  [<ffffffff813034ae>] dump_stack+0xaf/0x111
[    9.844256]  [<ffffffff81119d37>] ? print_modules+0xd2/0x109
[    9.844262]  [<ffffffff8107b854>] __warn+0x129/0x17c
[    9.844300]  [<ffffffffa12b9b80>] ? skl_ids+0x40/0x80 [snd_soc_skl]
[    9.844306]  [<ffffffff8107b909>] warn_slowpath_fmt+0x62/0x9c
[    9.844311]  [<ffffffff813cf655>] ? acpi_ns_get_node+0x6f/0x98
[    9.844315]  [<ffffffff81082493>] ? region_intersects+0x32/0x114
[    9.844320]  [<ffffffff8115be59>] memremap+0x7d/0x1b2
[ 9.844354] [<ffffffffa12b505a>] skl_nhlt_init+0xbd/0x135 [snd_soc_skl] [ 9.844381] [<ffffffffa12b20f5>] ? skl_enable_miscbdcge+0x32/0x52 [snd_soc_skl]
[    9.844406]  [<ffffffffa12b2e79>] skl_probe+0x598/0xab2 [snd_soc_skl]
[    9.844433]  [<ffffffffa12b9b80>] ? skl_ids+0x40/0x80 [snd_soc_skl]
[    9.844439]  [<ffffffff8135eabc>] pci_device_probe+0xe3/0x1a0
[    9.844444]  [<ffffffff8147b5a0>] driver_probe_device+0x1df/0x4a5
[    9.844448]  [<ffffffff8147b93a>] __driver_attach+0xd4/0x134
[    9.844452]  [<ffffffff8147b866>] ? driver_probe_device+0x4a5/0x4a5
[    9.844458]  [<ffffffff81478429>] bus_for_each_dev+0xbc/0x127
[    9.844461]  [<ffffffff8147ac53>] driver_attach+0x26/0x46
[    9.844464]  [<ffffffff8147a460>] bus_add_driver+0x151/0x303
[    9.844468]  [<ffffffff8147c85f>] driver_register+0xb7/0x133
[ 9.844491] [<ffffffffa12be008>] ? skl_tplg_widget_ops+0x3f08/0x3f08 [snd_soc_skl]
[    9.844496]  [<ffffffff8135c52f>] __pci_register_driver+0x6f/0xa3
[ 9.844518] [<ffffffffa12be033>] skl_driver_init+0x2b/0x10ee0 [snd_soc_skl]
[    9.844522]  [<ffffffff810022f2>] do_one_initcall+0x11e/0x1e8
[    9.844527]  [<ffffffff8115cc83>] do_init_module+0x8d/0x30f
[    9.844532]  [<ffffffff81118bd7>] load_module+0x2576/0x2b81
[ 9.844552] [<ffffffffa12be050>] ? skl_driver_init+0x48/0x10ee0 [snd_soc_skl]
[    9.844557]  [<ffffffff81114902>] ? show_coresize+0x52/0x52
[    9.844563]  [<ffffffff811194cb>] sys_finit_module+0xc8/0x107
[    9.844566]  [<ffffffff811194cb>] ? sys_finit_module+0xc8/0x107
[    9.844571]  [<ffffffff81119520>] rap_sys_finit_module+0x16/0x36
[ 9.844577] [<ffffffff8166d78e>] entry_SYSCALL_64_fastpath+0x31/0xe5[/code]


I was able to verify the manipulations of any Linux distro using tools from the Volatility framework, but even chkroot is able to discover rootkit activity, e. g. it reports: "wlp3s0: PACKET SNIFFER(/sbin/wpa_supplicant[1035], /sbin/wpa_supplicant[1035], /sbin/dhclient[4947])"


wpa_supplicant is a binary actually, but when taking a look at the readable strings it contains (and searching for these) one can easily understand why chkrootkit classified it as a "PACKET SNIFFER":

dot11RSNAPreauthenticationImplemented=%s
dot11RSNAEnabled=%s
dot11RSNAPreauthenticationEnabled=%s
dot11RSNAConfigVersion=%u
dot11RSNAConfigPairwiseKeysSupported=9999
dot11RSNAConfigGroupRekeyStrict=%u
dot11RSNAConfigGroupUpdateCount=%u
dot11RSNAConfigPairwiseUpdateCount=%u
dot11RSNAConfigGroupCipherSize=%u
dot11RSNAConfigPMKLifetime=%u
dot11RSNAConfigPMKReauthThreshold=%u
dot11RSNAConfigNumberOfPTKSAReplayCounters=0
dot11RSNAConfigSATimeout=%u
dot11RSNAAuthenticationSuiteSelected=%02x-%02x-%02x-%d
dot11RSNAPairwiseCipherSelected=%02x-%02x-%02x-%d
dot11RSNAGroupCipherSelected=%02x-%02x-%02x-%d
dot11RSNAPMKIDUsed=%s
dot11RSNAAuthenticationSuiteRequested=%02x-%02x-%02x-%d
dot11RSNAPairwiseCipherRequested=%02x-%02x-%02x-%d
dot11RSNAGroupCipherRequested=%02x-%02x-%02x-%d
dot11RSNATKIPCounterMeasuresInvoked=%u
dot11RSNA4WayHandshakeFailures=%u
dot11RSNAConfigNumberOfGTKSAReplayCounters=0
dot11RSNAStatsSTAAddress=%02x:%02x:%02x:%02x:%02x:%02x
dot11RSNAStatsVersion=1
dot11RSNAStatsSelectedPairwiseCipher=%02x-%02x-%02x-%d
dot11RSNAStatsTKIPLocalMICFailures=%u
dot11RSNAStatsTKIPRemoteMICFailures=%u
hostapdWPAPTKState=%d
hostapdWPAPTKGroupState=%d

[I didn't download anything before performing the check.]


I uploaded some more results of the analysis I carried through so far on Google Drive, where one can also find the extracted and disassembled ACPI tables of my system:
https://drive.google.com/open?id=0B62Y5Qk_rdbWdlBMc0pOUEJMUjA


Is there anyone, who could take a closer look at how this works in detail by analyzing the disassembled ACPI tables (I can also post them on pastebin.com if someone doesn't want to open the link to my shared Google Drive folder, or someone who could forward this issue to an ACPI developer at Intel e.g.?


Thanks in advance and kind regards

David Renz
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux