見出し画像

サイバーセキュリティ?冗談でしょ?

サイバーセキュリティに関する考察

ニューヨークへの休暇のフライト中、そして最近のCrowdstrikeの混乱を考えると、サイバーセキュリティについて考える時間ができました。
数年前、オースティンでのセキュリティカンファレンスLasconに参加した際、同僚が「『私たちは皆、運命づけられている』と思うようになるだろう」と言ったのを覚えています。
彼が言わんとしていたのは、100%安全なものは存在しないということです。

Crowdstrikeの状況について簡単に説明すると、Crowdstrikeはシステム上で動作するすべてのものを監視する交通警官のようなソフトウェアを作っています。
そのためには、コンピュータの最も深い部分(カーネル)に潜り込む必要があります。
彼らはソフトウェアの更新に失敗し、その結果、更新されたシステムが起動しなくなってしまいました。

Crowdstrikeは、IT部門がマルウェアや危険と思われるソフトウェアの実行を防ぐためにインストールするタイプのソフトウェアです。
また、従業員が危険なサイトにアクセスしたり、企業の機密情報を第三者に送信したりするのを防ぐためにもインストールされます。
よく言われるように、安全すぎることはない...のでしょうか?

私はサイバーセキュリティをスライディングスケールとして捉えています。
一方の端には、何でも実行できるWindows 95マシンのようなオープンなシステムがあり、もう一方の端にはレンガのようなシステムがあります。
レンガは機密情報を漏らしたり、ハッカーが他のシステムに悪事を働くのを助けたりすることはありませんが、他の何もできません。
残念ながら、Crowdstrikeはスペクトルの反対側に寄りすぎてしまい、今や多くの人々の机の上や下に置かれているのは文鎮同然のものとなってしまいました。

今日のサイバーセキュリティの問題は、いくつかのカテゴリーに分類されます:

  1. 安全すぎて不安全になる

  2. 集中化

  3. ソフトウェアサプライチェーンに関する理想主義的な考え方

  4. セキュリティシアター

  5. 古くなったオペレーティングシステムアーキテクチャの根本的な欠陥

これらの各カテゴリーについて、詳しく説明していきます。

1. 安全すぎて不安全になる

時として、IT部門がセキュリティのノブを高く設定しすぎて、結果的にシステムがより不安全になることがあります。
これを最もよく説明できるのはパスワードの例です。
IT部門は、パスワードが推測されるのを防ぐために、パスワードの要件を厳しくします。
しかし、その複雑さを高くしすぎると、従業員がそれを付箋に書いてしまうリスクが出てきます。
デスクに貼られたパスワードを誰かが読めるようになったら、そのパスワードはどれほど安全でしょうか?
幸いなことに、私たちはパスワードを完全に排除する方向に向かっています。

IT部門のセキュリティノブを高く設定しすぎて、お気に入りの業務用アプリの使用をブロックしてしまうと、従業員が回避策を見つけるリスクが出てきます。
例えば、ウイルスに感染した個人のコンピュータに作業を移してしまうかもしれません。
Crowdstrikeの障害の影響を受けた友人と話をしていたところ、彼は業務用のコンピュータが動作しない可能性が高いため、個人のマシンで作業するのが最善だと判断したそうです。

生体認証とパスキーがひとつの解決策になりそうです。これらは安全で便利な両方の特性を持つソリューションです。

2. 集中化

IT業界にはさまざまな種類の集中化があり、それらはすべて悪影響を及ぼします。
Crowdstrikeは最も分かりやすい例です。
多くの企業が1つの会社のセキュリティニーズに依存しすぎると、問題が発生した際に世界中が影響を受けます。他の例もあります。
CDKは多くのディーラーシップ向けのソフトウェアベンダーですが、ランサムウェア攻撃を受けました。
その結果、全国的なディーラーシップの業務停止が起きました。

もし私がハッカーだったら、ハッキングしたいターゲットのコストベネフィット分析をするでしょう。
集中化によって、一部のターゲットがあまりにも魅力的になり、どんなコストをかけてもハッキングする価値があるものになってしまいます。
LastPassはパスワードマネージャーで、前述の超安全なパスワードの作成と使用を簡単にします。
問題は、これによってすべてのパスワードの磁石になってしまうことです。
そして、誰もがすべてのパスワードをこの1つのサービスに保存していると、非常に魅力的なターゲットになります。
誰かがハッキングする努力をするのは時間の問題でした。
そして実際に侵害されました。
とはいえ、彼らは侵害された場合でもパスワードへのアクセスを困難にする努力はしています。

私の見解では、ある程度の分散化が有益です。
確かにこれはより高コストで、より多くのエネルギーを必要とし、さらに不便かもしれません。
しかし、少なくとも問題が発生した場合、その影響はより限定的になります。

3. ソフトウェアサプライチェーンに関する理想主義的な考え方

多くのエコシステムは、それに貢献する開発者への根本的な信頼の上に構築されていると感じます。
一般の人々にとって、ほぼすべてのアプリケーション、すべてのウェブサービスは、多くの開発者によって構築され、インポートされたコンポーネントの集合体です。
これは車と似ています。
ホンダは車両の隅々まで自社製造しているわけではありません。
例えば、エアバッグをタカタのような会社から輸入しなければなりません。
そして、それらのエアバッグと同様に、ソフトウェアのコンポーネントが間違って作られていると、Crowdstrikeが現在Windowsをダウンさせているのと同じように、アプリケーション全体を停止させる可能性があります。

時にはこれらのコンポーネントが意図せずに問題を引き起こし、また時には非常に意図的です。
最近の例では、悪意のある行為者がXZという名前のあまり知られていないコンポーネントにバックドアをインストールし、発見されなければ世界中のサーバーの大部分、もしくは大多数へのアクセスを可能にしていたというものがあります。

そして、これはセキュリティ専門家を震え上がらせる部分です。
このような事態が起こる可能性は非常に多くあります。
すべての言語にコンポーネントを追加するプロセスがあり、それは単純なものから複雑なものまでさまざまです。
C#アプリケーションにはMicrosoftのサーバーでホストされているNuGetパッケージがあり、JavaScriptアプリケーションにはNode Package Managerがあります。
私には疑問があります:

  1. これらのコードリポジトリにあるソフトウェアにバックドアがないことを誰が確認しているのでしょうか?

  2. もしソースが少なくとも利用可能で、バイナリをインポートしている場合、それらのバイナリがソースと一致していて、コンパイル後のマルウェア(XZと同様)が含まれていないことをどのように確認できるのでしょうか?

私が懸念しているのはインポートされたコードだけではありません。
VS Codeや他の多くのアプリケーションはプラグインをサポートしており、それらのプラグインにはネイティブバイナリが含まれていることに気づきました。
誰がそれらのプラグインにマルウェアが含まれていないことを確認しているのでしょうか。
かつてInternet Explorerで事実上プラグインをインストールできた時代がありました。
それは手に負えなくなり、多くのプラグインがコンピュータを乗っ取って問題を引き起こしたため、私たちはより良くサンドボックス化されたウェブベースのプラグインに移行しました。
今では、開発者がこれらのプラグインがウェブ上で行うことをすべて読み取る必要があることに気づき、それらからも離れつつあります。
パスワードを盗んだり、暗号通貨のために処理能力を盗んだりする可能性があるからです。

NPMパッケージ、NuGetパッケージ、VS Code拡張機能、Chrome拡張機能、Dockerイメージなど、マルウェアの温床となる可能性のあるソフトウェアリポジトリのリストは長いです。
そして、これらのツールも非常に有用であるため、単純にすべてをシャットダウンするのは難しいです。

これらのコンポーネントを審査するためのより良いシステムが必要です。

4. セキュリティシアター

Checkmarxは、コードをスキャンして安全でない操作を行っていないかを確認するサービスです。
時には合理的な推奨事項もありますが、そうでない場合もあります。私はC#コードを多く扱いますが、Checkmarxがパスワードを扱う際に推奨していることの一つは、「ヒープ検査攻撃」を避けるために「SecureString」に入れることです。
これは、メモリ内のパスワードを「安全に」、つまり誰かがアプリケーションのメモリにアクセスした場合に読み取りにくくするためのオブジェクトです。

この根本的な問題は、パスワードをチェック、ハッシュ化、または送信するためには、どこかで平文の状態で存在しなければならないということです。
入力としてパスワードを受け取るコンポーネントは、おそらくあなたのソフトウェアではありません。
そして、パスワードを暗号化またはハッシュ化するコンポーネントも、おそらくあなたのソフトウェアではありません。
これらのコンポーネントがパスワードの独自のコピーを保持していないことをどのように知ることができるでしょうか。

実際、パスワードはSecureStringに入れる前に平文で存在し、C#の仕組み上、SecureStringにコピーしたからといって魔法のように消えるわけではありません。
確かに、SecureStringはメモリアクセスを持つ悪意のあるソフトウェアがその中のパスワードを読み取るのを防ぐかもしれません。
しかし、それ以外に存在するパスワードの複数のコピーについては何もしません。
これはセキュリティシアターです。
実際にセキュアにすることなく、セキュアに見せかけるだけの行為です。
メモリ内のパスワードを隠そうとして時間を無駄にするのではなく、開放したままのAPIに認証を追加することに時間を費やすべきです。

5. 古くなったオペレーティングシステムアーキテクチャの根本的な欠陥

認めましょう。
Windows、Linux、Mac OSの基本設計は、サードパーティのソフトウェアを最小限の保護で信頼し始めたばかりの時代にさかのぼります。
それ以来、アプリケーション間の壁を高めるためにサンドボックスが追加されてきました。

しかし、その不信はオペレーティングシステムの上で動作するアプリケーションにのみ及んでいます。
オペレーティングシステム内で動作するソフトウェアにまで拡張すべきです。
Crowdstrikeはその良い例で、Windowsカーネル(システムの最も深い部分)内で動作するカーネルレベルのドライバが、航空会社、銀行、病院を麻痺させました。

ゲームの動作を変更して有利になる可能性のあるソフトウェアの実行を防ぐために、マシン上にあるものを監視するように設計されたアンチチートソフトウェアは、時にカーネルで動作します。
セキュリティ研究者は、これらが攻撃の経路になる可能性があることを懸念しています。

CrowdstrikeはWindowsをダウンさせましたが、この脆弱性はWindowsだけに限定されるものではないと思います。
LinuxとMacOSも、システムの最も深い部分にドライバをロードする能力を持っており、非常に低レベルのアクセスを持っています。
Appleのオペレーティングシステムの場合、ドライバだけではありません。iOSの様々なバージョンでは、iMessageを処理するようなサービスがrootとして動作しており、これは巧妙に作成されたSMSメッセージなどでこれらのサービスが侵害された場合、デバイスへの完全なアクセスを得られることを意味します。
これは、イスラエルの組織が漏洩したPegasusソフトウェアを使用してiPhoneに侵入できた方法です。

Microsoftがパフォーマンスを大きく低下させることなく、サードパーティソフトウェアをカーネルで実行するという根本的な欠陥を修正できることは限られています。
Crowdstrike以降、Microsoftは悪いパッチをリリースしたのはCrowdstrikeであっても、ニュースサイトがマイクロソフトの名前を見出しに使用し、最終的にはマイクロソフトのブルースクリーンを人々が目にしているため、Windowsで許可される更新をより詳細に精査したいと考えるでしょう。

私が言ったように、サイバーセキュリティは冗談のようなものです。
修正すべき問題が多くあります。
しかし、まず私たちの物事が実際に安全であるという幻想を打ち破る必要があります。

参考

Cybersecurity is a joke

よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!