1 of 25

Krótka historia o debugowaniu laptopa, który nie budził się z uśpienia

15.05.2019, Warsaw C++ Users' Group�Michał “Redford” Kowalczyk

2 of 25

O mnie

  • Wicekapitan @ Dragon Sector CTF team
  • Researcher @ Invisible Things Lab
  • Inżynieria wsteczna, IT sec, kryptografia
  • Współautor “Praktycznej Inżynierii Wstecznej”
  • [dodane po prelekcji] Inna moja prezentacja, na podobny temat: https://www.youtube.com/watch?v=FpaBnJO9a0w

3 of 25

Intro

  • Znajomemu nie działa suspend w laptopie
  • Usypia się poprawnie, ale hard reset przy próbie obudzenia
  • Thinkpad x230, Qubes OS (z Xenem jako hypervisorem)

4 of 25

Standardowe sprawdzenia

  • Update BIOS-u, firmware’u i sterowników
  • Reset BIOS-u do ustawień fabrycznych
  • Przełożenie dysku do innego Thinkpada x230
  • Zmiana BIOS-u na coreboota
  • Zmiana OS-a na inny

Nie widać żadnej oczywistej przyczyny → pora na debugowanie!

5 of 25

Ale najpierw, jak to wszystko działa?

6 of 25

Jak działa komputer: BIOS, ACPI, OS...

CPU

Northbridge

RAM

GPU

Southbridge

HDD

Audio

Ethernet

EC/KBC

Battery

Keyboard

PSC

Touchpad

BIOS

7 of 25

Boot

CPU

Northbridge

RAM

GPU

Southbridge

HDD

Audio

Ethernet

EC/KBC

Battery

Keyboard

PSC

Touchpad

BIOS

EIP=...�RAX=...

RBX=...

...

8 of 25

Boot

CPU

Northbridge

RAM

GPU

Southbridge

HDD

Audio

Ethernet

EC/KBC

Battery

Keyboard

PSC

Touchpad

BIOS

EIP=...�RAX=...

RBX=...

...

9 of 25

Boot

CPU

Northbridge

RAM

GPU

Southbridge

HDD

Audio

Ethernet

EC/KBC

Battery

Keyboard

PSC

Touchpad

BIOS

EIP=...�RAX=...

RBX=...

...

10 of 25

Przejście w S3

CPU

Northbridge

RAM

GPU

Southbridge

HDD

Audio

Ethernet

EC/KBC

Battery

Keyboard

PSC

Touchpad

BIOS

EIP=...�RAX=...

RBX=...

...

11 of 25

Budzenie z S3

CPU

Northbridge

RAM

GPU

Southbridge

HDD

Audio

Ethernet

EC/KBC

Battery

Keyboard

PSC

Touchpad

BIOS

EIP=...�RAX=...

RBX=...

...

12 of 25

Qubes OS / Xen

Hardware

Xen

Dom0

DomU

DomU

...

management domain (VM)

host OS

user domains (VMs)

13 of 25

Debugowanie

14 of 25

Sposoby na debugowanie

  • Ekran - wyłączony/gpu wyłączone
  • Serial port - nie mamy stacji dokującej
  • while (1) {}
  • RTC timer

15 of 25

pm_trace

  • Ficzer Linuxa do debugowania ACPI

static int device_resume_noirq(struct device *dev, pm_message_t state, bool async)

{

pm_callback_t callback;

const char *info;

bool skip_resume;

int error = 0;

TRACE_DEVICE(dev);

TRACE_RESUME(0);

if (dev->power.syscore || dev->power.direct_complete)

goto Out;

16 of 25

pm_trace

  • w Dom0:�echo 1 > /sys/power/pm_trace
  • suspend → resume → auto reboot → dmesg:�Magic number: 0:848:178�hash matches [snip]/linux-4.14.74/drivers/base/power/main.c:1143

17 of 25

pm_trace

  • w Dom0:�echo 1 > /sys/power/pm_trace
  • suspend → resume → auto reboot → dmesg:�Magic number: 0:848:178�hash matches [snip]/linux-4.14.74/drivers/base/power/main.c:1143
  • Czyli:� ����
  • Suspend się powiódł, ale do resume w ogóle nie dotarło

0

Complete:� complete_all(&dev->power.completion);� TRACE_SUSPEND(error);return error;

18 of 25

pm_trace w Xenie?

  • Nie ma, ale...
  • … przeportowanie z Linuxa do Xena okazało się dość proste
  • Setup: netboot przez PXELINUX

19 of 25

Dokąd dociera wykonanie?

arch/x86/boot/wakeup.S#L152:

movl $MSR_EFER,%ecx

rdmsr

btsl $_EFER_LME,%eax /* Long Mode */

btsl $_EFER_SCE,%eax /* SYSCALL/SYSRET */

btl $20,%edi /* No Execute? */

jnc 1f

btsl $_EFER_NX,%eax /* No Execute */

1: wrmsr

20 of 25

NX?

  • Niewłączanie NX naprawia problem
  • Ale dlaczego NX nie daje się włączyć?

21 of 25

NX

Intel SDM, Volume 3:

If the execute-disable capability is not available, a write to set IA32_EFER.NXE produces a #GP exception.

Ale procesor w tym laptopie wspiera NX….

22 of 25

NX

IA32_MISC_ENABLE MSR:

23 of 25

BIOS!

  • BIOS na Thinkpadach x230 domyślnie ma wyłączony NX
  • Xen przy starcie komputera nadpisuje wyłączenie NX i z powrotem go włącza (najpierw w IA32_MISC_ENABLE a potem w EFER.NXE)
  • Ale przy resume robi tylko to drugie

24 of 25

Naprawa

  • Zmiana ustawień BIOS-u naprawia problem
  • Patch do Xena też nie zaszkodzi

25 of 25

Pytania?

Email: redford@dragonsector.pl

Twitter: @dsredford

IRC: Redford @ freenode.net