Компания 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 <<<

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

    Интересно, как это все проявится в потреблении ресурсов. По моим скромным наблюдениям, Chromium жрет меньше, нежели Firefox.

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

      у фф были блокировки, когда от 200+ вкладок. хром просто лучше тянул нагрузку. а памяти - пофигу. у меня своп 64 гига на SSD.

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

        у меня своп 64 гига на SSD.

        Ах ты, буржуин :)

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

          как на freebsd перешел, так пришлось:(( она своп жрет, как не в себе. ну линукс тоже, но не так.

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

            она своп жрет

            Это да. Тоже такое заметил.

            • 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

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

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

          Это разве буржуин… На лоре один чувак вывод htop постил. У него там Threadripper на 64 потока и 256 гигов рамы…

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

            да я тоже жалею, что в свое время не разорился еще на 32 гига. мат.плата поддеживает даже 256, а вот гоняться за сертифицированной ddr3 не очень.

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

            У него там Threadripper на 64 потока и 256 гигов рамы…

            Серверная система. Наверно…

            Это разве буржуин

            По сравнению с моими скромными четырьмя гигами, он буржуин :)

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

              Серверная система. Наверно…

              у меня тоже

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

    Теперь компиляция будет ещё дольше?

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

      теперь это смогу делать только корпорации