Take's Software Engineer Blog

TOEIC200点&プロマネな私が社内公募を経て、ソフトエンジニア&英語部門へ異動して奮闘していく話をしていきます

情報処理安全確保支援士試験 令和5年度 春期 午後1 問1 その①

情報処理安全確保支援士 令和5年の解説というか自習

記事です。

いろんなソースを頼り解説を充実させます

 

問1 Webアプリケーションプログラム開発に関する次の記述を読んで、設問に答えよ。

 G社は、システム開発を行う従業員100名のSI企業である。このたび、オフィス用品を販売する従業員200名のY社から、システム開発を受託した。開発プロジェクトのリーダーには、G社の開発課のD主任が任命され、メンバーには、開発課から、Eさんと新人のFさんが任命された。G社では、 セキュリティの品質を担保するために、 プログラミング完了後にツールによるソースコードの静的解析を実施することにしている。

[受託したシステムの概要]
 受託したシステには、Y社の得意先がオフィス用品を注文する機能、Y社とY社の得意先が注文履歴を表示される機能、Y社とY社の得意先が注文番号を基に注文情報を照会する機能(以下、注文情報照会機能という)、Y社とY社の得意先が納品書のPDFファイルをダウンロードする機能などがある。

[ツールによるソースコードの静的解析]
 プログラミングが完了し、ツールによるソースコードの静的解析を実施したところ、Fさんが作成した納品書PDFダウンロードクラスのソースコードに問題があることが分かった。納品書PDFダウンロードクラスのソースコードを図1に、静的解析の結果を表1に示す。

 この解析結果を受けて、Fさんは、Eさんの指導の下、ソースコードを修正した。表1の項番1について図1の8行目から11行目を図2に示すソースコードに修正した。項番2と項番3についてもソースコードを修正した。

 再度、ツールによるソースコードの静的解析が実施され、表1の指摘は解消していることが確認された。

設問

a:13

ディレクトリトラバーサルがどのような意味かわかると、ディレクトリのパスを作成している13行目が該当します

File fileObj = new File(PDF_DIRECTORY + “/” + clientCode + “/” + “DeliverySlip” + inOrderNo + “.pdf”);

PDF_DIRECTORY=/var/pdf”

clientCode=得意先コード取得

inOrderNo=?

inOrderNoが利用者が入れる注文番号なので、この行が該当します

 

ディレクトリトラバーサル

ディレクトリトラバーサル とは、利用者が供給した入力ファイル名のセキュリティ検証/無害化が不十分であるため、ファイルAPIに対して「親ディレクトリへの横断 」を示すような文字がすり抜けて渡されてしまうような攻撃手法のことである

このコードどうやって動く・・・?

この問題ハマります。

この問題の肝は静的解析を実施したというところです。

これは、動きを気にせずソースコードだけを見るというところがポイントです。

余談ですが、

指摘されているけど、ここ通らないので脆弱性の対応不要です

ということは、現場でよくやる判断の一つだったりします

なお静的解析を語るといろいろあるのですが、有名どころになりそうなGithub脆弱性Scanを紹介しておきます。1つやれば安心という世界ではなく複数かけないといけないというのが面倒なところです

docs.github.com

b:in

脆弱性「確保したリソースの解放漏れ」、指摘箇所「(省略)」、指摘内容「変数 stmt、変数 result0bj、変数(b)が指すリソースが解放されない。」

Javaガベージコレクションでメモリ管理は不要と思っていましたが、データベースやファイルなど限られたリソースのものは、開けたら閉じる必要があります。

www.jpcert.or.jp

www.jpcert.or.jp

考え方としては、ファイルに関する処理やデータベース処理をしている個所を探すと、ファイルをいじっている変数を見つけることができる

問題に立ち返ると

stmt:データベース

result0bj:データベース

in:ファイル関連

となるため、答えはinとなる。

 

c:WHERE head.order_no = ?、d:PreparedStatement stmt = conn.prepareStatement(sql)

SQLインジェクションを対策に関する問題。
SQLインジェクションの対策は、午前2で頻出しているものなので、

対策は、プレースホルダを利用することになります

Javaソースコードで同対策すればよいかを知らないと解けません。

セキュアコーディングガイドによると

https://www.jpcert.or.jp/securecoding/2012/No.04_MySQL_Connector.pdf

とあるので、プリペアードステートメント対応しなさという問題

サンプルコード

で、問題に戻ると、

 

元の問題

8: sql = sql + “WHERE head.order_no = ‘ ” + inOrderNo + ” ‘ “;
9: sql = sql + (省略); //抽出条件の続き
10: Statement stmt = conn.createStatement();
11: ResultSet resultObj = stmt.executeQuery(sql);

修正後

Cの答えは、プレースホルダにすればよいので、

sql = sql + “WHERE head.order_no = ?“;

と入れればよい。

SQLのプリコンパイルを行う処理を記載する。

前のコードではCreateになっていたが、prepareStatement

を利用することになる

PreparedStatement stmt = conn.prepareStatement(sql);

 

Javaの知識がないとプログラミングの問題は解きずらいということがわかりましたね。文法を理解する+セキュアコーディングを勉強する際はIPAの資料を読み込んでおくといいかもしれない。

参考

www.youtube.com

aolaniengineer.com

 

 

div #breadcrumb div{ display: inline;font-size:13px;}