コンパイラの仕様とx86のアーキテクチャが原因
(1)サブルーチンに渡す引数をスタックに格納
もちろん,(4)の処理のときに,外部から送り込まれたデータの大きさを調べ,プログラムが確保したバッファの大きさよりも小さいことを確認するか,大きい場合には,はみ出した部分を切り捨てるなどの処理をしていれば,戻りアドレスが上書きされることはなく,送りつけられた不正なプログラムが動き出してしまうこともない。 だが,C言語やC++言語といった,現在主にシステム・プログラムの開発に使われているプログラミング言語には,バッファにデータを書き込む前にその大きさを確認することや,バッファの大きさを超えるデータの書き込みを禁止することは,文法上定められていない。つまり,確保したバッファに,その大きさを超えるデータを書き込んでも,文法上は間違いではないのである。そのため,うっかり危険なプログラムを書いてしまっても,コンパイル時にエラーにならないので,そのまま運用してしまうことがある。 最も危険なのは,そもそもプログラマが,C/C++言語には潜在的にプログラムが危険になってしまう恐れがあることや,上記のような攻撃方法があることなどを知らずにプログラムを書いてしまうことだ。 ちなみにBASIC,C#,Javaなど,文法上,確保したバッファ以外の領域にはデータを書き込めないよう定められているプログラミング言語もある。これらのプログラミング言語で開発すれば,原理上,バッファ・オーバーフロー攻撃は受けない(ただしこれら3つの言語ではOSのようなシステム・プログラムを開発できない)。 つまりバッファ・オーバーフローのぜい弱性は,(1)現在のC/C++コンパイラのほとんどが自動変数をスタック領域に取ること,(2)x86では関数からの戻りアドレスも同じスタック領域に格納すること,さらに(3)x86のスタックにはアドレスの上位から下位に向かってデータが積まれ,データ自体はアドレスの下位から上位に向かって書き込まれること——が重なったことに起因する。関数からの戻りアドレスを書き換え,バッファ上に送り込んだ不正プログラムにジャンプさせるのが,バッファ・オーバーフロー攻撃の典型例である。そのため,関数からの戻りアドレスが書き換えられていないことを調べるか,バッファ(データ領域)上でプログラムを実行させなければ,バッファ・オーバーフロー攻撃を受けてもセキュリティが脅かされることはない。
メモリーをデータ領域とプログラム領域に区別する 実は元々x86にも,ハードウエアによるデータ実行防止機能が実装されているのだが,Windowsはそれを使っていなかった(使えなかった)。 x86にはセグメントと呼ぶメモリー管理機構がある。セグメントとは,メモリー領域を分割して利用する仕組みで,プログラムを格納するコード・セグメント,データを格納するデータ・セグメント,スタック用のスタック・セグメントなどに分ける。このセグメント機構に,コードの実行を許可/禁止する機能があるのだ。コード・セグメントにのみプログラムの実行を許可しておけば,データ・セグメントやスタック・セグメントでプログラムを実行できない。バッファ・オーバーフロー攻撃によってスタック・セグメント上のプログラムにジャンプしてしまっても,実行されない。 だが,現在の32ビットWindowsはセグメント機構を使っていない。正確には,フラット・メモリー・モデルと呼ぶ,セグメント化しない(コード,データ,スタックが同じ1つのセグメントに置かれる)モードを使っている。16ビットWindowsでは,1つのセグメントの大きさが64Kバイトと小さかったため,セグメントを使わなければ64Kバイトを超えるメモリー領域を扱えなかった。その後x86は,32ビット化されたときに,フラット・メモリー・モデルを備え,セグメントを使う必要がなくなった。このモードでは,セグメントを使い分けなくても,OSとアプリケーションが連続した4Gバイトのアドレス空間にアクセスできるからだ。ところがこのモードでは,セグメントの切り替えという面倒な処理をする必要がなくなったものの,データ領域でのプログラム実行を禁止できないのである。
物理アドレス拡張モードのPTEに制御ビットを定義
従って,ハードウエアDEP機能を利用するためには,PAEモードでOSを起動する必要がある。実際,AMD64アーキテクチャのCPUを備えたPCでDEP機能を利用するときは,必ずPAEモードで起動する(図8)
動的に確保したメモリーでのプログラム実行に影響する そのため,プログラム内で確保したデータ領域にプログラムをロードしてそれを実行するようなプログラムを意図して作ったとしても,ハードウエアDEPはその実行を阻止してしまうことがある。例えば,圧縮した実行ファイルをメモリー上に展開し,それを実行するようなプログラムは注意が必要である。JIT(Just In-Time)コンパイルするようなプログラムも同様である。 これらのような処理をするには,メモリー領域を確保するのに,Cランタイム関数のmallocや,Win32 APIのHeapAllocを使ってはいけない。これらの関数はメモリーをデータ領域として確保するからだ。プログラムを格納するためのメモリー領域を確保するには,VirtualAlloc APIにPAGE_EXECUTEなどのフラグを指定して確保する必要がある。
例外ハンドラの安全性を確認するソフトウエアDEP 一般に,「0で除算した」などプログラムで例外が発生すると,例外ハンドラと呼ぶ,そのプログラムが用意した特別な関数にジャンプする(発生した例外に対応するハンドラがない場合は,Windowsがメッセージ・ボックスを表示して,そのプログラムが強制終了される)。 Windowsは「構造化例外ハンドラ」と呼ぶ仕組みを備えている(C++の例外ハンドラは,構造化例外ハンドラに似ているが,より機能を付加したものである)。それに対応したプログラムではスタックに例外ハンドラへのジャンプ・テーブル(複数のジャンプ先アドレスの一覧表)を用意する。構造化例外ハンドラを備えたプログラムで例外が発生したときの処理手順は次のようになる。
(1)例外が発生 ソフトウエアDEPは,上記処理の中の(3)と(4)の間に,(4)でジャンプしようとしている領域が実行可能領域としてマークされていることを確認する。もしもジャンプ先がデータ領域だった場合は,ジャンプしない。これによって,不正な例外ハンドラにジャンプし,実行されることを防ぐ。 コンピュータ・ウイルスの中には,自分の活動を検知されにくくするために,例外ハンドラを利用するものがある。例外ハンドラを自分が用意した不正プログラムに設定し,わざと例外を発生させるわけだ。こうすると,自身の中に用意した不正プログラムにジャンプするコードがプログラムの中で直接実行されるわけではないので,活動が分かりにくくなる。ソフトウエアDEPはこのような悪意のあるプログラムの実行を阻止できる。 (『日経Windowsプロ』2005年3月号掲載「今から備えるWindows Server 2003 SP1」より)
|
今から備えるWindows Server 2003 SP1(第4回=最終回)p2
あなたにお薦め
今日のピックアップ
-
キーワードは「ふ化」と「自走」、7領域38講座を用意する日清食品の社内デジタル教育
-
ディープフェイク音声を会話中の「息継ぎ」で見抜く、精度80%超の新手法が登場
-
客先の言いなりにはならない、常駐の2大デメリットを克服する
-
2画面のモバイルディスプレー、ノートPCやスマホで手軽にトリプル化
-
社員の平均年収は1000万円目前、大塚商会の営業モチベーションアップの秘密
-
競合17社の機密情報を学習した創薬AI、エーザイや小野薬品などが参画
-
明治が30年来のメインフレームを完全撤廃へ、「塩漬け」レガシーをJavaに自動変換
-
あれもこれも「ノーコード」、このままだと未来はない
-
JR貨物が車両整備システム導入で年1万8000時間削減、データ活用し車輪交換最適化
-
容量不足でスマホを「アップデートできない」、不要なデータを削除する正しい手順
-
Edgeは検索を楽にする機能が充実、Chromeでは手順が多くなることも
-
31歳ITエンジニア、「平均額程度」の賃上げは普通レベルの残念な評価なのか
注目記事
おすすめのセミナー
-
「仮説立案」実践講座
例えば「必要な人材育成ができていない」といった課題に、あなたならどう取り組みますか? このセミナ...
-
CIO養成講座 【第35期】
業種を問わず活用できる内容、また、幅広い年代・様々なキャリアを持つ男女ビジネスパーソンが参加し、...
-
改革リーダーのコミュニケーション術
プロジェクトを成功に導くために改革リーダーが持つべき3つのコミュニケーションスキル—「伝える」「...
-
パワポ資料が見違える「ビジネス図解」4つのセオリー
インフォグラフィックスとは、形のない情報やデータなど伝えたいことを分かりやすい形で表現する技法で...
-
間違いだらけの設計レビュー
本セミナーでは、現場で多く見られる間違ったレビューの典型例を示し、そうならないための現場の改善策...
-
オンライン版「なぜなぜ分析」演習付きセミナー実践編
このセミナーでは「抜け・漏れ」と「論理的飛躍」の無い再発防止策を推進できる現場に必須の人材を育成...
-
問題解決のためのデータ分析活用入門
例えば「必要な人材育成ができていない」といった課題に、あなたならどう取り組みますか? このセミナ...
-
業務改革プロジェクトリーダー養成講座【第16期】
3日間の集中講義とワークショップで、事務改善と業務改革に必要な知識と手法が実践で即使えるノウハウ...
注目のイベント
-
【4月25日】ハイパーバイザーの基本を学ぶ、参加者にはもれなくプレゼント進呈
2024年4月25日(木)
-
プラチナフォーラム 2024 Spring
2024年 4月 26日(金) 13:00~17:00(予定)
-
日経クロステックNEXT 関西 2024
2024年5月16日(木)~5月17日(金)
-
日経ビジネスCEOカウンシル
2024年5月16日(木)17:00~19:50
-
VUCA時代に勝ち残る戦略的サプライチェーン構築に向けて
2024年 5月 24 日(金) 10:00~16:20
-
人手不足を乗り越える 日本の産業界成長のシナリオ2024
2024年5月30日(木)10:20~17:45
-
キャリア・オーナーシップが社会を変える
2024年6月3日(月)~6月5日(水)
-
DX Insight 2024 Summer
2024年6月4日(火)、5日(水)
-
デジタル立国ジャパン2024
2024年6月10日(月)、11日(火)
-
DIGITAL Foresight 2024 Summer
2024年6月13日(木)~8月8日(木)16:00~17:00 ※毎週火・木曜開催予定
おすすめの書籍
-
ソフトバンク もう一つの顔 成長をけん引する課題解決のプロ集団
ソフトバンクにはモバイルキャリア事業以外のもう一つの顔が存在する。本書ではキーパーソンへのインタ...
-
対立・抵抗を解消し合意に導く 改革リーダーのコミュニケーション術
本書は、改革リーダーに必須のコミュニケーション術を3つのスキルの観点からまとめ上げたものです。今...
-
もっと絞れる AWSコスト超削減術
本書ではコスト課題を解決するため、AWSコストを最適化し、テクニックによって削減する具体策を紹介...
-
優秀な人材が求める3つのこと 退職を前提とした組織運営と人材マネジメント
「学生に人気のコンサルであっても、大手企業であっても、せっかく獲得した人材が数年で辞めてしまう...
-
Web3の未解決問題
ブロックチェーン技術を主軸とするWeb3の技術について、現在の社会制度との摩擦と、その先にある新...
-
ロボット未来予測2033
ロボットの用途・市場はどう拡大していくのか。AI実装でロボットはどこまで進化するのか。技術の進展...
日経BOOKプラスの新着記事
-
人生がいとおしくなる、大人のファンタジー・ゴルフ小説
-
はじめに:『マッキンゼー 価値を創るM&A』
-
「本を贈る日」に日経BOOKプラス編集部員が、贈りたい本 2024
-
フェリス阿部教諭「今なお、この本を読むことには大きな意味がある」
-
プロゴルファーになる夢を絶たれた男の再生物語
-
同志社生協 大学らしい品ぞろえと「町の本屋さん」の役割を意識
-
キッコーマンの堀切会長が読み解く、相模屋の経営のキモ
-
はじめに:『ビジネス文書がサクサク作れる! Word×Copilot 最強の時短術』
-
落合陽一、現代の茶道をデジタルネイチャーで読み解く
-
『水曜日は働かない』『昨夜の記憶がありません』など休みを考える3冊
日経クロステック Special
What's New
経営
- 「クラウド時代のあるべき運用」を熱く議論
- 大企業にもキントーンの導入が進む理由
- 製造業DX「データドリブン経営成功のシナリオとは」
- ジェイテクトエレクトロニクスのDX事例
- NTTドコモ支援の実践型教育プログラム
- DXを成功に導くITインフラとは?
- NTTデータに優秀なデジタル人財が集まる理由
- オリックス銀行×富士通時田社長 特別鼎談
- ERPプロジェクト≫IT人財の必須条件は
- 脱レガシー案件≫SIerに必要な人財像は
- 3段階で考える、DXで企業力を高める方法
- イノベーションの起爆剤
- 大規模プロジェクトでPMが注意すべき点は
- 大阪・名古屋エリアのDXが注目される理由
- 力点は「未来予測」へ:データ利活用の勘所
- 生成AI活用でSAP BTPの価値が進化
- ServiceNowでDXを加速≫方法は
- SAPプロジェクトの全体像をいかに描くか