Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Meltdown/Spectre: a Month Has Passed

Meltdown/Spectre: a Month Has Passed

Artyom "Töma" Gavrichenkov

February 09, 2018
Tweet

More Decks by Artyom "Töma" Gavrichenkov

Other Decks in Technology

Transcript

  1. Весна: R&D: Google Project Zero, Университет в Граце и пр.

    Лето: Приватное раскрытие информации в Intel, ARM, AMD, Linux, …
  2. Весна: R&D: Google Project Zero, Университет в Граце и пр.

    Лето: Приватное раскрытие информации в Intel, ARM, AMD, Linux, … Осень: Разработка и постепенный релиз патчей для ОС и прикладных программ
  3. 9 января Запланированная дата снятия эмбарго 26 декабря: Письмо Тома

    Лендаки (AMD) в LKML 2 января Статья The Register 3 января Full disclosure
  4. Meltdown Чтение любого адресного пространства, отображаемого в недоверенный процесс Решение:

    не отображать чужое адресное пространство в недоверенный процесс!
  5. Spectre 1. Недоверенный код с правами на I/O 2. Код

    имеет доступ к высокоточным таймерам
  6. Spectre 1. Недоверенный код с правами на I/O 2. Код

    имеет доступ к высокоточным таймерам 3. Код исполняется в оптимизированном режиме*
  7. Spectre 1. Недоверенный код с правами на I/O 2. Код

    имеет доступ к высокоточным таймерам 3. Код исполняется в оптимизированном режиме* 4. Любое из трёх:
  8. Spectre 1. Недоверенный код с правами на I/O 2. Код

    имеет доступ к высокоточным таймерам 3. Код исполняется в оптимизированном режиме* 4. Любое из трёх: • Нет обновлений ОС для Meltdown • В процессе VM хранится сенситивная информация • Атакующий имеет доступ к I/O других процессов
  9. retpoline .macro NOSPEC_CALL target jmp 1221f 1222: push \target jmp

    __x86.indirect_thunk 1221: call 1222b .endm
  10. retpoline .macro NOSPEC_CALL target jmp 1221f 1222: push \target jmp

    __x86.indirect_thunk 1221: call 1222b .endm
  11. retpoline .macro NOSPEC_CALL target jmp 1221f 1222: push \target jmp

    __x86.indirect_thunk 1221: call 1222b .endm
  12. retpoline .macro NOSPEC_CALL target jmp 1221f 1222: push \target jmp

    __x86.indirect_thunk 1221: call 1222b .endm
  13. retpoline CFI_STARTPROC call retpoline_call_target 2: lfence /* stop speculation */

    jmp 2b retpoline_call_target: lea 8(%rsp), %rsp ret CFI_ENDPROC
  14. retpoline CFI_STARTPROC call retpoline_call_target 2: lfence /* stop speculation */

    jmp 2b retpoline_call_target: lea 8(%rsp), %rsp ret CFI_ENDPROC
  15. CFI_STARTPROC call retpoline_call_target 2: lfence /* stop speculation */ jmp

    2b retpoline_call_target: lea 8(%rsp), %rsp ret CFI_ENDPROC retpoline
  16. retpoline CFI_STARTPROC call retpoline_call_target 2: lfence /* stop speculation */

    jmp 2b retpoline_call_target: lea 8(%rsp), %rsp ret CFI_ENDPROC
  17. retpoline CFI_STARTPROC call retpoline_call_target 2: lfence /* stop speculation */

    jmp 2b retpoline_call_target: lea 8(%rsp), %rsp ret CFI_ENDPROC
  18. retpoline Re: [PATCH 0/7] IBRS patch series Andrew Cooper Thu,

    4 Jan 2018 19:40:31 +0000 Retpoline as a mitigation strategy swaps indirect branches for returns, to avoid using predictions which come from the BTB, as they can be poisoned by an attacker. The problem with Skylake+ is that an RSB underflow falls back to using a BTB prediction, which allows the attacker to take control of speculation. Subject: From: Date:
  19. retpoline -> IBRS/IBPB [PATCH 0/7] IBRS patch series Tim Chen

    Thu,4 Jan 2018 09:56:41 -0800 This patch series enables the basic detection and usage of x86 indirect branch speculation feature.It enables the indirect branch restricted speculation (IBRS) on kernel entry and disables it on exit. It enumerates the indirect branch prediction barrier (IBPB). The x86 IBRS feature requires corresponding microcode support. Subject: From: Date:
  20. JS VM в Chrome • performance.now() и другие таймеры загрублены

    до 1 мс • SharedArrayBuffer отключён §“Full Site Isolation”
  21. JS VM в Webkit • performance.now() и другие таймеры загрублены

    до 1 мс • SharedArrayBuffer отключён §“Pointer poisoning” §“Index masking”
  22. class Foo : public Base { public: .... private: int

    m_x; Bar* m_y; }; Pointer poisoning
  23. class Foo : public Base { public: .... private: int

    m_x; Bar* m_y; }; Pointer poisoning
  24. class Foo : public Base { public: .... private: int

    m_x; Bar* m_y; }; struct Data {int x; Bar* y;}; Pointer poisoning
  25. class Foo : public Base { public: .... private: ConstExprPoisoned

    <FooDataKey, Data> m_data; struct Data {int x; Bar* y;}; }; Pointer poisoning
  26. • Во время компиляции вычисляется poison value • Значение порядка

    1 << 40 достаточно • Методика сложнее; используется ГСЧ Pointer poisoning
  27. int tmp = intArray->vector[ index & intArray->mask ]; • mask:

    округляем размер массива вверх до степени двойки Index masking
  28. Дальнейшее развитие концепции: кастомный аллокатор • array_len > 2 *

    sysconf(SC_PAGE_SIZE) • /proc/self/maps : район памяти размера 2N байт, N>= log 2 (array_len) • mmap(MAP_FIXED) Index masking