[問題文・解答]
平成26年度4月に実施された情報セキュリティスペシャリスト試験の午後1試験の問題・解答はIPA公式ページからダウンロード出来ます。(以下リンク)
[H26春 午後1 問題文] [H26春 午後1 解答]
[問題概要]
題材は、Webアプリケーションの脆弱性についてです。画像ファイルのオンライン共有ストレージサービスの開発にあたり、セッションIDの管理や画像ファイルの識別、画像変換プログラムの不具合や脆弱性について検討・修正を行うという内容です。
プログラミングやオーバフローに関する知識が必要とされるため、難易度はやや高めです。
[設問1]
(1)
これは知っていないと答えるのは厳しいです。
HTTPのRefererは、リンク元のWebページのURL情報です。あるWebページAに別のWebページBのリンクが貼られている場合、ブラウザ上でBのリンクをクリックするとページAのURLがRefererヘッダでページBへと送信されてしまうため、ページBの管理者にセッションIDが漏れてしまう可能性があります。
参考ページ
HTTPのRefererは、リンク元のWebページのURL情報です。あるWebページAに別のWebページBのリンクが貼られている場合、ブラウザ上でBのリンクをクリックするとページAのURLがRefererヘッダでページBへと送信されてしまうため、ページBの管理者にセッションIDが漏れてしまう可能性があります。
参考ページ
[答] Referer
(2)
図2では、<script type="text/javascript"> 〜</script>の部分でJavaScriptによってアップロードする画像の拡張子判定を行っています。
しかし、Webブラウザの設定でスクリプト(JavaScript)を無効化する設定がされている場合、この拡張子判定の部分は実行できません。
[答] ブラウザの設定でスクリプトを無効化する。
(3)
確実に拡張子判定を実施するためには、ブラウザ側ではなく、Webサーバ側で動くWebアプリケーションで判定を実行すべきです。
[答] Webアプリケーションで拡張子判定を行う
[答] Webアプリケーションで拡張子判定を行う
[設問2]
(1)
a) ポイントは図6の36〜38行目です。bytesOfRowは画像の1行分を格納するのに必要なバイト数です。36行目で画像の列数と各ピクセルのサイズ(RGB)の積から1行分のバイト数を求め、37行目で256バイト境界に合わせるためにパディングを行っています。
38行目では、36,37行目で求めたbytesOfRowと画像の行数fhBuff.rowsの積から入力画像を格納するのに必要な総バイト数を求めてbytesOfBuffに代入しています。
ここで、例えば入力画像の画素数が非常に大きい場合、必要なバイト数が4バイトint型整数(bytesOfBuff)の範囲を超えて整数オーバフローとなる可能性があります。
b) 図2の41行目でbytesOffBuff分の領域を確保し、50行目で入力画像のデータを確保した領域にコピーしています。もし38行目で整数オーバフローとなった場合、41行目で確保した領域のサイズも正しいものではないため、50行目のコピー時にバッファオーバフローが起こります。
38行目では、36,37行目で求めたbytesOfRowと画像の行数fhBuff.rowsの積から入力画像を格納するのに必要な総バイト数を求めてbytesOfBuffに代入しています。
ここで、例えば入力画像の画素数が非常に大きい場合、必要なバイト数が4バイトint型整数(bytesOfBuff)の範囲を超えて整数オーバフローとなる可能性があります。
b) 図2の41行目でbytesOffBuff分の領域を確保し、50行目で入力画像のデータを確保した領域にコピーしています。もし38行目で整数オーバフローとなった場合、41行目で確保した領域のサイズも正しいものではないため、50行目のコピー時にバッファオーバフローが起こります。
[答] a) 整数オーバフロー b) バッファオーバフロー
(2)
[設問2](1)より、整数オーバフローが起こるのは、画像の列数と各ピクセルのサイズの積にパディングを行ったものと画像の行数の積が4バイトint型整数の上限値kMaxIntegerを超える場合です。
[答] ヘッダ部の列数と各ピクセルのバイト数の積にパディングを加えたものと、行数の積がkMaxIntegerを超える。
[設問3]
[設問2]より38行目の前に以下の数式を満たすかをチェックし、エラーを出す必要があります。
kMaxInteger < bytesOfRow × fhBuf.rows
ただし、このままだと右辺が既に整数オーバフローとなってしまう可能性があるため、以下のいずれかのように変換する必要があります。
・kMaxInteger / fhBuff.rows < byteOfRow
・kMaxInteger / byteOfRow < fhBuff.rows
[答] c) kMaxInteger / fhBuf.rows d) bytesOfRow
又は c) kMaxInteger / bytesOfRow d) fhBuf.rows
又は c) kMaxInteger / bytesOfRow d) fhBuf.rows
平成26年度春のSC午後1試験の他の問題の解説は下記投稿で行っています。
また、オススメ問題について下記投稿に記載しています。
上記の解説は問題と解答を元に自分なりの考え方を記述しており、間違っている部分もあるかと思いますので、ご了承願います。また、誤りについては正しい考え方をご指摘・ご教授頂けると助かります。
0 件のコメント:
コメントを投稿