ken
はい、急にね。
Keisuke
なるほど。
Takumasa Sakao
ありがとうございます。
ken
Windows障害これ見ました?
ちょっとニュースで見たぐらいですか?お二人は。
Keisuke
見ました。
話題になりましたね。
突然Twitterとかで見たらなんかすごい話題になってるってなって、
Takumasa Sakao
ちょっとオフィスがザワザワしました。
僕もTwitterで見てたぐらいですね。
Windowsマシンないから、使ってないから、
実害はこむってないんですけど。
ken
日常生活も支障なかったですか?普通に日本で。
なかったと思いますね。
Keisuke
なかったですね。
ken
世の中的には航空会社が止まったりとか見てるみたいでしたけど。
なんかちょうど夏休みの時期とかだったんで、
友人ファミリーとかが空港で足止め食らったみたいなのは結構あったんですけど、
僕は個人的にもなかったんですね。
簡単にじゃあちょっとクラウドストライクで何が起こったかっていうのを、
簡単にさまろうかなと思うんですけど、
これはクラウドストライク.comのほうで、
ポストインシデントレビューが出たんですね。
ちょっと簡単にさまると、
どうやらクラウドストライクの出している根本原因は、
マルフォームのコンフィギュレーションファイルを配布しちゃったと。
配布しちゃったミスコンフィギュレーションみたいな感じなのかな。
それによって結構アウトオブバウンドメモリーがクライアント側で起こってしまって、
それが結果としてブルースクリーンに繋がってしまったみたいなのを書いていたんですね。
なんかシンプルにソフトウェアバグを埋め込んだけれども、
ちゃんとテストフローとかステージドロールアウトとかは、
あったといえばあったっぽいんですけど、
ちょうどバリデーションをする側のデプロイメントパイプラインの一部のサブシステムにもバグがあったりとか、
割とコンプレックスシステムフェルズにコンプレックスウェイという、
複雑なシステムが複雑に壊れるみたいな現場でも言ったりするんですけど、
いろんな複合要因が相まってこの原因にブルースクリーンになってしまったんだ、
みたいなことはクラウドストライクのブログで書いてあったと理解してるんですけど。
お二人はここら辺キャッチアップとかしてました?
こんな感じのかなと思って。
Keisuke
このPodcastを撮るってなってちゃんと見てて、
設定ファイルのアップデートによって引き起こされてみたいなのは聞きまして、
そうですね、デプロイも徐々にやっていくんではなくて一気に配布されちゃったとか、
そういう配布の方法にも問題があるよみたいなことを言ってる人がいたりとか、
あとはそもそもサードパーティーのアプリがカーネルランドで動いてるのがおかしいんだとか、
いろんな意見を見ましたね。
ken
なるほどね。
これ難しいですよね、間違った設定ファイルを配ってバグ出す問題。
普通にあるあるだなと思って。
そういう経験ありますか?
Takumasa Sakao
普通にバグらせたことはあるけど、設定ファイルっていうのは色々ありますよね。
例えばフィーチャーフラグとか、フィーチャーフラグでローリングアップデートするとかそういう話とかもありそうだけど、
設定に関してはどうだろうな。
あったような気がするけど、多分嫌な記憶だから忘れちゃってますね。
ken
今回のクラウドストライクで問題となったファイルの、これバージョン番号なのかな。
チャンネルファイル291、チャンネルファイル291番みたいなのが言われていて、
これがクラウドストライクの製品の一つであるファルコンセンサーと呼ばれるものの設定ファイルだと認識していて、
これが今回、このチャンネルファイル291にミスがあったと理解してますね。
これ多分けいすけさん書いてくれたんだと思うんですけど、
このチャンネルファイル291自体の目的としては、
Windowsにおけるプロセス間コミュニケーションに使われるネームドパイプっていうのの実行評価の機能向上を目指して、
一応機能改善みたいな感じでリリースされた設定ファイルなのかなと理解してるんですけど、けいすけさんあってそうですか?
Keisuke
僕はいろいろ記事を読んで、そのように書いてあった記事を見つけて、
ネームドパイプの悪意を検知する、そういった能力の向上を目指してたっていう風に書いてましたね。
最終的にはアクセスしちゃいけないメモリー領域にアクセスしちゃって、ブルースクリーンになったということですよね。
Takumasa Sakao
ちなみに設定ファイルによってこれって機能が変わるような挙動になるんですねっていうのが思ったところなんですけど、
Keisuke
ある種フィーチャーフラグみたいなのを想定していいんですかね、こうやって。
僕はそういう風に勝手に想像してました。
設定ファイルのお書きによってアプリの機能の振る舞いが、アプリの振る舞いが変わってみたいなことかなと、想像になりますけど。
Takumasa Sakao
ありがとうございます、なるほど。
ken
クラウドストライクの中の人とかじゃないんで、実際どれぐらいこんなもんだったのかっていうのを、
実際どういうデプロイメントパイプラインなのかってちょっと分からないんですけど、
今日の収録で深掘りたいのはどっちかというとそのメイントピックが、
EBPFなる技術でこういった似たような問題がLinuxで起きたときに、
もしくはWindowsのEBPFを使ったときに防げたのか本当にっていうところを議論していきたいなと思ってるんですよね。
いきなりそれがイエス・ノーかっていうのを聞く前に、
そもそもなぜEBPFが言及されているのかみたいなところを、
けすけ様は事前に調べてくれたと思うんで、
ちょっとこの文脈でなぜEBPFが言及されているのか、
なぜEBPFが使われていたら今回の事件は起こらなかったんじゃないかというふうに言われているのか、
簡単にさまってもらうことって可能ですか。
Keisuke
EBPFは、そもそもその機能自体はLinuxとかのKernel内のデータとかにアクセスして、
監視の向上であったり、セキュリティ的に何かを監視したりとか、
あとネットワークのルーティングとか、
そういったものに使われる、Kernelスペースで動くプログラムだと僕は思っていて、
Kernelスペースで動くってことは、
何か今回のようなクラウドストライクのようなバグがあったら、
クラッシュさせてしまう可能性があるんですけれども、
EBPFが優れているというか、
なんでこの文脈で言及されているかというところの一つに、
EBPFにはVerifierと呼ばれる機能があって、
実行されるプログラムが事前にそのVerifierによって検証されるっていうプロセスを踏んで、
そのVerifierによって安全だというふうに、
いずみつきもらったプログラムしか動かせないようになっている。
何をもって安全としているかっていう部分なんですけれども、
僕はちょっと調べた限り、
まずVerifierはEBPFのプログラムが実行したときに通る可能性のある全経路っていうのを分析して、
Zコードがないかとかループがない、
ちょっとバージョンによって異なるんですけど、
EBPFのプログラムって結構厳格にいろんな制限がありまして、
その一つにもともとはループができない、
フォーグンが書けないみたいなことがありました。
新しい目のKernelの5.3以降では制限付きのループが許可されたりとかして、
ちょっと緩和はされているんですけれども、
ループがないこととか、
実行されないコードがないことっていうのを確認したりとか、
プログラムの実行をシミュレートして、
そのレジスタ、EBPFのレジスタの状態とかを追跡して、
メモリ、境界外のメモリアクセスの防止とかをしたりだったり、
あとEBPFのプログラムでは、
Kernelによって明示的に許可されたメモリ領域にのみアクセスできるようになっていて、
任意のKernelメモリまたはユーザーメモリのアクセスが固く禁止されていると。
もう本当許可されたメモリにしかアクセスできないので、
今回クラウドストライクのKernelドライバーって
アクセスしてない、知ってはいけないところにアクセスしてブルースクリーンになったと思うので、
そういったことがそもそもできちゃうようなプログラムだったら実行できないっていうような、
そういったベリファイアっていうものがあるので、
安全になるのではないかというふうに言及されていると、
僕は理解しております。
ken
なるほどね。だからこのクラウドストライクのポストインシデントレビューを見る限り、
マルフォームの設定ファイルが結局はアウトオブバウンドメモリアクセスにつながってしまったということなんですけど、
そこがEBPFのバリファイアによって、
ken
その設定ファイルが実行された結果、
例えば配列のアクセスしてはいけないところにアクセスしようとしているよということで、
バリファイアからエラーが測れて、
その実行自体が止められるっていうことなのかなと。
そうです。
これユーザーアプリケーションから見るとバリファイアがこけるとどういうふうになるかってわかりますか?
ユーザーアプリケーション側でハンドルできるEBPF的なエキセプションとかが投げられる感じになるんですか?
Keisuke
僕の趣味でEBPFの使ったプログラムを書いた経験から言うと、
そのベリファイアがベリファイできない、
なんて訴訟できないプログラムっていうのはそもそも実行できなくて、
なので実行できませんよみたいなエラーが返ってきましたね。
でもプログラムがそもそも動かないというか。
Takumasa Sakao
うんうん。
ロード時点でベリファイしてくれるみたいなイメージであってますか?
Keisuke
そうですね。
ken
なるほどね。
これちょっとわかんないんですけど、
Windowsも多分基本ユーザーランドとかネルランドみたいに分かれているとは思うんだけど、
そのEBPFの普及状況っていうのはどうなんですか?
基本的にLinux、Kernelで本体として開発されているものじゃないですか。
Windows側でもそれをポートしようとか、
同じものを再実装しようみたいな動きがあるんですかね。
Keisuke
僕も今回のポッドキャストがあるのでちょっと調べたら、
MicrosoftのGitHubのオーガニゼーションにEBPF for Windowsっていうレポジトリがあって、
どうやらそこで開発してそうですと。
ken
ほんとだ。
Keisuke
一応そのReadMeに書かれているので、
一応Linux向けに書かれたソフトコードがWindowsでも使えるように、
互換性を提供するような意思があることは書かれていて、
ただLinuxとWindowsでこういう機能があるので、
100%の互換性っていうのはまた提供はしてくれないと思うんですけれど、
できる限りLinux向けに書いたソースコードも、
そのままWindows向けのEBPFでも使えるような世界を実現しようとしてくれているのかなとは、
ちょっと推測しています。
ken
なるほど。
これMicrosoft側めっちゃ大変じゃないですか。
だって基本的にはEBPFってLinux側が欲しくて、
自分たちのために作って、それが広く使われてユーザーも欲しくなったので、
Microsoft側が後追いでLinuxのAPIに合わせて作っているってことですよね。
だから多分パワーバランス的にはLinux側にあるんじゃないかなというか。
Keisuke
そうですよね。
あとMicrosoftって今回の事件で知ったんですけど、
Windows DefenderっていうMicrosoftが提供しているような、
クラウドストライクの代替製品になるようなものがあるみたいなんですけど、
それはEUと揉めて、
Microsoftのサードパーティーにそういう関連ドライブをかけるようにしなさいみたいになって、
結果的にクラウドストライクが広まっているみたいなことがあるという風に見ました。
Microsoft的には本当はWindows Defender使ってくれよって思っているのかもしれないです。
ken
まあそうですよね。
これあれですよね、多分EUってよくモノポリというか、
独占、企業が独占しようとした時に例えば買収を阻止したりとか、
医薬金払わせたりとかよくテックニュースにおにぎわせたりしますけど、
多分その一環ですよね。
MicrosoftがOSの中で全部閉じてWindows Defenderみたいな使わざるを得ない状況を作るんじゃなくて、
Windowsのセキュリティの対抗馬をサードパーティーでもユーザーが使えるようにしろよと、
独占するなよっていう風にEUから言われたっていうことですよね、多分ね。
Keisuke
そうですよね。
似たような話をAppleのApp Storeとかでも聞いたりとかしますけど、
そうですよね、はい。
ken
なるほど。
Takumasa Sakao
なかなかEBPF for Windowsのプロジェクト大変そうという匂いしかしないですけど。
大変そうですよね、これ。
っていうか初めてEBPF対応してるんだっていうの、これで初めて知りましたね、
ken
Windows向けに対応するんだっていうのは。
なんかダイアグラム見る感じ本当に似せてこようとしてるのかな、
バリファイヤーみたいなのもいて、
Keisuke
カーネルランドユーザーモードの受け渡しはメッセージパッシングみたいな感じにして。
ken
なるほどね。
だから理論上防げるってことですね。
なんか聞く感じ、僕の印象ですけどバリファイヤーやること多いなと思ったんですけど、
デメリットみたいなのあるんですかね。
ken
なんていうんですか、多分。
Keisuke
ルートオフになってる部分だとは思うんですけど、
やっぱりさっきちょっと話した、
制限付きのルートが許可されてるとか、
そもそもなんか、
eBPFのプログラムで書ける、
eBPFのプログラムをコンパイルすると、
eBPFのインストラクションセットにコンパイルされるんですけど、
確かそのインストラクションセットの上限っていうのを決まっていて、
1万とかだったかな。
もともと4096とかだったと思うんですけど、
それが1万ぐらいまでに増えたりとかするんですけど、
だいたい命令数に制限があるんで、
大きなプログラムって書けないと思うんですね。
あとループが、制限付きループが許可されたりしてるものの、
制限はついてるので、
セキュリティーとか安全性を担保するのと、
ken
自由度って結構トレードオフの関係あると思う。
そうですね。
徐々に緩和する方向に向かってそうな気がしますけど。
でもね、無限に緩和できるものでもないだろうし、時間はかかるだろうし、
かといって今のすべてのコードをすぐeBPFプログラムにポートできるかというと、
それも無理だろうし、現実的に無理だろうし。
Takumasa Sakao
実行時にもやっぱりオーバーヘッドはあるわけです。
フックされて、例えば1万行のインストラクションが走っても困るし、
みたいなケースも全然ありそうですよね。
ken
ですよね。
Keisuke
ブレンダン・グレックっていうeBPF界でかなり貢献をしているエンジニアが、
どうもはブルーフライですっていうブログをクラウドストライクの事件があった後に出していて、
そこでもeBPFは確かにリソースを必要以上に使うっていうところを言及しているので、
そこは確かにeBPFを使うデメリットになり得るかなとは思いますね。
ken
そっか。
普通にeBPFに必要なインストラクションセットとかメッセージパッシングに必要なマップとかメモリは食うし、
バリファイヤーとかやり取りするのに追加でCPUサイクルも食うし。
それ実際やってみるとどれくらいのアディショナルのコストがあるのかっていうのは、
多分eBPFプログラム主体ですけど、
よくある銀の弾丸じゃないよっていう話ですね。
そっか、ブレンダー・グレッグ。
彼は今インテルでしたっけ?
Keisuke
そうだと思います。
ken
ネットフリックスの後、インテルのだいぶ上の方でプリンシパル化なんかで入ったんですよね。
もっと何だっけな。
Keisuke
なるほど。
調べてて一個面白いなと思った、今eBPFの弱点というか、
弱点?
弱点、僕が見つけたブログでは、
eBPFのベリファイヤーっていうのはもうカーネルのソースコードに完全に三つ結合っていうか、
一緒になって動かされるので、
テストとかがすごく難しいみたいなことを指摘しているブログがあって、
そのベリファイヤーだけを切り出して、
そこに対してプログラムがセーフかアンセーフかチェックしてくれるような、
ベリファイだけ切り出したものとかがあったら便利なんじゃないかみたいな、
今の状態だとLinuxカーネル丸ごと用意して、
例えばVMとかどっかでバージョンごとにインスタンスを立ち上げて、
そこでプログラムを実行してテストとかしなければならないと思うんですけれど、
それって結構パワーっていうか資金力のある会社とか、
個人では結構難しいと思うんですよね。
いろんなマシン使わないといけないし、
なんでベリファイヤーだけ切り出すみたいな個人プロジェクトなのかな、
推している人のブログを見つけて面白いなと思って読んでました。
ken
なるほど。だからバリファイヤーのエミュレート、
もうちょっとインタグレーションテストみたいな感じで、
LinuxのVMを準備してテストするよりはライトに走らせたいと。
だからユニットテストのほうがもうちょっとライトなテストを書いたときに、
バリファイヤーの挙動をエミュレートしてくれるMockか、
エミュレートしてくれるようなもっとライトなプロセスが欲しいってことですかね。
Keisuke
そうだと思います。
ken
なるほどね。難しくないですか、それ。
バリファイヤーのやることが多いのであれば、
それをバリファイヤーの進化に沿って書いていかなきゃいけないし。
Keisuke
そうですよね。多分メインのEBPFの開発者たち、
コアな開発者たちがその辺本気で考えないと、
ちょっと外の人が追従していくのには無理があるかなと思います。
実際そのブログでは書かれてなかった。
Takumasa Sakao
TOC、プルフォーブコンセプトで終わってたんで、
Keisuke
多分継続してるっていうようなふうには思ってないですかね。
GitHubのデポジトリも見たんですけど、アーカイブになってましたし。
Takumasa Sakao
アプローチとしてはどんな感じなんですか。
ken
なんか出てきそうですよね、こういうのいろいろね。
Takumasa Sakao
なんかそうですね、
EBPFって印象として結構作るの大変じゃないですか、
すごいローレベルのところからハイレベルの情報を
取ってこないといけないから、
そうですね、
頑張ってんなっていう気持ちになりました。
ken
WiZなんか結構面白くて、
イスラエル発のスタートアップって言ったんですけど、
この立ち上げの人が3、4人かな、いるんですけど、
彼らはどこで知り合ったかというと、
イスラエルの国防軍で知り合ったらしいんですよ。
イスラエルの軍の情報部隊で知り合った人たちが、
なんかそれを辞めて、
なんかそのサイバーセキュリティスタートアップを作ったっていう、
なんかストーリーが面白そうな会社で、
結構ね、使ってる会社も多いんですよね。
そのスラックとか、あとはいわゆるそのフォーブス500だっけ、
大きい会社が使ってますよ、みたいなのは献殿しているし。
Takumasa Sakao
なんかイスラエルって結構やっぱセキュリティが厚いんですねっていうのを、
あんまり知らなかったんですけど、
確かそのアクアセキュリティとかもそうですもんね、
イスラエルだったと思う。
ken
そうなのか、確かに。
アクアセキュリティは、
また別のEBPFとかでもよくマーケティングしてたりする会社ですよね。
リズトラスの前の会社ですよね、確か。
リズっていうのは、
EBPF関連のカンファレンスによく出てくる、
エヴァンジリスト的な人がいるんですけど。
Keisuke
そうですね。
入門EBPFって最近じゃないか、
日本語訳出たあれの英語原作書いた人ですよね。
ken
うんうん。
なるほどね。
やっぱセキュリティが厚いんですね、イスラエル。
どうですか、他に名前だけでも気になっているセキュリティベンダー結構あったりしますか?
Keisuke
セキュリティベンダー。
さっき出たアクアセキュリティで言うと、
EBPFのことを勉強するときに、
アクアセキュリティが出してトレーシーっていうOSSがあるんですけど、
ken
どんなやつですか?
Keisuke
試しに使って遊んでみたことがあって、
それはEBPFで、
プロセスがコールしてるシステムコールとか、
そういうのを全部拾ってくれるっていうか、
プロセスはどんなシステムコールを呼び出してるっていうのを出してくれたりするものがあって、
似たようなもともとあるコマンドラインのツールで、
ストレースってあると思うんですけど、
あれと似たような使い勝手でしたね。
ただコンテナにも対応していて、
コンテナで動かして、コンテナアプリケーションが実行しているシステムコールとか、
みたいな指定ができたり、
ストレースにもっといろんな機能があるけど、
使ってみた感じに似てるなっていう印象でした。
ken
なるほど。
これシスコールのリストが取れて、
そこからセキュリティ検知ってどうやってつなげるんですかね。
これは多分スタンダードローのシスコール一覧が取れるみたいなツールだと思うんですけど、
膨大な量になりそう。
Keisuke
実際にどうやって活かしてるのかまではちょっと分かってない。
ken
他のデータとくっつけない。
すごいって、面白いってなっただけなんで。
Takumasa Sakao
そうですね。
アクアセキュリティで言うと、
トリビーとかコンテナの脆弱性のツールとか有名ですよね。
よく使われてる印象がある。
それはカタクト名ですか。
そうですね。トリビーっていうのがあって、
コンテナの脆弱性を診断してくれるやつなんですけど。
ken
使い勝手としてはどういうふうに使うんですか。
コンテナにプロセスを入れて自動で検知してくれる感じ?
Takumasa Sakao
そうですね。
イメージファイルを指定して実行されたみたいな印象でしたね。
ken
なるほどなるほど。
Keisuke
イメージに古い依存、
コンテナ内に入ってる古いコマンドラインとか、
脆弱性が報告されてるようなものとか、
Takumasa Sakao
そういうのを検知できるイメージでした。
作者が日本人なんですよね。
そうなんですか。
知り合いの知り合いなんですよね。
知り合いの知り合いで。
アクアセキュリティで働かれてる方ってことですか。
買収されたんですよね。
日本人がOSSで作ってアクアセキュリティに買収されたっていうすごいサクセスストーリーなんですよ。
ken
すごい。めっちゃサクセスストーリー。知らなかったです。
Keisuke
この人のブログ読んで僕も感動した覚えがありました。
すげーと思って。
ken
熱いっすねそれ。
Takumasa Sakao
熱い。
ken
それはEBPF関係ないですか。
Takumasa Sakao
これはEBPFは関係ない印象でしたね。
ken
あくまで性的に脆弱性を判断するんだろうと思ってたんで。
すごいな。なるほどね。
だからEBPFを使っていろいろツールを作れるが、
それをレバレッジしてどうセキュリティ監視につなげていくかっていうのはまた別の話なので。
なかなか難しいですね。
Keisuke
あと全然EBPFとは関係ないんですけれど、
コンテナのランタイムでGVisorっていうのがGoogleが作ってるやつなんですけど、
これとかは結構任意のプログラムを実行することになると思うんですよ。
コンテナでアプリケーションを走らせると。
もちろんコンテナのアプリケーションに悪意のあるものがあったら何でもできちゃって、
例えばホストの源源とか掌握されちゃう可能性とかすらあるわけで、
できるだけサンドボックス化したいと思うんですね。
コンテナで実行されるアプリケーションにはあまり余計なことしてほしくないから、
ホストと隔離したいと思うんですけど。
それのアプローチの一つでGVisorはアプリケーション、
そのコンテナで動いてるアプリケーションのシステムコールをインターセプトして、
GVisorが代わりにホストカーネルと通信したりするみたいなコンテナランタイムがあるというふうに最近調べて知りまして、
面白いなと思いました。
ken
それはユーザーランドで動くいわゆるプロ機種みたいなアプリケーションってことですかね。
Keisuke
プロ機種っていうか、アプリケーションからするとシステムコールを実行してるようにしか見えないんですが、
実はGVisorが全部インターセプトしてるみたいな。
ken
GVisor側ではアプリケーションがどういうシスコールを発行してるのか全部わかるので、
そこでサンドボックス環境を作るだから、例えば危険な操作をしようと思ったりしたものは落とすってことなのかな。
Keisuke
そうだと思います。
ken
あと、実行してほしくないシスコールは拒否したりとかできるんじゃないんでしょうか。
なるほど。
Takumasa Sakao
GAEとかはこれ使ってたりとかしてた記憶がありますね。
Google App Engineですね。
ken
GKEとかも最近使えるのかな。
そっか。
ユーザーに広くアプリケーションランタイムを提供するような会社からすると、
ユーザーに悪意のあるコードとか、ブレナビリティのあるコードを実行してほしくないので、
GVisorをベースで提供することでメリットがあるということですね。
なるほど。
面白いですね。
多分シスコールを直接実行させる前に、
EBPFバリファイヤーなりGVisorなりが絡んで、
そこで色々検知するっていう仕組みとしては多分同じなんだけど、
GVisorの方がEBPF本体に実装されているバリファイヤーがバリファイできるもの以外にも、
例えばアプリケーションレイヤーでもっと任意の、
自分たちがやりたいようなバリファイの仕組みを実行できたりとかいうメリットがあるのかなと聞いてて思いました。
例えばEBPFバリファイヤーの機能を増やそうと思ったら、
多分LinuxをフォークするかAppStreamに貢献するしかないと思うんですけど、
GVisorは多分自分たちで作れるサンドボックス環境なので、
そういうメリットがあるのかな、多分。