Google обнаружил сотни состояний гонки в ядре Linux с помощью KCSAN

Ядро Linux

Инженеры Google которые вносят вклад в ядро ​​Linux объявили, что они обнаружили сотни «состояний гонки» в ядре с помощью KCSAN. Компания давно работает над AddressSanitizer для поиска ошибок, связанных с повреждением памяти, или UndefinedBehaviorSanitizer для неопределенного поведения в коде.

В это время, Google предлагает новый детектор «условий гонки» для ядра Linux под названием KCSAN. (Средство очистки параллелизма ядра). Эти критические уязвимости не новы. Фактически Условия состязания возникают, когда два или более потока в одном процессе одновременно обращаются к одной и той же области памяти., где по крайней мере один из обращений - запись, и когда потоки не используют никаких исключительных блокировок для управления своим доступом к этой памяти.

Когда эти условия выполняются, порядок доступа не является детерминированным, и расчет может давать разные результаты от одного прогона к другому в зависимости от этого порядка.

Условия гонки все чаще рассматриваются как ошибки одновременного доступа, и их трудно воспроизвести. и диагностировать в параллельных программах. Ядро Linux - это крупномасштабная программная система, в которой многопоточный параллелизм и недетерминированное чередование потоков больше зависят от условий конкуренции.

Некоторые конкурентные ситуации могут быть благоприятными, но многие из них, выявленные до сих пор, считаются ошибками.

Ядро Linux предоставляет несколько механизмов для предотвращения и управления этими типами условий. Поскольку существуют такие инструменты, как Thread Analyzer или KTSAN (Kernel Thread Sanitizer) для обнаружения критических ошибок выполнения в ядре Linux.

Однако Google, который также вносит свой вклад в ядро ​​Linux, недавно предложил KCSAN, новый детектор состояний гонки для ядра, аналогичный KTSAN.

Согласно Google, KCSAN фокусируется на обнаружении конкурентных ситуаций в коде ядра.. Этот динамический детектор критических попаданий является альтернативой средству очистки потоков ядра (KTSAN).

Согласно объяснению Google, KCSAN основан на точках контроля отбора проб, в отличие от детектора KTSAN, который является важным детектором гонки перед событием. Ключевые приоритеты в разработке KCSAN - отсутствие ложных срабатываний, масштабируемость и простота.

KCSAN использует инструменты компиляции для доступа к памяти. KCSAN совместим с компиляторами GCC и Clang. Для GCC требуется версия 7.3.0 или новее, а для Clang - версия 7.0.0 или новее.

На странице проекта GitHubМарко Элвер из Google написал, что, используя KCSAN в тестах в прошлом месяце, они всего за два дня обнаружили более 300 уникальных основных конкурентных ситуаций. KCSAN предоставляет несколько параметров конфигурации для настройки своего поведения.

«Мы использовали KCSAN через Syzkaller в течение нескольких недель и обнаружили множество ошибок. Первоначально в сентябре 2019 года всего за два дня мы выявили более 300 уникальных конкурентных ситуаций », - написал он.

Google сказал, что общий подход основан на DataCollider, еще один динамический детектор конкурентных ситуаций в модулях ядра. Но в отличие от DataCollider, KCSAN не использует точки мониторинга оборудования, вместо этого он полагается на инструменты компиляции.

Точки мониторинга реализованы с использованием эффективного кодирования, в котором тип, размер и адрес доступа хранятся в длинном файле. Преимущества использования гибких точек мониторинга заключаются в переносимости и большей гибкости в ограничении доступа, который может активировать точка мониторинга.

Вот некоторые из ключевых моментов, которые KCSAN сделал для Google:

  • Высокая производительность: Время выполнения KCSAN минимально и не требует блокировки общего состояния для каждого доступа. Результат - намного лучшая производительность, чем у KTSAN.
  • Без дополнительной памяти: согласно Google, кэш не требуется. Текущая реализация использует небольшое количество длин для кодирования информации точки мониторинга, которой можно пренебречь.
  • Команда памяти: KCSAN не знает правил управления моделью памяти ядра Linux (LKMM). Это может привести к потере критических гонок (ложноотрицательные результаты) по сравнению с детектором гонок перед соревнованиями, таким как KTSAN.
  • точность: Согласно Google, KCSAN неточен, потому что он использует стратегию выборки;
  • Требуется аннотация: минимальная аннотация требуется вне среды выполнения KCSAN. В случае прослушивателя событий предварительного условия любое упущение приводит к ложным срабатываниям, что особенно важно в контексте ядра, которое включает настраиваемые механизмы синхронизации.
  • Обнаружение динамической записи с устройств: Проверяя значения данных во время установки точки наблюдения, можно также обнаружить динамическую запись с устройств.

Оставьте свой комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

  1. Ответственный за данные: AB Internet Networks 2008 SL
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.