Компания Google объявила о включении языка программирования Rust в число языков, допустимых в коде проекта Chromium. Существующий код пока не планируют переписывать на Rust, но отныне будет разрешена интеграция в кодовую базу сторонних библиотек, написанных на Rust. В сборочную систему уже добавлен инструментарий для компиляции кода на языке Rust, проведения тестов и интеграции компонентов на Rust с кодом на C++. Появление кода на Rust в составе выпусков Chrome ожидается в следующем году.

К претендующим на интеграцию в кодовую базу Chromium сторонним библиотекам на Rust предъявляется ряд требований, например, библиотека должна превосходить аналоги по скорости, потреблению памяти и стабильности или быть единственной реализацией определённой технологии. Библиотеки на Rust также допустимо использовать когда функциональность может выполняться в привилегированном процессе или когда использование библиотеки даёт возможность снизить риск возникновения ошибок по сравнению с другими библиотеками или кодом на C++. Какие именно библиотеки могут войти в состав Chromium пока не решено.

Решение принято в рамках инициативы по предотвращению появления ошибок работы с памятью в кодовой базе Chrome. Судя по предоставленной два года назад статистике 70% опасных и критических проблем с безопасностью в Chromium вызваны ошибками при работе с памятью. Применение языка Rust, который сфокусирован на безопасной работе с памятью и обеспечивает автоматическое управление памятью, позволит снизить риск появления уязвимостей, вызванных такими проблемами как обращение к области памяти после её освобождения и выход за границы буфера.

Безопасная работа с памятью обеспечивается в Rust во время компиляции через проверку ссылок, отслеживание владения объектами и учёт времени жизни объектов (области видимости), а также через оценку корректности доступа к памяти во время выполнения кода. Rust также предоставляет средства для защиты от целочисленных переполнений, требует обязательной инициализации значений переменных перед использованием, лучше обрабатывает ошибки в стандартной библиотеке, применяет концепцию неизменяемости (immutable) ссылок и переменных по умолчанию, предлагает сильную статическую типизацию для минимизации логических ошибок.

Применение Rust даст возможность добиться более простого и безопасного соблюдения "правила двух", применяемого Google для поддержания безопасности кодовой базы. В соответствии с данным правилом любой добавляемый код должен подпадать не больше, чем под два условия из трёх: работа с непроверенными входными данными, использование небезопасного языка программирования (C/C++) и выполнение с повышенными привилегиями. Из этого правила следует, что код для обработки внешних данных должен либо быть урезан до минимальных привилегий (изолирован), либо быть написан на безопасном языке программирования.

В случае с Rust, который изначально разрабатывался с оглядкой на использование в браузере, интеграция с существующем кодом может быть произведена без применения IPC и с меньшими усложнениями организации защиты от ошибок при работе с памятью, что позволит ускорить процесс разработки (требуется писать меньше кода и проводить более простое рецензирование) и снизить число связанных с безопасностью ошибок.

Для упрощения интеграции кода на Rust с существующим кодом на C++ и обхода связанных с интеграцией рисков и ограничений, в настоящее время решено ограничиться однонаправленным взаимодействием - обращением из С++ к Rust (т.е. код на Rust может лишь вызываться из кода C++ через функции API, но не смешиваться с кодом на C++), что также даст возможность держать под контролем дерево зависимостей. Вторым ограничением является поддержка только сторонних библиотек, поставляемых в форме отдельных компонентов, не привязанных к Chromium и имеющих API, ориентированный на выполнение конкретных задач.

Кроме применения Rust для блокирования эксплуатации уязвимостей, вызванных обращением к уже освобождённым блокам памяти (use-after-free), начиная с выпуска Chrome 102 в коде на С++ вместо обычных указателей началось применение типа MiraclePtr (raw_ptr). MiraclePtr предоставляет обвязку над указателями, выполняющую дополнительные проверки обращения к освобождённым областям памяти и аварийно завершающую работу в случае обнаружения подобных обращений. Влияние нового метода защиты на производительность и потребление памяти оценивается как незначительное.

// cc-by opennet.ru
// converted with crypt’s opennet autoreposter <<<

  • cryptOP
    link
    fedilink
    arrow-up
    0
    ·
    3 years ago

    ну там просто алгоритм 1:1 половина в паяти, половина в своп или как-то так.

      • cryptOP
        link
        fedilink
        arrow-up
        0
        ·
        3 years ago

        для каких-то операций, возможно, резерв.

        при том, что у меня в своп уже утекло 60, всеравно держит свободной памяти 2.

        Mem: 7339M Active, 11G Inact, 4435M Laundry, 7337M Wired, 1488M Buf, 1769M Free
        ARC: 2584M Total, 1860M MFU, 330M MRU, 11M Anon, 26M Header, 358M Other
             1024M Compressed, 3128M Uncompressed, 3.06:1 Ratio
        Swap: 64G Total, 60G Used, 4370M Free, 93% Inuse
        
        
    • odalist
      link
      fedilink
      arrow-up
      0
      ·
      3 years ago

      ну там просто алгоритм 1:1 половина в паяти, половина в своп или как-то так.

      Ну да. Это я понял. Что интересно, это то, что при аналогичных нагрузках, FreeBSD работает шустрее…Вот например, она, при сильных нагрузках, жрет свап, но на отзывчивости системы это не сказывается. А вот Линукс притормаживает.

      • cryptOP
        link
        fedilink
        arrow-up
        0
        ·
        3 years ago

        алгоритмы вытеснения совсем разные. я че-то пытался читать, но все забыл.

        вот сейчас, если я не разружу своп, то через 4 гига система встанет колом.

      • cryptOP
        link
        fedilink
        arrow-up
        0
        ·
        3 years ago

        я так понимаю, freebsd легче, потому что кодовая база меньше. меньше сложных наворотов на все возможные случаи применения, как в линуксе. но недостатки UNIX, как ОС пре-десктопной эры, сохраняются. все процессы в системе равны. и что плохо в отличие от линукса, отсутствует приоретизация по IO для юзера.

      • cryptOP
        link
        fedilink
        arrow-up
        0
        ·
        3 years ago

        такая новость тут была… я было обрадовался… во FreeBSD решили добавить hammer2! … но только на чтение… такой fail

        hammer2, как ZFS, но гораздо легче. какой смысл только на чтение… тем более, что в NetBSD полноценно… не понимаю.

        • odalist
          link
          fedilink
          arrow-up
          0
          ·
          3 years ago

          hammer2

          Ну да. Читал, что это хорошая файловая система.