情報処理安全確保支援士試験では午後Ⅰの3問中1問は必ずセキュアプログラミングの問題が出題されます。しかし、セキュアプログラミングの問題は選択する人が少ない様で、あるIT資格系の書籍やセミナーで有名な方のセミナーで情報処理安全確保支援士試験(以下SC試験)の受験者の実に75%の受験者は選択しないと聞きました。言語はC++/Java/ECMAScript(JavaScript)のどれかが使われた問題が出題されることになっており、どの言語が出題されるかは試験に臨むまで分かりません。しかし、裏を返せば25%の人はセキュアプログラミングを選択して合格していることになります。実際に勉強してみると上記3つの言語の基本文法が分かっていれば問題を解くのに支障が無いことが分かりました。この点は基本情報技術者試験の言語問題とは異なります。また、出る脆弱性の内容も決まっている為、覚えなければならないことも他のセキュリティの分野と比較して少ないと言えます。故に暗記事項をまとめておこうと思います。
※ プログラミングの問題の難易度は
FEのアルゴリズム > FEの言語問題(選択) > SCのセキュアプログラミング > APのアルゴリズムと言うのが筆者の印象です。(研究中なので断定は出来ません)
2021/4/13修正:
FEのアルゴリズム > FEの言語問題(選択) > APのアルゴリズム > SCのセキュアプログラミング
研究の結果SCのセキュアプログラミングはCアレルギーやJavaアレルギーが無ければパターンを掴むだけで得点源に出来る可能性が有るというのが筆者の印象です。
(FE:基本情報、AP:応用情報、SC:安全確保支援士)
代表的な攻撃パターン
- XSS(Cross Site Script)脆弱性を突いた攻撃
- 反射型XSS(Reflected XSS)、格納型XSS(Stored XSS)、DOMベースのXSS(DOM Based XSS)
- 注意する箇所 : 動的にHTML文を生成する処理を行う部分
- 対策 : SQL文中にプレースホルダを用いる
- 対策2 : サニタイジング(出力文字列をエスケープ処理し無害化)
- 対策3 : javascript://などの文字列の除去
- SQLインジェクション脆弱性を突いた攻撃
- 注意する箇所 : 文字列連結などを使用して動的にSQL分を生成する処理を行う部分
- 対策 : DBMSバインド機構を利用してSQL分を生成する方法が有効
- CSRF(Cross Site Request Forgery)脆弱性を突いた攻撃
- 注意する箇所 : パラメタ(特に認証情報など)の受け渡しが伴う画面遷移
- 対策 : POSTメソッドによるアクセスのみを用いる
- 対策2 : 乱数などをHTMLフォーム内のhidden属性に埋め込み受信側で検証
- 対策3 : CAPTCHAを用いる
- BOF(Buffer Over Flow)攻撃
- 注意する箇所 : データサイズを指定せずに変数や配列に代入、コピーを実行する関数の呼び出し部分
- 関数の例 : gets, sprintf, strcpy, strcat, etc...
- 対策 : データサイズを明示的に指定する関数を用いる
- 関数の例 : fgets, snprintf, strncpy, strncat, etc...
- 対策2 : DEP(Data Execution Prevention), ASLR(Address Site Layout Randomization)を有効化
- 対策3 : C/C++をそもそも使わない(他の言語を用いる)
- 注意する箇所 : データサイズを指定せずに変数や配列に代入、コピーを実行する関数の呼び出し部分
- Return-to-libc攻撃
- C/C++の標準ライブラリ関数system関数を用いて任意のOSコマンドを実行する攻撃
- DEPによる対策では防げない
- ASLRを有効化することで攻撃実行を困難に出来る
暗記事項
用語 | 説明 |
---|---|
スタック領域 / ヒープ領域 / テキスト領域 | C/C++におけるメモリ上でのプログラムの管理領域 スタック領域 : ローカル変数、実引数、呼び出し元の番地などを格納 ヒープ領域 : 動的メモリ確保時に利用 テキスト領域 : 実行コードを格納 ヒープ領域はメモリの下位番地~上位番地に向かって、スタック領域は上位番地~下位番地という方向でメモリを利用 |
リトルエンディアン / ビッグエンディアン | プロセッサでの数値の扱い方 リトルエンディアン : メモリの上位アドレスを下位桁に格納(IntelのCPUはリトルエンディアン) ビッグエンディアンはメモリの上位アドレスを上位桁に格納 |
DEP(Data Execution Prevention) | 指定されたメモリ領域(ヒープ領域やスタック領域)でプログラムコードの実行を防止する技術(Return-to-libcには効果が無い) DEPを有効にすることで得られる効果を問う出題が過去に数度有った |
SSP(Stack Smashing Protection) | スタック領域でカナリア(canary)と呼ばれる値を利用してスタックBOFの有無を確認する技術 BOFが発生するとcanaryの値が書き変わってしまうため検知できる コンパイラが対応していない場合は使えないということを問う出題が過去に有った(H30年秋問1) |
ASLR(Address Space Layout Randomization | プログラム実行時にデータ領域、ヒープ領域、スタック領域およびライブラリをランダムにメモリ中に配置するOSの技術 |
PIE(Position Independent Executable) | プログラム実行時にASLRが対象とする領域に加えて、テキスト領域もランダムにメモリ中に配置する技術 |
Automatic Fortification | バッファオーバーフロー脆弱性の原因となりうる脆弱なライブラリ関数をコンパイル時に境界チェックを行う安全な関数に置き換える技術(但し対応しているコンパイラでのビルドが必要) |
Reference
[1] 情報処理安全確保支援士 ALL IN ONE 2021 第5章
[2] 情報処理安全確保支援士午後問題の重点対策 2020 第7章