---
title: "バッファーオーバーフローとは？メモリ領域を超える攻撃を整理【SG試験】"
description: "バッファーオーバーフローを領域外への書込みで異常終了や不正コード実行を招く脆弱性として整理し、SQLインジェクションやXSSとの入力悪用の違いを判断します。 境界チェック不足が原因になる点を押さえ、文字列を画面に出す攻撃やSQL文を改変する攻撃を選ばせるひっかけを避けます。"
last_modified_at: "2026-06-24"
canonical_url: "https://stemtazoo.github.io/sg/buffer-overflow/"
section: "sg"
---

## まず結論

バッファーオーバーフローとは、**プログラムが確保したメモリ領域を超えてデータを書き込んでしまう脆弱性**です。  
SG試験では、攻撃文に「メモリ領域」「上限を超える」「異常終了」「不正なコードの実行」といった表現があるかを見て判断します。

特に選択肢では、SQLインジェクション、DoS攻撃、クロスサイトスクリプティングと並べて出されることがあります。  
**データベースを狙うのか、Webページにスクリプトを埋め込むのか、メモリ領域を超えるのか**で切り分けるのがポイントです。

## 直感的な説明

バッファーは、データを一時的に入れておく「箱」のようなものです。

たとえば、10文字まで入る箱に、100文字のデータを無理に入れようとすると、箱からあふれてしまいます。  
この「あふれた部分」が、本来書き込んではいけないメモリ領域を書き換えてしまうことがあります。

その結果、プログラムが異常終了したり、攻撃者が用意した不正な命令が実行されたりする可能性があります。

SG試験では、細かいメモリ構造を問うというより、**入力値の長さチェックが不十分だと、プログラムの動作を壊される**という理解が大切です。

## 定義・仕組み

バッファーオーバーフローは、プログラムが用意したメモリ領域を超えてデータを書き込むことで発生します。  
特に、C言語やC++のようにメモリを直接扱いやすい言語では、入力値の長さ確認が不十分だと起こりやすい脆弱性です。

基本の流れは次のように考えると理解しやすいです。

1. プログラムが一定サイズのメモリ領域を用意する
2. 攻撃者が想定より長いデータを入力する
3. 用意された領域を超えてデータが書き込まれる
4. プログラムが異常終了したり、不正なコードが実行されたりする

IPAの「安全なウェブサイトの作り方」でも、バッファオーバーフローへの対策として、直接メモリを操作できない言語で記述することや、直接メモリを操作する部分を最小限にすることが示されています。  
参考：[IPA 安全なウェブサイトの作り方 - 1.10 バッファオーバーフロー](https://www.ipa.go.jp/security/vuln/websecurity/bach-overflow.html)

対策としては、次のような考え方が重要です。

- 入力値の長さをチェックする
- 配列や文字列の領域を超えないようにする
- 安全なライブラリや関数を使う
- 静的解析やファジングで脆弱性を見つける
- OSや実行環境の保護機能を利用する

SG試験では、コードの詳細よりも、**入力チェック不足によってメモリ領域を破壊される攻撃**と押さえると判断しやすくなります。

## どんな場面で使う？

バッファーオーバーフローは、主にソフトウェア開発や脆弱性管理の文脈で出てきます。

たとえば、次のような場面です。

- 外部から文字列やファイルを受け取るプログラム
- C言語やC++で作られたシステム
- 組込み機器や古い業務システム
- 入力値の長さ確認が不十分なアプリケーション
- 脆弱性診断やソースコードレビューの対象

業務上は、「利用者が長い入力をするかもしれない」という前提で、入力値を制限したり、想定外のデータを受け取っても安全に処理できるようにしたりします。

選択肢では、次の表現が出たらバッファーオーバーフローを疑います。

- 確保されたメモリ領域を超える
- バッファの上限を超えて書き込む
- プログラムを異常終了させる
- 不正なコードを実行させる
- 入力データの長さチェックが不十分

一方で、「大量の通信でサービスを止める」とあればDoS攻撃、「SQL文を不正に操作する」とあればSQLインジェクション、「利用者のブラウザでスクリプトを実行する」とあればクロスサイトスクリプティングを考えます。

## よくある誤解・混同

### SQLインジェクションとの違い

SQLインジェクションは、**SQL文を不正に組み替えてデータベースを操作する攻撃**です。

- SQLインジェクション：データベース、SQL文、不正な取得・改ざん・削除
- バッファーオーバーフロー：メモリ領域、入力長、異常終了、不正コード実行

選択肢で「データベースのデータを不正に取得」とあれば、バッファーオーバーフローではなくSQLインジェクションを疑います。

### DoS攻撃との違い

DoS攻撃は、**大量の通信や処理負荷によってサービスを使えなくする攻撃**です。

バッファーオーバーフローでも、結果としてサービス停止につながることはあります。  
ただし、SG試験では原因に注目します。

- 大量パケット・大量アクセスで止める：DoS攻撃
- メモリ領域を超える入力で異常動作させる：バッファーオーバーフロー

「サービス不能」という結果だけで判断せず、**なぜ止まったのか**を見るのがポイントです。

### クロスサイトスクリプティングとの違い

クロスサイトスクリプティング（XSS）は、**Webページに不正なスクリプトを埋め込み、利用者のブラウザ上で実行させる攻撃**です。

- XSS：Webページ、スクリプト、利用者のブラウザ、情報漏えい
- バッファーオーバーフロー：メモリ領域、プログラム内部、不正コード実行

選択肢に「罠のページ」「リンクをクリック」「レスポンスに不正スクリプト」とあれば、XSSを疑います。

### バッファーアンダーフローとの関係

問題文によっては、バッファーオーバーフローとあわせて、バッファーアンダーフローという表現が出ることがあります。  
どちらも、**想定されたメモリ領域の範囲外にアクセスしてしまう問題**として理解するとよいです。

SG試験では、細かな違いを深掘りするより、**メモリ領域の範囲を超えることが問題**という軸で判断できれば十分です。

## まとめ（試験直前用）

- バッファーオーバーフローは、確保済みのメモリ領域を超えてデータを書き込む脆弱性
- 「メモリ領域」「入力長」「異常終了」「不正コード実行」が判断キーワード
- SQL文を不正操作するならSQLインジェクション
- 大量通信で止めるならDoS攻撃
- Webページにスクリプトを埋め込むならXSS
