開閉ボタン
ユーザーメニュー
ユーザーメニューコンテンツ
ログイン

株式会社東陽テクニカ提供コンテンツ

  • スペシャル
  • 2015/12/21

CPUのマルチスレッド対応は、セキュアコーディングにおける大きな障壁になっている

CPUの著しい性能向上により、ソフトウェアも大きな恩恵を受けてきた。しかし、現在は従来のアプローチではCPU性能を高められず、マルチコアアーキテクチャーやハイパースレッディング・テクノロジーに移行し、この問題を解決しようとしている。ところが、こうした変化に対して「予測不可能で脆弱性にかかわる問題を増やしてしまう恐れがある」と警鐘を鳴らすのが、1985年以来、ソフトウェア静的解析のパイオニアとして、コーディング標準の検査と欠陥検出の技術を提供してきたProgramming Research社のEvgueni Kolossov氏だ。

photo
Programming Research
R&D Director
Evgueni Kolossov氏

マルチスレッドは、予測不可能で脆弱性のポイントを増加させる

 東陽テクニカ主催の「QAC User's Meeting 2015」において、マルチスレッドのセキュアコーディングについて解説したのは、Evgueni Kolossov氏だ。同氏は、世界各国で60以上の著作を発表し、現在はProgramming Research社のR&D Directorとして活躍している。

 近年、CPUの著しい性能向上により、ソフトウェアも大きな恩恵を受けてきた。しかし現在では、ハードウェアメーカーは従来のアプローチではCPU性能を高められず、大きな壁に突き当たっている。そこでメーカー側は、マルチコアアーキテクチャーやハイパースレッディング・テクノロジーに移行し、この問題を解決しようとしている。

 しかしKolossov氏は「だれもがソフトウェアをもっと速く、安全に動作させたいと考えています。ところがマルチスレッドを使用すると、予測不可能で脆弱性にかかわる問題を増やしてしまう恐れがあります。セキュアコーディングにおいて、マルチスレッドは大きな障壁となっているのです」と警鐘を鳴らす。

 というのも、マルチスレッドには少し規定があるだけで、標準と呼べるものも公式ガイダンスもないからだ。これはマルチスレッドを使う際に強力なツールとなる新しい言語規格のC++14やC++17に関しても同様の状況という。Kolossov氏は「いまや開発者は危険な玩具を使う子供と同じ状態にあります」とし、マルチスレッドが予測不可能で、脆弱性のポイントを増加させることを具体的なコードで説明した。

「マルチスレッドは、シェーアド・メモリ(共有メモリ)モデルを使っているため、異なるスレッドから取得するアイテムの順序が保証されません。一度コードを実行して動作を確認しても、スレッドの実行タイミングと時間に依存するため、次も同じ結果になるとは限らないのです。これがマルチスレッドの問題を複雑化させています」(Kolossov氏)

 このほかにも同氏は、予測不能な問題として、並列化コードでよく問題にされる競合状態(レースコンディション)についても触れた。あるスレッドが新規ノードを追加し、親ノードへのリンクを作成し終えないうちに、さらに別のスレッドが新規ノードを挿入すると、1番目のスレッドが作成したコードを2番目のスレッドが上書きするなど、多くの問題を引き起こす問題だ。

またマルチスレッドでは、複数のスレッドが同じデータにアクセスする際に、デッドロックが起きてしまうこともある。競合する処理が互いに終了待ちの状態にあるが、互いが終了するのを許可しない状態になっていると、いつまでたっても先に進めないことになる。これは車の渋滞をイメージするとわかりやすいだろう。

マルチスレッドへの攻撃の実例と、攻撃防御のための対策

 このようにKolossov氏は、マルチスレッドの問題点を挙げたうえで、「通常のシーケンシャルなプログラムと同様に、並列化でもプログラムのミスが起きると脆弱性がつくられて、攻撃される危険も高まります。そこから攻撃者は情報を盗んだり、権限をエスカレーションさせたり、危険なコードを埋め込んでいくのです」と注意を促した。

 そして攻撃の実例として、Linuxカーネルにおいてポインタデータを破損させる並列化のミスや、ユーザー識別情報を破損させて権限のエスカレーション攻撃を許すミスについて紹介した。これらは、ローカルユーザーがルートへのアクセス権を取得してしまうことになりかねない重大な問題をはらんでいる。

 脆弱性のあるウィンドウ(並列化のミスが発生する恐れのあるウィンドウ)の継続時間も重要だ。

「攻撃できる時間が短ければ、攻撃の可能性も低くなります。メモリーエラーのウィンドウの場合は数nsほどですが、ファイルシステムの競合による脆弱性では数msとなり、多くの攻撃者がTOCTOU攻撃(注1)に利用します。さらに物理的エラーでは数秒間の継続時間となり、簡単にエクスプロイトが行えます」(Kolossov氏)

注1 TOCTOU(Time-Of-Check-to-Time-of-Use)攻撃:たとえば、あるファイルをチェックし、それを開いて読み込む際に、悪意のある攻撃者が元のファイルを削除し、別のファイルにすり替えておけば、悪意あるファイルをそのまま読み込むことになってしまう。

 一方、異なる攻撃ポイントとしては、APIメソッドでのエラーも考えられる。もともとAPIは、サードパーティのために用意されており、攻撃者はAPIを使って悪意のあるコードも仕込めるからだ。これはバグの多いAPIからエクスプロイトする方法だが、攻撃者側も相当の準備が求められることになる。

【次ページ】効率的に静的解析を行うノウハウとは

組み込み・産業機械 ジャンルのトピックス

組み込み・産業機械 ジャンルのIT導入支援情報

PR

ビジネス+IT 会員登録で、会員限定コンテンツやメルマガを購読可能、スペシャルセミナーにもご招待!