Chrome のメモリの安全性に関するアップデート

この記事は Chrome セキュリティ チーム、Adrian Taylor、Andrew Whalley、Dana Jansens、Nasko Oskov による Google Online Security Blog の記事 “An update on Memory Safety in Chrome” を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

セキュリティは、いたちごっこのようなものです。攻撃者が新しい手法を生み出せば、ブラウザは一歩先を行くために新たな防御策を講じ続けなければなりません。そのため、Chrome は、サンドボックスサイト分離をベースとした今までにない強固なマルチプロセス アーキテクチャを構築してきました。これらは、ファジングとともに、現在も私たちの主要な防衛線であり続けています。しかし、それも限界に近づきつつあり、この戦略だけに頼って実際に出回っている攻撃に対処することはできなくなっています。

昨年、Google は、重大なセキュリティ バグの 70% 超がメモリの安全性の問題であることを明らかにしました。つまり、C 言語や C++ 言語のポインタのミスによって、メモリが誤解釈されてしまうのです。

メモリの安全性は、世界のソフトウェア エンジニアリング コミュニティが真剣に受け止める必要がある問題です。しかし、これは同時にチャンスでもあります。なぜなら、多くのバグに同じような根本原因があるということは、1 つの対策で相当のバグを撲滅できる可能性があるからです。

Chrome では、このチャンスを活かすため、大まかに次の 3 つの方法を検討しています。

  1. ポインタが正しいことをコンパイル時にチェックすることで、C++ の安全性を向上
  2. ポインタが正しいことを実行時にチェックすることで、C++ の安全性を向上
  3. メモリ安全な言語をコードベースの一部に使うことについて調査

「コンパイル時にチェック」とは、Chrome が皆さんのデバイスにインストールされる前の、ビルドプロセスの段階で安全性を保証することを指します。「実行時」とは、Chrome が皆さんのデバイスで実行されている間にチェックを行うことを指します。

実行時チェックには、パフォーマンスのコストが伴います。ポインタが正しいかどうかをチェックする操作は、メモリや CPU 時間にとっては微少なコストです。しかし、ポインタの数は膨大なので、そのコストは積み重なります。莫大な数のユーザーを持つ Chrome にとって、パフォーマンスは重要です。ユーザーの多くはメモリの少ない低電力モバイル デバイスを使っているため、こういったチェックが増加すれば、ウェブが遅くなってしまいます。

つまり、選択肢 1、コンパイル時に C++ を安全にする方法を選ぶのが理想です。しかし、この言語はそのような設計にはなっていません。この領域で Google が取り組んできたことを詳しく知りたい方は、借用の問題 : C++ の Borrow-Checker の難しさをご覧ください。

そのため、ほとんどは選択肢 2 と 3、つまり C++ の安全性を向上させる(ただし遅くなる)か、別の言語を利用する方法をとらざるをえません。Chrome のセキュリティでは、この両方のアプローチを試しています。

C++ の安全性ソリューションに向けた主な取り組みには、MiraclePtrABSL/STL 強化モードなどがあります。どちらも、悪用できるセキュリティ バグの大半を解消することを目指していますが、ある程度のパフォーマンス低下も想定されます。たとえば MiraclePtr は、参照されているメモリを隔離することで解放後の使用に関するバグを防ぎますが、多くのモバイル デバイスではメモリはとても貴重なため、隔離用の領域を割り当てるのは難しくなっています。それでも、MiraclePtr は、ブラウザのプロセスで解放後の使用に関するバグを 50% 以上解消できる可能性を秘めています。今のところ、これは Chrome のセキュリティにとって大きなメリットです。

それと並行して、将来的に Chrome の一部でメモリ安全な言語を使えないかを検討しています。その第一候補は、Mozilla にいる私たちの友人が開発した Rust です。Rust は(ほとんどが)コンパイル時に安全です。つまり、Rust コンパイラは、コードが皆さんのデバイスにインストールされる前にポインタのミスを見つけます。そのため、パフォーマンスが低下することはありません。しかし、C++ と Rust を十分に連携して使えるかどうかという未解決の問題が残されています。また、たとえ明日から Rust で新しい大型コンポーネントを書き始めたとしても、セキュリティ脆弱性の大部分を解消できるのは、おそらく何年も後になるはずです。さらに、既存のコンポーネントの一部を Rust で書けるほど言語の境界を十分にクリーンにできるかという問題もあります。この点は、まだ明らかではありません。Google は、Chromium ソースコード ツリーのユーザーが触れることのない限られた部分で、Rust の実験を始めています。しかし、製品版の Chrome にはまだ含まれておらず、試験運用版のフェーズにとどまっています。

以上の理由から、Google は両方の戦略を並行して追求しています。C++ の安全性向上、Chrome での新しい言語の試行というこの領域の最新情報にぜひご注目ください。

Reviewed by Eiji Kitamura – Developer Relations Team<!—->

【UWP】Windows 11 風の UI でアプリを作る

こんなの作ります。 私のPCは Windows11 になれないので、Windows10 ながらも UI だけは Windows 11 っぽくしたいと思います。そんなときに使うパッケージがこれです。 docs.microsoft.com Windows UI (WinUI) を使用すると上の画像のようなコントロールを使用することができるようになります。 実行環境 Visual Studio 2022 (17.0.0 preview 4.1) Windows 10 19044.1263 プロジェクト作成と NuGet 追加 まずはプロジェクト作成ですが、WinUI は UWP に対応しているので「…

マイクラプログラミング入門の動画について

以前より「マイクラ自動化」というプログラミング経験のある方を対象にして、C#からマイクラのコマンドを実行する方法を紹介していました。 しかし、マイクラ自動化はプログラミングを始めたばかりの方にはハードルが高いと思いました。特に、CoreRCONライブラリを使用するために非同期なメソッドが必要だったり、マイクラのコマンドを知らないと動かせなかったりと、色々と前提知識が必要です。 そこで、これからプログラミングを始めたい方を対象とした「マイクラプログラミング入門」という動画シリーズの製作をはじめました。このシリーズでは、MinecraftConnectionライブラリを使用して、「マイクラの世界で…

【C#】マイクラで矢を飛ばすプログラム

前回はプレイヤーにパーティクルを付与しつつ、爆発させるような魔法攻撃を再現しました。今回は矢を連続で打ち込むような攻撃をプログラムから実行してみます。(エミヤさんの例の技っぽいやつの再現です。) こちら参考画像になります。 準備 Minecraft Server 1.17.1 (RCON設定済み) Minecraft 1.17.1 Visual Studio または Visual Studio Code 1. コマンド 必要なコマンドは矢を召喚するコマンドと、矢を飛ばすコマンド、矢を消すコマンドです。矢は消さないとマイクラが重たくなるので、矢を撃って見えなくなる距離になったら消すようにしましょ…

【C#】マイクラでイ゛オ゛ナ゛ズン゛!してみた

マイクラの世界で「魔法が使えたらなぁ…」なんて思ったことありませんか? 例えば、クリーパーやTNTを使えば爆発させることが出来ますし、ウィッチやポーションを使えば状態異常を付与することができます。他にも、雷を落とすことだって可能です。 可能なら、やってみましょう。イ゛オ゛ナ゛ズン゛!(睡眠不足) こちら、参考画像になります。 準備 Minecraft Server 1.17.1 (RCON設定済み) Minecraft 1.17.1 Visual Studio または Visual Studio Code 1. マイクラで爆発パーティクルを作る TNTやクリーパーが爆発するとき、爆風のパー…

MinecraftConnection 1.1.0 での花火アイテム作成方法

マイクラプログラミング用のライブラリ MinecraftConnection ですが、先日 Version 1.1.0 をリリースしました。 www.nuget.org 今回は花火アップデートということで、花火のコンストラクタや拡張メソッドの追加など、いくつかの変更をおこないました。 コンストラクタの引数変更 以前は、花火アイテム(インスタンス)を作るためにコンストラクタの引数に7つのパラメータが必要でした。 花火が爆発するまでの時間 (int) 飛行距離 (int) 花火が爆発したときの形状 (FireworksShapes) きらめき効果の有無 (bool) 流星効果の有無 (bool) …

【C#】マイクラで花火を打ち上げる(万華鏡型花火製作)

マイクラで花火を打ち上げる場合、/summon コマンドと NBT を用いて花火の形状や色等を決めます。これを連続して打ち上げることで様々な形の花火を演出することが出来ます。 今回は万華鏡型と呼ばれる花火を打ち上げるための方法を紹介します。 1. 万華鏡型の花火 土浦全国花火競技大会によれば、このような形を万華鏡というみたいです。 www.tsuchiura-hanabi.jp この花火を打ち上げるには2種類の花火が必要です。1つ目は大玉花火、2つ目はバースト型の花火です。マイクラには花火の形が5種類しかないので、これらを駆使して本物の花火に近づけていくしかありません。 ちなみに、大玉花火(左…

【ASP.NET Core】共通要素を使い回す

ASP.NET Core でWebアプリを作成していると、たまに「この要素って使い回せないんか?」と思うことが多々あります。わざわざページごとに同じ要素を書き込んでいくのも面倒です。今回はサイドバーを作成して、複数のページで使い回せるようにします。 1. Shared ディレクトリ 例によって私のプロジェクトを使用します。ディレクトリはこのようになっており、MVCテンプレートで作成した場合、View の中に Shared というディレクトリがあります。 この中に、_Layout.cshtml というファイルがありますが、これはページ全体の共通要素として定義されているものになります。なので、ナビ…

【C#】.NET 6.0.1-preview 4 で MAUI を試してみた

【2021年11月11日追記】 Preview 10 が出たので、新しい記事のほうが参考になると思います。 blog.takunology.jp Microsoft Build のイベントにて .NET 6 preview 4 と MAUI について紹介されており、気になっていました。特にMAUIを試してみたいなぁと思ったので、導入してサンプルアプリを動かしてみたいと思います。 実行環境 セットアップの途中でアップデートされます。 Windows 10 Visual Studio 16.10 → 16.11 .NET 5.0.300 → 6.0.1-pre4 目標 .NET 6.0.0-pre…

Microsoft Build 2021 参加レポート

はじめに 2021年5月26日、27日に開催された Microsoft Build は Microsoft 主催のグローバルカンファレンスです。最新の技術や製品の紹介やデモンストレーション、対談など通して、スキルアップや情報共有を行うことができます。 mybuild.microsoft.com 予めアカウント登録しておくとスケジュールを確認、予約できたり、バックパックという機能を使用して気になったセッションを保存しておくことができます。 視聴したセッション 私がこの2日間で視聴したセッションをまとめます。(バックパックに入っていたものです。) 【5月26日】 Build Opening Bui…