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. Meltdown/Spectre
    спустя месяц
    Artyom Gavrichenkov

    GPG: 2deb 97b1 0a3c 151d b67f 1ee5 00e7 94bc 4d08 9191

    View Slide

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

    View Slide

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

    View Slide

  4. Весна: R&D: Google Project Zero,
    Университет в Граце и пр.
    Лето: Приватное раскрытие информации
    в Intel, ARM, AMD, Linux, …
    Осень: Разработка и постепенный релиз патчей
    для ОС и прикладных программ

    View Slide

  5. 9 января Запланированная дата
    снятия эмбарго

    View Slide

  6. 9 января Запланированная дата
    снятия эмбарго
    26 декабря: Письмо Тома Лендаки (AMD)
    в LKML

    View Slide

  7. 9 января Запланированная дата
    снятия эмбарго
    26 декабря: Письмо Тома Лендаки (AMD)
    в LKML
    2 января Статья The Register

    View Slide

  8. 9 января Запланированная дата
    снятия эмбарго
    26 декабря: Письмо Тома Лендаки (AMD)
    в LKML
    2 января Статья The Register
    3 января Full disclosure

    View Slide

  9. View Slide

  10. View Slide

  11. View Slide

  12. Branch target prediction
    https://www.jilp.org/vol8/v8paper1.pdf

    View Slide

  13. Meltdown

    View Slide

  14. Meltdown
    Чтение любого адресного пространства,
    отображаемого в недоверенный процесс
    Решение:

    View Slide

  15. Meltdown
    Чтение любого адресного пространства,
    отображаемого в недоверенный процесс
    Решение:
    не отображать чужое адресное пространство
    в недоверенный процесс!

    View Slide

  16. Spectre

    View Slide

  17. Spectre
    1. Недоверенный код с правами на I/O

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  21. Spectre
    1. Недоверенный код с правами на I/O
    2. Код имеет доступ к высокоточным таймерам
    3. Код исполняется в оптимизированном
    режиме*
    4. Любое из трёх:
    • Нет обновлений ОС для Meltdown
    • В процессе VM хранится сенситивная информация
    • Атакующий имеет доступ к I/O других процессов

    View Slide

  22. retpoline

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  35. 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:

    View Slide

  36. 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:

    View Slide

  37. JS VM в браузере
    • performance.now() и другие таймеры
    загрублены до 1 мс
    • SharedArrayBuffer отключён

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  43. class Foo : public Base {
    public: ....
    private:
    ConstExprPoisoned

    m_data;
    struct Data {int x; Bar* y;};
    };
    Pointer poisoning

    View Slide

  44. ConstExprPoisoned

    – во время компиляции вычисляется poison value
    Pointer poisoning

    View Slide

  45. • Во время компиляции вычисляется poison value
    • Значение порядка 1 << 40 достаточно
    • Методика сложнее; используется ГСЧ
    Pointer poisoning

    View Slide

  46. Index masking

    View Slide

  47. int tmp = intArray->vector[
    index & intArray->mask
    ];
    Index masking

    View Slide

  48. int tmp = intArray->vector[
    index & intArray->mask
    ];
    • mask: округляем размер массива вверх
    до степени двойки
    Index masking

    View Slide

  49. Дальнейшее развитие концепции:
    кастомный аллокатор
    • array_len > 2 * sysconf(SC_PAGE_SIZE)
    • /proc/self/maps :
    район памяти размера 2N байт,
    N>= log
    2
    (array_len)
    • mmap(MAP_FIXED)
    Index masking

    View Slide

  50. View Slide

  51. Q&A
    Artyom Gavrichenkov

    View Slide