от live patching до аварийного ремонта после Meltdown и Spectrefrom live patching to the emergency repair after Meltdown and Spectre

Linux 4.x: eBPF взрослеет, а безопасность CPU рушитсяLinux 4.x: eBPF grows up while CPU security falls apart

Ветка открылась live kernel patching как символом зрелости индустриальной эксплуатации и провела следующие три года, превращая eBPF из узкоспециализированного фильтра пакетов в полноценную программируемую платформу — а затем почти целиком переключилась на аварийные патчи против Meltdown и Spectre, аппаратных уязвимостей, затронувших вообще все современные процессоры.The branch opened with live kernel patching as a symbol of industrial-operations maturity, and spent the next three years turning eBPF from a narrow packet filter into a full programmable platform — then spent much of its final year on emergency patches against Meltdown and Spectre, hardware vulnerabilities that hit essentially every modern CPU.

2015–2019 Meltdown/SpectreMeltdown/Spectre

Что этоWhat it is

Ветка 4.x охватывает почти четыре года — с 12 апреля 2015 (4.0.0) до 23 декабря 2018 (4.20, последний нелонгтерм-релиз перед сменой номера на 5.0 в марте 2019). Модель разработки не менялась третий раз подряд: та же непрерывная схема, что и в 2.6/3.x. Содержательно ветка делится на два неравных периода. Первые два с половиной года (2015–2017) — органичное развитие: live patching доводится до продакшена, eBPF проходит путь от простого пакетного фильтра до JIT-компилируемой программируемой платформы для трассировки и наблюдаемости, добавляются OverlayFS, KASLR-доработки, файловые системы вроде EROFS. Последний год (2017–2018) — аварийный режим: раскрытие Meltdown и Spectre в январе 2018 заставило все LTS-ветки экстренно бэкпортировать Kernel Page Table Isolation (KPTI) и retpoline-митигации, отодвинув плановую разработку на второй план.The 4.x branch spans nearly four years — from April 12, 2015 (4.0.0) to December 23, 2018 (4.20, the last non-LTS release before the number changed to 5.0 in March 2019). The development model didn't change for the third time running: the same continuous scheme as 2.6/3.x. Content-wise the branch splits into two uneven periods. The first two and a half years (2015–2017) were organic growth: live patching gets production-hardened, eBPF goes from a simple packet filter to a JIT-compiled programmable platform for tracing and observability, and OverlayFS, KASLR refinements, and filesystems like EROFS arrive. The final year (2017–2018) was emergency mode: the January 2018 disclosure of Meltdown and Spectre forced every LTS branch to urgently backport Kernel Page Table Isolation (KPTI) and retpoline mitigations, pushing planned development to the back burner.

версияversionдатаdateчто именно изменилосьwhat actually changed
4.0.02015-04-12снова чисто нумерационный жест (см. 3.x) — по содержанию главное: фундамент live kernel patching, объединивший наработки SUSE (kGraft) и Red Hat (kpatch); OverlayFS с несколькими нижними слоями; DAX (обход кеша ядра для persistent memory); KASAN (динамический детектор ошибок памяти)again a purely numerical gesture (see 3.x) — the main content: the live kernel patching foundation, unifying SUSE's kGraft and Red Hat's kpatch; OverlayFS with multiple lower layers; DAX (bypassing the kernel cache for persistent memory); KASAN (a dynamic memory error detector)
4.12015-06-21поддержка s390 (мейнфреймы) для live patching; для eBPF — JIT-компиляция байткода в машинный код (резкое ускорение выполнения) и динамическая трассировка через kprobess390 (mainframe) support for live patching; for eBPF — JIT compilation of bytecode into machine code (a sharp execution speedup) and dynamic tracing via kprobes
4.42016-01-10LTS-релиз: доработки user namespaces и cgroups в сторону изоляции контейнеров — прямое продолжение линии, заложенной в 3.8LTS release: refinements to user namespaces and cgroups for container isolation — a direct continuation of the line started at 3.8
4.6 – 4.82016продолжение расширения eBPF — новые типы карт (maps) для обмена данными между ядром и userspace, первые программы для XDP (обработка пакетов на самом раннем этапе, до сетевого стека)continued eBPF expansion — new map types for kernel/userspace data exchange, the first XDP programs (packet processing at the earliest possible point, before the network stack)
4.92016-12-11крупный LTS-релиз (шесть лет официальной поддержки) — впоследствии станет одной из самых распространённых баз Android Common Kernel; eBPF набирает зрелость как платформа для observabilitya major LTS release (six years of official support) — later becomes one of the most widely used Android Common Kernel bases; eBPF matures as an observability platform
4.142017-11-12ещё одна LTS-ветка — уже через месяц (версия 4.14.11, декабрь 2017) получает первые бэкпорты KPTI, ещё до публичного раскрытия Meltdown/Spectre: патчи готовились втайне при соблюдении embargoanother LTS branch — within a month (version 4.14.11, December 2017) it receives the first KPTI backports, even before the public Meltdown/Spectre disclosure: the patches were prepared secretly under embargo
4.152018-01-28первый обычный (не LTS) релиз, вышедший уже после публичного раскрытия уязвимостей (3 января 2018) — содержит зрелые KPTI и retpoline-митигации против Meltdown/Spectre как часть стандартной поставки, а не аварийный бэкпортthe first regular (non-LTS) release to ship after the public vulnerability disclosure (January 3, 2018) — contains mature KPTI and retpoline mitigations against Meltdown/Spectre as part of the standard release, not an emergency backport
4.16 – 4.182018продолжение доработки Spectre-митигаций (обнаруживались новые варианты атаки — v1, v2, v3, v4 — на протяжении всего года), возврат к плановой разработке параллельно с латанием безопасностиcontinued refinement of Spectre mitigations (new attack variants — v1, v2, v3, v4 — kept surfacing throughout the year), a return to planned development alongside the security patching
4.192018-10-22последний LTS-релиз ветки: начальная поддержка Wi-Fi 6, файловая система EROFS (read-only, для встраиваемых систем и Android), union mount filesystemthe branch's final LTS release: initial Wi-Fi 6 support, the EROFS filesystem (read-only, for embedded systems and Android), a union mount filesystem implementation
4.202018-12-23последний релиз ветки вообще (не LTS, цикл разработки — всего 62 дня) — небольшой промежуточный шаг перед сменой номера на 5.0 в марте 2019the branch's absolute last release (non-LTS, a 62-day development cycle) — a small intermediate step before the number changed to 5.0 in March 2019

История: как это былоHistory: how it happened

01

Апрель 2015: live patching выходит из тени двух конкурирующих проектовApril 2015: live patching emerges from two competing projects' shadow

4.0.0 (12 апреля 2015) добавила фундамент Livepatch — механизма, позволяющего накатывать критические исправления безопасности на работающее production-ядро без перезагрузки. За этим стояли годы параллельной, местами конкурирующей работы: SUSE выпустила kGraft в феврале 2013, Red Hat представила kpatch месяцем позже. Оба проекта решали одну и ту же задачу разными способами — kpatch останавливал систему через stop_machine() и проверял стеки процессов на безопасность патчинга, kGraft обеспечивал consistency на уровне отдельных потоков и лениво мигрировал их к патченому состоянию на безопасных точках. Итоговый Livepatch объединил сильные стороны обеих моделей. Отдельно 4.0 принесла OverlayFS с поддержкой нескольких нижних слоёв — механизм, который через несколько лет станет стандартной файловой системой для образов контейнеров.4.0.0 (April 12, 2015) added the Livepatch foundation — a mechanism for applying critical security fixes to a running production kernel without a reboot. Behind it lay years of parallel, at times competing work: SUSE shipped kGraft in February 2013, Red Hat introduced kpatch a month later. Both projects solved the same problem differently — kpatch stopped the system via stop_machine() and inspected process stacks for patching safety, kGraft provided per-thread consistency and lazily migrated threads to the patched state at safe checkpoints. The resulting Livepatch combined both models' strengths. Separately, 4.0 brought OverlayFS with multi-layer support — a mechanism that within a few years would become the standard filesystem for container images.

02

2015–2016: eBPF взрослеет от фильтра пакетов до платформы2015–2016: eBPF grows from a packet filter into a platform

Классический BPF появился ещё в 1992-м как узкоспециализированная виртуальная машина для фильтрации сетевых пакетов без копирования их в userspace, а в ядро Linux попал в 1997-м (с версии 2.1) — им пользовались tcpdump и iptables. Расширенная версия, eBPF, влилась в 3.18 (2014) трудами Алексея Старовойтова: 64-битные регистры вместо старых, десять регистров вместо двух, инструкция BPF_CALL для дешёвого вызова функций ядра — виртуальная машина, устроенная гораздо ближе к реальному железу. Именно ветка 4.x довела эту базу до полноценной платформы: 4.1 (июнь 2015) добавила JIT-компиляцию байткода в машинный код и динамическую трассировку через kprobes — теперь eBPF-программы можно было цеплять практически на любую точку ядра и получать данные без перекомпиляции. К 4.6–4.8 (2016) добавились новые типы карт для обмена данными между ядром и userspace и первые программы XDP — обработка сетевых пакетов на самом раннем этапе, до входа в обычный сетевой стек, что даёт минимальную задержку. То, что начиналось как инструмент для tcpdump, к концу 2016 года стало платформой для observability, security и сетевой обработки одновременно.Classic BPF dates back to 1992 as a narrow virtual machine for filtering network packets without copying them to userspace, and landed in the Linux kernel in 1997 (from version 2.1) — used by tcpdump and iptables. The extended version, eBPF, merged in 3.18 (2014) through Alexei Starovoitov's work: 64-bit registers instead of the old ones, ten registers instead of two, a BPF_CALL instruction for cheap in-kernel function calls — a virtual machine built much closer to real hardware. It was the 4.x branch that took this base to a full platform: 4.1 (June 2015) added JIT compilation of bytecode into machine code and dynamic tracing via kprobes — eBPF programs could now hook into practically any point in the kernel and pull data without recompiling. By 4.6–4.8 (2016), new map types for kernel/userspace data exchange arrived, along with the first XDP programs — network packet processing at the earliest possible point, before entering the regular network stack, giving minimal latency. What started as a tool for tcpdump had, by the end of 2016, become a platform for observability, security, and network processing all at once.

03

2016: два LTS-релиза, один из которых определит Android на годы2016: two LTS releases, one of which would define Android for years

2016 год дал ветке два долгосрочных релиза подряд: 4.4 (10 января) и 4.9 (11 декабря). 4.4 продолжила линию user namespaces и cgroups в сторону лучшей изоляции контейнеров — прямое развитие 3.8. Но именно 4.9 получила самую длинную дистанцию влияния: шесть лет официальной поддержки сделали её одной из самых распространённых баз для Android Common Kernel — миллионы устройств годами работали на производных этой версии, независимо от того, какую версию Android они формально показывали пользователю. К этому моменту eBPF как платформа уже была достаточно зрелой, чтобы использоваться для полноценной observability, а не только для узких сетевых задач.2016 delivered two long-term releases back to back: 4.4 (January 10) and 4.9 (December 11). 4.4 continued the user-namespaces-and-cgroups line toward better container isolation — a direct extension of 3.8. But it was 4.9 that gained the longest reach: six years of official support made it one of the most widely used bases for the Android Common Kernel — millions of devices ran derivatives of this version for years, regardless of which Android version they formally showed the user. By this point eBPF as a platform was mature enough to be used for full observability, not just narrow networking tasks.

04

Январь 2018: Meltdown и Spectre — когда проблема оказалась в железе, а чинить пришлось ядроJanuary 2018: Meltdown and Spectre — when the problem was in hardware but the kernel had to fix it

Летом 2017 года исследователи независимо друг от друга обнаружили класс уязвимостей в механизме спекулятивного исполнения, которым пользуются практически все современные процессоры для повышения производительности: CPU выполняет инструкции заранее, до того как точно известно, понадобится ли результат, и в определённых условиях следы этого выполнения можно извлечь через побочные каналы (тайминг кеша), даже если сама спекулятивная ветка потом отбрасывается. Meltdown (CVE-2017-5754) позволял непривилегированному процессу читать память ядра. Spectre (CVE-2017-5753, CVE-2017-5715) был опаснее в теории, потому что затрагивал не только Intel, но и почти все архитектуры, и защититься от него было структурно сложнее. Раскрытие планировалось на 9 января 2018 под embargo, но Google объявила уязвимости публично уже 3 января, после того как слухи начали просачиваться на несколько дней раньше графика. Ответ ядра — Kernel Page Table Isolation (KPTI, изначально называвшийся KAISER), полностью разделяющий адресные пространства ядра и пользователя, чтобы закрыть Meltdown, и retpoline — техника замены косвенных вызовов функций прямыми вызовами специальных thunk'ов при поддержке компилятора, чтобы смягчить Spectre. LTS-ветки 4.14 и 4.9 получили экстренные бэкпорты (4.14.11 и 4.9.75 соответственно) практически сразу после раскрытия, а первый штатный (не LTS) релиз с зрелыми митигациями «из коробки», 4.15, вышел 28 января 2018.In the summer of 2017, researchers independently discovered a class of vulnerabilities in speculative execution, a mechanism nearly every modern processor uses for performance: the CPU executes instructions ahead of time, before it's certain the result will be needed, and under certain conditions traces of that execution can be extracted via side channels (cache timing), even when the speculative branch is later discarded. Meltdown (CVE-2017-5754) let an unprivileged process read kernel memory. Spectre (CVE-2017-5753, CVE-2017-5715) was theoretically more dangerous because it hit not just Intel but nearly every architecture, and was structurally harder to defend against. Disclosure was planned for January 9, 2018 under embargo, but Google announced the vulnerabilities publicly on January 3, after rumors had started leaking a few days ahead of schedule. The kernel's response was Kernel Page Table Isolation (KPTI, originally called KAISER), fully separating kernel and user address spaces to close Meltdown, and retpoline — a technique replacing indirect function calls with direct calls to special thunks, with compiler support, to mitigate Spectre. The LTS branches 4.14 and 4.9 received emergency backports (4.14.11 and 4.9.75, respectively) almost immediately after disclosure, and the first regular (non-LTS) release shipping with mature mitigations out of the box, 4.15, landed January 28, 2018.

05

2018: год под знаком новых вариантов и возврата к плану2018: a year defined by new variants and a return to the plan

Патч 4.15 не закрыл тему — в течение всего 2018 года исследователи продолжали находить новые варианты спекулятивного исполнения (обозначавшиеся v1 через v4 и далее), и релизы 4.16–4.18 несли очередные раунды митигаций параллельно с обычной разработкой. К октябрю ситуация стабилизировалась достаточно, чтобы 4.19 (22 октября 2018), ставшая последней LTS-веткой линейки 4.x, смогла сосредоточиться на плановых возможностях: начальная поддержка Wi-Fi 6, файловая система EROFS для read-only сценариев (встраиваемые системы, часть Android-образов), union mount filesystem. Последний вообще релиз ветки, 4.20 (23 декабря 2018), был коротким промежуточным шагом — 62-дневный цикл разработки — перед сменой номера на 5.0 в марте 2019.The 4.15 patch didn't close the topic — throughout 2018 researchers kept finding new speculative-execution variants (labeled v1 through v4 and beyond), and releases 4.16–4.18 carried further rounds of mitigations alongside regular development. By October the situation had stabilized enough that 4.19 (October 22, 2018), which became the 4.x line's last LTS branch, could focus on planned features: initial Wi-Fi 6 support, the EROFS filesystem for read-only scenarios (embedded systems, part of Android images), a union mount filesystem. The branch's absolute last release, 4.20 (December 23, 2018), was a short intermediate step — a 62-day development cycle — before the number changed to 5.0 in March 2019.

Архитектура на конец веткиArchitecture by the branch's end

К 4.20 ядро приобрело два свойства, которые определят следующее десятилетие: eBPF как полноценная программируемая платформа (JIT-компиляция, карты для обмена данными, kprobes, XDP), ставшая фундаментом для будущих инструментов observability и security за пределами ядра (Cilium, Falco, BCC/bpftrace появятся позже именно на этой базе), и Kernel Page Table Isolation как штатная, а не временная защита от целого класса атак через спекулятивное исполнение — цена этой защиты, ощутимая просадка производительности на syscall-интенсивных нагрузках, стала постоянной частью вычислительного бюджета для всех современных x86-систем. Live patching к этому моменту уже был production-инструментом, а не экспериментом. Модель разработки — та же непрерывная схема с 2.6, невзирая на то, что почти год пришлось потратить на аварийное реагирование, а не на плановые фичи.By 4.20 the kernel had gained two properties that would define the following decade: eBPF as a full programmable platform (JIT compilation, data-exchange maps, kprobes, XDP), becoming the foundation for future observability and security tools built outside the kernel (Cilium, Falco, BCC/bpftrace would all later build on exactly this base), and Kernel Page Table Isolation as a standard, not temporary, defense against a whole class of speculative-execution attacks — the cost of that defense, a noticeable performance hit on syscall-heavy workloads, became a permanent part of the compute budget for every modern x86 system. Live patching was already a production tool by this point, not an experiment. The development model remained the same continuous scheme from 2.6, despite nearly a year having to go toward emergency response instead of planned features.

Грабли и мифыGotchas & myths

«Meltdown/Spectre — баг в Linux» — нет, баг в железе, залатанный софтом"Meltdown/Spectre is a Linux bug" — no, a hardware flaw patched by software

Обе уязвимости — свойство физической реализации спекулятивного исполнения в самих процессорах, а не ошибка в коде ядра Linux. KPTI и retpoline — это программные обходные пути (workarounds), закрывающие последствия аппаратной проблемы ценой производительности, а не исправления бага в исходном смысле слова. Затронуты были все ОС на уязвимом железе — Windows, macOS, BSD получили аналогичные митигации примерно в те же сроки, что подчёркивает: проблема была в CPU, а не в конкретном ядре.Both vulnerabilities are a property of how speculative execution is physically implemented in the processors themselves, not a bug in the Linux kernel's code. KPTI and retpoline are software workarounds that close off the hardware problem's consequences at a performance cost, not bug fixes in the original sense of the word. Every OS on vulnerable hardware was affected — Windows, macOS, and BSD received analogous mitigations on roughly the same timeline, underscoring that the problem lived in the CPU, not in any particular kernel.

eBPF — не «новый BPF», а совсем другая виртуальная машинаeBPF isn't "a new BPF" — it's a fundamentally different virtual machine

Название создаёт впечатление незначительного апгрейда классического BPF из 1990-х, но разница архитектурная: 64-битные регистры вместо узкой модели с двумя, вызов произвольных функций ядра через BPF_CALL, верификатор безопасности, карты данных для обмена состоянием — то, что раньше умело только фильтровать пакеты, стало платформой общего назначения для трассировки, security-мониторинга и сетевой обработки. Отождествлять «eBPF» с «tcpdump-фильтрами» — устаревшее на добрый десяток лет представление.The name creates an impression of a minor upgrade to classic 1990s BPF, but the difference is architectural: 64-bit registers instead of a narrow two-register model, calling arbitrary kernel functions via BPF_CALL, a safety verifier, data maps for exchanging state — what used to only filter packets became a general-purpose platform for tracing, security monitoring, and network processing. Equating "eBPF" with "tcpdump filters" is a good decade out of date.

«Ядро 4.9 = Android 7» — версия ядра и версия Android не связаны напрямую"kernel 4.9 means Android 7" — the kernel version and Android version don't map directly

4.9 действительно стала одной из самых распространённых баз Android Common Kernel, но производители устройств бэкпортируют патчи и держат конкретную версию ядра годами, независимо от того, какая версия Android (и с каким собственным номером) установлена поверх. Судить о возрасте или патч-уровне системы по единственной цифре версии ядра — та же ошибка, что и с RHEL 7 на «ядре 3.10» из ветки 3.x: номер версии в проде почти никогда не отражает буквальный набор апстрим-патчей без сверки с реальным changelog вендора.4.9 genuinely became one of the most widely used Android Common Kernel bases, but device makers backport patches and keep a specific kernel version for years, independent of whatever Android version (with its own separate number) sits on top. Judging a system's age or patch level from a single kernel version digit is the same mistake as RHEL 7 running "kernel 3.10" from the 3.x branch — a production version number almost never reflects the literal upstream patch set without checking the vendor's actual changelog.

ТерминыTerms

live kernel patching (Livepatch)live kernel patching (Livepatch)
механизм применения критических исправлений безопасности к работающему production-ядру без перезагрузки системы. До этого закрытие серьёзной уязвимости в ядре означало обязательный reboot — для серверов, которые обязаны работать без простоя, это была системная проблема. Фундамент влит в 4.0 (2015).a mechanism for applying critical security fixes to a running production kernel without a reboot. Before this, closing a serious kernel vulnerability meant a mandatory reboot — a systemic problem for servers that have to run without downtime. The foundation merged in 4.0 (2015).
kGraft / kpatch
два конкурирующих проекта live patching, решавших одну задачу разными способами: kpatch (Red Hat) останавливал систему через stop_machine() и проверял стеки процессов на безопасность патчинга; kGraft (SUSE) обеспечивал consistency на уровне отдельных потоков и лениво мигрировал их к патченому состоянию. В 4.0 (2015) объединены в единый механизм Livepatch, взявший сильные стороны обеих моделей.two competing live-patching projects solving the same problem differently: kpatch (Red Hat) stopped the system via stop_machine() and inspected process stacks for patching safety; kGraft (SUSE) provided per-thread consistency and lazily migrated threads to the patched state. In 4.0 (2015) they were unified into the single Livepatch mechanism, combining both models' strengths.
OverlayFS
файловая система, объединяющая несколько слоёв каталогов в один видимый: нижний слой остаётся неизменным (read-only), а все изменения пишутся в верхний. Это техническая основа образов контейнеров — общий базовый слой (например, ОС) переиспользуется многими контейнерами, а каждый видит только свои изменения поверх. Поддержка нескольких нижних слоёв добавлена в 4.0 (2015).a filesystem that merges several directory layers into one visible view: the lower layer stays unchanged (read-only), while all changes are written to the upper one. This is the technical basis of container images — a shared base layer (say, an OS) gets reused by many containers, each seeing only its own changes on top. Multi-lower-layer support was added in 4.0 (2015).
eBPF
extended BPF — программируемая виртуальная машина внутри ядра, позволяющая безопасно выполнять пользовательский код на разных точках ядра без перекомпиляции и без риска уронить систему (код проходит верификатор перед запуском). Выросла из узкоспециализированного фильтра сетевых пакетов (классический BPF, 1992/1997) в платформу общего назначения для сетевой обработки, трассировки, security-мониторинга и observability — именно ветка 4.x довела её до этого состояния.extended BPF — a programmable virtual machine inside the kernel that lets user code run safely at various kernel points without recompilation and without risking a crash (code passes a verifier before running). It grew from a narrow network-packet filter (classic BPF, 1992/1997) into a general-purpose platform for network processing, tracing, security monitoring, and observability — it was the 4.x branch that brought it to that state.
JIT-компиляцияJIT compilation
Just-In-Time — компиляция байткода в машинный код непосредственно перед выполнением, а не заранее. Для eBPF это означает, что вместо построчной интерпретации байткода процессор выполняет уже готовый нативный код, что резко ускоряет работу программ. Добавлена для eBPF в 4.1 (2015).Just-In-Time — compiling bytecode into machine code right before execution, rather than ahead of time. For eBPF this means the CPU runs ready native code instead of interpreting bytecode line by line, sharply speeding up execution. Added for eBPF in 4.1 (2015).
kprobes
механизм динамической трассировки, позволяющий «зацепиться» за практически любую точку кода ядра и собирать данные (аргументы функций, время выполнения и т.п.) без изменения исходников и без перекомпиляции. Вместе с JIT-компиляцией добавлен для eBPF в 4.1 (2015), что и превратило eBPF в инструмент для observability.a dynamic tracing mechanism that lets code hook into practically any point in the kernel and collect data (function arguments, execution time, and so on) without touching the source or recompiling. Added for eBPF alongside JIT compilation in 4.1 (2015), which is what turned eBPF into an observability tool.
XDP
eXpress Data Path — обработка сетевых пакетов на самом раннем этапе, до входа в обычный сетевой стек ядра. Пропуская обычный путь пакета через стек, XDP даёт минимальную задержку — полезно для файрволов, балансировщиков нагрузки и DDoS-защиты. Первые XDP-программы для eBPF появились в 4.6–4.8 (2016).eXpress Data Path — network packet processing at the earliest possible point, before packets enter the regular kernel network stack. By skipping a packet's usual path through the stack, XDP gives minimal latency — useful for firewalls, load balancers, and DDoS protection. The first XDP programs for eBPF appeared in 4.6–4.8 (2016).
спекулятивное исполнениеspeculative execution
техника, которой пользуются практически все современные процессоры для повышения производительности: CPU выполняет инструкции заранее, до того как точно известно, понадобится ли результат (например, до того как известен исход условного перехода). Если предсказание оказалось неверным, результат отбрасывается — но следы самого выполнения можно извлечь через побочные каналы (тайминг кеша), что и легло в основу Meltdown и Spectre.a technique nearly every modern processor uses for performance: the CPU executes instructions ahead of time, before it's certain the result will be needed (say, before a conditional branch's outcome is known). If the guess turns out wrong, the result is discarded — but traces of the execution itself can be extracted via side channels (cache timing), which is exactly what Meltdown and Spectre exploited.
Meltdown / Spectre
два класса аппаратных уязвимостей, обнаруженных летом 2017-го и раскрытых в январе 2018-го, эксплуатирующих побочные эффекты спекулятивного исполнения для чтения защищённой памяти. Meltdown (CVE-2017-5754) позволял непривилегированному процессу читать память ядра. Spectre (CVE-2017-5753, CVE-2017-5715) был опаснее в теории, потому что затрагивал не только Intel, но почти все архитектуры, и защититься от него было структурно сложнее. Проблема лежит в самом железе, а не в коде ядра.two classes of hardware vulnerabilities discovered in summer 2017 and disclosed in January 2018, exploiting speculative execution's side effects to read protected memory. Meltdown (CVE-2017-5754) let an unprivileged process read kernel memory. Spectre (CVE-2017-5753, CVE-2017-5715) was theoretically more dangerous because it hit not just Intel but nearly every architecture, and was structurally harder to defend against. The problem lives in the hardware itself, not in kernel code.
KPTI
Kernel Page Table Isolation (изначально называвшийся KAISER) — программная защита от Meltdown, полностью разделяющая адресные пространства ядра и пользовательского процесса, так что из userspace физически невозможно прочитать память ядра через спекулятивное исполнение. Плата за защиту — заметная просадка производительности на syscall-интенсивных нагрузках. Экстренно бэкпортирован в LTS-ветки (4.14.11, 4.9.75) сразу после раскрытия в январе 2018, штатно вошёл в 4.15.Kernel Page Table Isolation (originally called KAISER) — a software defense against Meltdown that fully separates kernel and user-process address spaces, so it becomes physically impossible to read kernel memory from userspace via speculative execution. The cost is a noticeable performance hit on syscall-heavy workloads. Emergency-backported into LTS branches (4.14.11, 4.9.75) right after the January 2018 disclosure, and shipped standard in 4.15.
retpoline
техника защиты от Spectre, заменяющая косвенные вызовы функций (indirect calls, через которые и эксплуатируется уязвимость) прямыми вызовами специальных промежуточных функций (thunk), которые не дают процессору спекулятивно исполнить код по неверному адресу. Требует поддержки компилятора — ядро нужно было пересобрать компилятором, знающим про retpoline. Вошла в стандартную поставку начиная с 4.15 (январь 2018).a Spectre mitigation that replaces indirect function calls (the mechanism the vulnerability exploits) with direct calls to special intermediate functions (thunks) that prevent the CPU from speculatively executing code at the wrong address. Requires compiler support — the kernel had to be rebuilt with a retpoline-aware compiler. Shipped as part of the standard release starting with 4.15 (January 2018).
DAX
способ обхода кеша страниц ядра при работе с постоянной памятью (persistent memory) — приложение обращается к данным напрямую, минуя лишнее копирование через page cache, что имеет смысл именно для памяти, которая и так энергонезависима. Добавлен в 4.0 (2015).a way of bypassing the kernel's page cache when working with persistent memory — an application accesses data directly, skipping the extra copy through the page cache, which makes sense specifically for memory that's already non-volatile. Added in 4.0 (2015).
KASAN
Kernel Address Sanitizer — динамический детектор ошибок работы с памятью (выход за границы буфера, use-after-free и т.п.), встроенный в ядро для отладки. Ловит такие баги во время выполнения на тестовых/отладочных сборках, а не только гипотетически на code review. Добавлен в 4.0 (2015).Kernel Address Sanitizer — a dynamic memory-error detector (buffer overruns, use-after-free, and similar bugs) built into the kernel for debugging. It catches such bugs at runtime on test/debug builds, rather than only hypothetically during code review. Added in 4.0 (2015).