問題 9★☆☆

社内システムの開発部門に、セキュアプログラミングの徹底を求めることになった。 セキュアプログラミングの説明として、最も適切なものはどれか。

正解:ア

各選択肢の解説

  1. ア脆弱性の原因になる書き方を避け、欠陥を作り込まないようにプログラムを書くこと。

    正解。セキュアプログラミングは、開発の段階で脆弱性を作り込まないための 書き方です。入力値の扱い方やメモリの使い方など、欠陥の原因になる書き方を 最初から避けるので、後から見つけて直すより手戻りが少なく済みます。

  2. イ完成したシステムに疑似的な攻撃を行い、実際に侵入できるかを確かめること。

    誤り。これはペネトレーションテストの説明です。どちらも脆弱性に関わる ため混同しますが、こちらはできあがった物を攻めて確かめる検査です。 作る段階で防ぐのか、作った後に確かめるのかで区別します。

  3. ウ公開中のWebアプリケーションへの通信を検査し、攻撃とみられるものを遮断すること。

    誤り。これはWAFの役割です。Webアプリケーションを守る点は同じですが、 WAFはプログラムの外側に置く防御で、欠陥そのものは残ります。プログラムを 直すのか、手前で通信を止めるのかで区別します。

  4. エソースコードを読みにくい形に変換し、攻撃者に処理の内容を解析されにくくすること。

    誤り。これは難読化の説明です。解析に手間をかけさせることはできますが、 脆弱性がなくなるわけではなく、根気よく調べれば見つかります。隠すことと、 欠陥を作らないことは別物です。

理解を深めるために

穴を作らないように書くこと

セキュアプログラミングは、脆弱性を後から見つけてふさぐのではなく、 そもそも作り込まないようにプログラムを書くことです。建物でいえば、 完成後に防犯カメラを付けるのではなく、設計と施工の段階で鍵の掛からない窓を 作らないようにする考え方です。

なぜ開発の段階で防ぐのか

脆弱性の多くは、プログラムの書き方そのものから生まれます。

  • 入力値を文字列連結してSQL文を組み立てる → SQLインジェクション
  • 画面に出力する値をエスケープしない → クロスサイトスクリプティング
  • 確保した領域の大きさを確かめずに書き込む → バッファオーバーフロー

こうした書き方を避けるための規約を決め、レビューで確かめるのが セキュアプログラミングの実践です。IPAは「セキュア・プログラミング講座」や 「安全なウェブサイトの作り方」で、脆弱性ごとの書き方の注意点をまとめています。 リリース後に見つかった脆弱性は、修正・再テスト・再配布と手戻りが大きくなります。

混同しやすいものとの違い

用語 何をするか いつ
セキュアプログラミング 欠陥を作り込まないように書く 開発中
ペネトレーションテスト 疑似攻撃で侵入できるかを確かめる 完成後
WAF 攻撃とみられる通信を手前で遮断する 運用中
難読化 コードを読みにくくして解析を妨げる 配布前

検査や外側の防御は、セキュアプログラミングの代わりではなく、重ねて使うものです。 「欠陥を作らない」のか「欠陥を見つける・届かせない・隠す」のかで見分けます。

前の問題へ次の問題へ