バッファオーバーフロー
バッファオーバーフロー(
バッファオーバーフローは、
サイバーセキュリティ・
バッファオーバーフローの具体 例
簡単 な例
A
、もうB
である。A
は 0 でB
には
A
|
B
| |||||||||
---|---|---|---|---|---|---|---|---|---|---|
NUL | NUL | NUL | NUL | NUL | NUL | NUL | NUL | 1979 | ||
16 |
00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 07 | BB |
ここで、プログラムがバッファ A
にヌルB
の
A
|
B
| |||||||||
---|---|---|---|---|---|---|---|---|---|---|
「e」 | 「x」 | 「c」 | 「e」 | 「s」 | 「s」 | 「i」 | 「v」 | 25856 | ||
16 |
65 | 78 | 63 | 65 | 73 | 73 | 69 | 76 | 65 | 00 |
プログラマとしては B
をB
のA
と B
B
の
電子 メールアドレスを題材 にした例
コンピュータプログラムを
たとえば、
- 200
文字 分 の領域 をバッファとして用意 する。 - ユーザが200
文字 より長 いメールアドレスを入力 する。 - プログラムがバッファの
大 きさをチェックせずに入力 データを書 き込 む。 - バッファとして
確保 した領域 をはみだしてデータが書 き込 まれてしまう。
これがバッファオーバーフローである。
このようにバッファオーバーフローは、プログラムが
C言語 特有 の例
C
#include <stdio.h>
int main(int argc, char *argv[])
{
char buf[200];
gets(buf);
....
}
gets
これ
バッファオーバーフロー攻撃
CWE-120 | |
CWE-121 | スタックベースのバッファオーバーフロー[5] |
CWE-122 | ヒープベースのバッファオーバーフロー[6] |
などが
これら3つのバッファオーバーフロー
これら3
CWEでは「CWE-193: Off-by-oneエラー」[9]がバッファオーバーフローの
古典 的 バッファオーバーフロー攻撃
バッファAの
スタックベースのバッファオーバーフロー攻撃
スタックベースのバッファオーバーフローは「
C言語 ・C++におけるメモリ領域
スタックベースのバッファオーバーフローについて
C
… | |||||
コード |
ヒープ ( |
… | スタック (← | ||
データ |
bss |
スタック
… | ||||||||
… | gのスタックフレーム | fのスタックフレーム | … | |||||
… | gの |
gの |
gのSFP | gのリターンアドレス | gの |
fの |
… | … |
プロセスで
攻撃 の基本 的 アイデア
(シェルコード)…(シェルコードの
仮想 アドレス)
ここでシェルコードとは、
この
… | ||||||||
… | gのスタックフレーム | fのスタックフレーム | … | |||||
… | gの |
gの |
gのSFP | gのリターンアドレス | gの |
fの |
… | … |
(シェルコード)… | … | (シェルコードの |
よって
NOPスレッド
NOPとは「
NOP … NOP (シェルコード)(
戻 りアドレス)…(戻 りアドレス)
gのスタックフレーム | fのスタックフレーム | |||
… | gの |
gのSFP | gのリターンアドレス | … |
… | NOP… NOP … | NOP …NOP (シェルコード)…( |
( |
( |
これでgのリターンアドレスは「
NOPスレッドは
戻 りアドレスの値 の予想
この
var_add = &x - (
小 さな値 )
になるはずである[16]。ここで「&x」はxのアドレスを
よって
埋 め込 めるコード量 が小 さい場合 の対処
しかし
より
ヒープスプレー
NOPスレッドを
ヒープスプレーでは、NOPスレッドとシェルコードを、スレッド
ウェブブラウザではJavaScriptなどのクライアントサイドスクリプトにより
トランポリング
ヒープベースのバッファオーバーフロー
mallocなどでヒープ
mallocのメモリ管理
より
mallocは
chunkは
mallocのメタデータの書 き換 え
より
バッファオーバーフローの結果
write-what-where状態
バッファオーバーフロー
write-what-where
プログラムのフリーズ・クラッシュ
関数 ポインタの書 き換 え
技術 的 対策
コンパイラやライブラリによる対策
カナリア
バッファオーバーフローを
安全 なライブラリへの置 き換 え
実行 環境 での対策
Write XOR eXecute
また、プロプライエタリなアドオンとしては
なお、2018
ASLR
バッファオーバーフロー
ASLRはバッファオーバーフロー
カーネル
gccとg++でコンパイルとスタック
開発 時 の対策
プログラミング言語 ・プログラミング環境 の選択
C
Javaプラットフォームや.NET Frameworkでは
ソースコード記述 時 の対策
バッファオーバーフロー
人手 による対策
バッファオーバーフロー
- データをバッファに
挿入 する際 には、データ長 がバッファ長 を超 えない事 を調 べる検査 ロジックをプログラムに書 き加 えておく[51] - データが
文字 列 の場合 は文字 列 長 を数 え間違 えないよう、文字 列 の終端 にあるナル文字 も数 える[51] - データ
長 に依存 したループを書 くときに間違 ってループを回 しすぎる(Off-by-oneエラー)事 が無 いようにする[51] 事前 にデータ長 の上限 がわからない場合 は、バッファをmalloc等 で動的 に確保 し、不要 になったら確実 にfreeする[51]
安全 なライブラリの使用
- Managed String(Linux
環境 )[51] - ISO/IEC 9899:2011 Annex K(Windows
環境 )[51] - SafeStr(Linux
環境 、Windows環境 )[51] - "The Better String Library"[52]
- Vstr[53]
- Erwin[54]
またBSD libcなど、Cライブラリの
静的 コード解析 時 における対策
人手 による静的 コード解析
自動 化 された静的 コード解析
strcpy
またソースコードが
発展 的 な攻撃
Return-to-libc攻撃
そこでW Xを
Return-to-Register攻撃
Return-to-Register
ret2esp攻撃
ret2esp(Return to esp)
歴史
バッファオーバーフローがある
Anderson 1972, p. 61: The code performing this function does not check the source and destination addresses properly, permitting portions of the monitor to be overlaid by the user. This can be used to inject code into the monitor that will permit the user to seize control of the machine.
この
処理 を実行 するコードは読 み込 み元 と書 き込 み先 のアドレスに対 するチェックを適切 に行 なっておらず、モニターの一部 に対 しユーザによる上書 きを許 すことになっている。これはモニターにコードを挿入 するのに利用 される可能 性 があり、結果 としてユーザがマシンの制御 を掌握 する可能 性 がある。
モニターとは、
バッファオーバーフローを
これ
2003
参考 文献
八木 毅 ;村山 純一 ;秋山 満 昭 (2015-03-17). コンピュータネットワークセキュリティ. コロナ社 . ISBN 978-4339024951- Erickson, Jon
村上 雅章 訳 (2011-10-22). Hacking:美 しき策謀 第 2版 ―脆弱 性 攻撃 の理論 と実際 . オライリージャパン. ISBN 978-4873115146 - “セキュア・プログラミング
講座 C/C++言語 編 ”.情報処理 推進 機構 . 2018年 12月14日 閲覧 。 - “CTFで
学 ぶ脆弱 性 (スタックバッファオーバーフロー編 ・その1)”. NTTデータ先端 技術 株式会社 . 2018年 12月14日 閲覧 。 - ヒープベースのバッファオーバーフロー
攻撃 - Markus Gaasedelen. “Heap Exploitation Modern Binary Exploitation CSCI 4968 - Spring 2015” (pdf). CyberSecurity group, Department of Computer Science, Rensselaer Polytechnic Institute (RPI). 2018
年 12月18日 閲覧 。 - “2013-12-27 Monthly Research 「Heap Exploitのこれまでと
現状 」”. FFRI. 2018年 12月26日 閲覧 。- “Monthly Research Heap Exploitのこれまでと
現状 ” (pdf). FFRI (2013年 12月27日 ). 2018年 12月18日 閲覧 。
- “Monthly Research Heap Exploitのこれまでと
- Markus Gaasedelen. “Heap Exploitation Modern Binary Exploitation CSCI 4968 - Spring 2015” (pdf). CyberSecurity group, Department of Computer Science, Rensselaer Polytechnic Institute (RPI). 2018
鈴木 舞 音 ,上原 崇史 ,金子 洋平 ,堀 洋輔 ,馬場 隆 彰 ,齋藤 孝道 「メモリ破損 脆弱 性 に対 する攻撃 の調査 と分類 」『コンピュータセキュリティシンポジウム2014論文 集 』第 2014巻 第 2号 、2014年 10月 、767-774頁 、NAID 170000087342、2021年 12月2日 閲覧 。- "Discovering and exploiting a remote buffer overflow vulnerability in an FTP server" by Raykoid666
- "Smashing the Stack for Fun and Profit" by Aleph One
- An Overview and Example of the Buffer-Overflow Exploit. pps. 16-21.
- CERT Secure Coding Standards
- CERT Secure Coding Initiative
- Secure Coding in C and C++
- SANS: inside the buffer overflow attack
- "Advances in adjacent memory overflows" by Nomenumbra
- A Comparison of Buffer Overflow Prevention Implementations and Weaknesses
- More Security Whitepapers about Buffer Overflows
- Chapter 12: Writing Exploits III from Sockets, Shellcode, Porting & Coding: Reverse Engineering Exploits and Tool Coding for Security Professionals by James C. Foster (ISBN 1-59749-005-9). Detailed explanation of how to use Metasploit to develop a buffer overflow exploit from scratch.
- Anderson, James P. (1972
年 ). “Computer Security Technology Planning Study” (PDF). 2023年 1月 24日 閲覧 。
関連 項目
脚注
注釈
- ^ i386の
場合 、Windowsであれば仮想 空間 の上位 2 GB、Linuxであれば仮想 空間 の上位 1 GBがカーネル空間 になる。なお本節 で書 いたメモリ箇所 はいずれも後述 するセキュリティ技術 アドレス空間 配置 のランダム化 (ASLR) を用 いていない場合 の話 である。 - ^ Block Started by Symbolというアセンブラの
疑似 命令 に由来 する。 - ^ なお、データ
領域 とbss領域 を合 わせて静的 領域 という。 - ^ x86ではebpレジスタ (Stack Base Pointer Register)。
- ^
命令 ポインタとも。x86ではeipレジスタ (Extended Instruction Pointer)。 - ^
例 えばDelphiでは$RangeChecks
ディレクティブで境界 チェックの有効 ・無効 を切 り替 えられる[49][50]。
出典
- ^ a b
八木 ,村山 &秋山 2015, p. 59. - ^ “
第 10章 著名 な脆弱 性 対策 バッファオーバーフロー: #1概要 ”. セキュアプログラミング講座 C/C++言語 編 旧 2007年 公開 版 .情報処理 推進 機構 . 2018年 12月14日 閲覧 。 - ^
“[
迷信 ] scanf ではバッファオーバーランを防 げない”. C/C++迷信 集 .株式会社 きじねこ. 2020年 1月 12日 時点 のオリジナルよりアーカイブ。2010年 2月 28日 閲覧 。 “書式 指定 が不適切 なために発生 する脆弱 性 であって、scanf の問題 ではありません。” - ^ a b c d e f g h i j k l m n “CWE-120: Buffer Copy without Checking Size of Input ('Classic Buffer Overflow')”. Mitre. 2018
年 12月18日 閲覧 。 - ^ a b c d e f g h i “CWE-121: Stack-based Buffer Overflow”. Mitre. 2018
年 12月18日 閲覧 。 - ^ a b c d e f g h i j “CWE-122: Heap-based Buffer Overflow”. Mitre. 2018
年 12月18日 閲覧 。 - ^ a b “CWE-119: Improper Restriction of Operations within the Bounds of a Memory Buffer”. Mitre. 2018
年 12月18日 閲覧 。 - ^ “CWE-787: Out-of-bounds Write”. Mitre. 2018
年 12月18日 閲覧 。 - ^ “CWE-193: Off-by-one Error”. Mitre. 2018
年 12月18日 閲覧 。 - ^ “CWE-131: Incorrect Calculation of Buffer Size”. Mitre. 2018
年 12月18日 閲覧 。 - ^ “CWE-680: Integer Overflow to Buffer Overflow”. Mitre. 2018
年 12月18日 閲覧 。 - ^ “The Exploitant - Security info and tutorials”. 2009
年 11月29日 閲覧 。 - ^ a b Erickson 2011, pp. 87–88.
- ^ a b c d Erickson 2011, p. 84.
- ^ a b c d
八木 ,村山 &秋山 2015, pp. 60–61. - ^ a b c d e f g Erickson 2011, pp. 161–164.
- ^
八木 ,村山 &秋山 2015, p. 64. - ^ Akritidis, P.; Markatos, Evangelos P.; Polychronakis, M.; Anagnostakis, Kostas D. (2005). "STRIDE: Polymorphic Sled Detection through Instruction Sequence Analysis." (PDF). Proceedings of the 20th IFIP International Information Security Conference (IFIP/SEC 2005). IFIP International Information Security Conference.
- ^ Erickson 2011, pp. 164–168.
- ^ Erickson 2011, pp. 168–173.
- ^ a b c
八木 ,村山 &秋山 2015, pp. 65–67. - ^ “The Metasploit Opcode Database”. 2007
年 5月 12日 時点 のオリジナルよりアーカイブ。2007年 5月 15日 閲覧 。 - ^ Erickson 2011, pp. 173–179.
- ^ a b c d e f g
角 馬 文彦 (技術 本部 クラウド基盤 エキスパート) (2007年 11月30日 ). “malloc(3)のメモリ管理 構造 ”. VA Linux Systems Japan. 2018年 12月26日 閲覧 。 - ^ Doug Lea. “A Memory Allocator”. 2018
年 12月26日 閲覧 。 - ^ a b c FFRI 2013, p. 7.
- ^ a b FFRI 2013, p. 8.
- ^ a b c d e f “CWE-123: Write-what-where Condition”. Mitre. 2018
年 12月26日 閲覧 。 - ^ “JVNDB-2015-004721 Silicon Integrated Systems WindowsXP Display Manager における
権限 を取得 される脆弱 性 ”. JVN iPedia. 2018年 12月26日 閲覧 。 - ^ a b Erickson 2011, pp. 179–192.
- ^
芝 国雄 (2006年 9月 5日 ). “第 14回 : バッファオーバーフローとサーバ側 のセキュリティ対策 を考 える”. ThinkIT. オープンソースの適用 可能 性 を示 す. p. 2. 2019年 1月 1日 閲覧 。 - ^ David Wheeler (2004
年 1月 27日 ). “セキュアなプログラマー バッファー・オーバーフローに対抗 する今日 最大 の脆弱 性 を防止 する”. IBM. 2019年 1月 1日 閲覧 。 - ^ a b c
八木 ,村山 &秋山 2015, pp. 69–70. - ^ “StackGuard: Automatic Adaptive Detection and Prevention of Buffer-Overflow Attacks by Cowan et al.” (PDF). 2012
年 2月 9日 閲覧 。 - ^ “/GS (バッファーのセキュリティ チェック)” (2016
年 11月4日 ). 2012年 2月 9日 閲覧 。 - ^ “Libsafe - Free Software Directory”. 2012
年 2月 9日 閲覧 。 - ^ a b c d e
八木 ,村山 &秋山 2015, pp. 71–73. - ^ “Windows XP Service Pack 2、Windows XP Tablet PC Edition 2005、および Windows Server 2003 のデータ
実行 防止 (DEP)機能 の詳細 ”. 2012年 2月 17日 閲覧 。 - ^ “Bypassing Windows Hardware-enforced Data Execution Prevention”. 2007
年 5月 20日 閲覧 。 - ^ “PaX: Homepage of the PaX team”. 2012
年 2月 17日 閲覧 。 - ^ “KernelTrap.Org”. 2012
年 5月 29日 時点 のオリジナルよりアーカイブ。2012年 2月 17日 閲覧 。 - ^ “Openwall Linux kernel patch 2.4.34-ow1”. 2012
年 2月 17日 閲覧 。 - ^ “BufferShield: Prevention of Buffer Overflow Exploitation for Windows”. 2012
年 2月 17日 閲覧 。 - ^ “NGSec Stack Defender”. 2007
年 5月 13日 時点 のオリジナルよりアーカイブ。2012年 2月 17日 閲覧 。 - ^ a b “NXビット”. IT
用語 辞典 e-Words. 2019年 1月 1日 閲覧 。 - ^ “Linux kernel 3.14, Section 1.7. Kernel address space randomization”. kernelnewbies.org (2014
年 3月 30日 ). 2014年 4月 2日 閲覧 。 - ^ Stefan Esser. “iOS 6 Exploitation 280 Days Later”. 2019
年 1月 1日 閲覧 。 - ^ a b “Hardening”. Devian. 2019
年 1月 1日 閲覧 。 - ^ Neil Moffatt. “Delphi Basics : $RangeChecks command”. 2012
年 2月 3日 閲覧 。 - ^
範囲 チェック - RAD Studio - ^ a b c d e f g h “
第 10章 著名 な脆弱 性 対策 バッファオーバーフロー: #2 ソースコード記述 時 の対策 ”. セキュアプログラミング講座 (2007年 公開 版 ).情報処理 推進 機構 . 2018年 12月27日 閲覧 。 - ^ “The Better String Library”. 2012
年 2月 8日 閲覧 。 - ^ “The Vstr Homepage”. 2012
年 2月 8日 閲覧 。 - ^ “The Erwin Homepage”. 2012
年 2月 8日 閲覧 。 - ^ a b c d e f “
第 10章 著名 な脆弱 性 対策 バッファオーバーフロー: #3 ソースコードの静的 検査 ”. セキュアプログラミング講座 (2007年 公開 版 ).情報処理 推進 機構 . 2018年 12月27日 閲覧 。 - ^ メモリ
破損 脆弱 性 に対 する攻撃 の調査 と分類 2014, p. 769. - ^ Shah, Saumil (2006). 1 - Saumil Shah - Writing Metasploit Plugins.pdf "Writing Metasploit Plugins: from vulnerability to exploit" (PDF). Hack In The Box. Kuala Lumpur.
{{cite conference}}
:|url=
の値 が不正 です。 (説明 ) - ^ a b c “CTFで
学 ぶ脆弱 性 (スタックバッファオーバーフロー編 ・その1)”. NTTデータ先端 技術 株式会社 . 2019年 1月 1日 閲覧 。 - ^ “"A Tour of The Worm" by Donn Seeley, University of Utah”. 2007
年 5月 20日 時点 のオリジナルよりアーカイブ。2007年 6月 3日 閲覧 。 - ^ “Bugtraq security mailing list archive”. 2007
年 9月 1日 時点 のオリジナルよりアーカイブ。2007年 6月 3日 閲覧 。 - ^ “Smashing the Stack for Fun and Profit”. 2007
年 6月 3日 閲覧 。 - ^ “eEye Digital Security”. 2007
年 6月 3日 閲覧 。 - ^ “Microsoft Technet Security Bulletin MS02-039”. 2007
年 6月 3日 閲覧 。 - ^ “Hacker breaks Xbox protection without mod-chip”. 2007
年 9月 27日 時点 のオリジナルよりアーカイブ。2007年 6月 3日 閲覧 。