- スペシャル
- 2015/12/21 掲載
CPUのマルチスレッド対応は、セキュアコーディングにおける大きな障壁になっている
- ありがとうございます!
- いいね!した記事一覧をみる
マルチスレッドは、予測不可能で脆弱性のポイントを増加させる
東陽テクニカ主催の「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氏)
一方、異なる攻撃ポイントとしては、APIメソッドでのエラーも考えられる。もともとAPIは、サードパーティのために用意されており、攻撃者はAPIを使って悪意のあるコードも仕込めるからだ。これはバグの多いAPIからエクスプロイトする方法だが、攻撃者側も相当の準備が求められることになる。
【次ページ】効率的に静的解析を行うノウハウとは
関連コンテンツ
PR
PR
PR