Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

Androidアプリ開発者なら押さえておきたい
Javaセキュアコーディングの意味と効果

Javaセキュアコーディング入門(1)

  • LINEで送る
  • このエントリーをはてなブックマークに追加

 本連載では、セキュアコーディングスタンダード「CERT Oracle Secure Coding Standard for Java」の内容をベースに、Android特有の情報を交えつつ、堅牢なプログラムを開発するためのノウハウを具体的な事例とともに紹介していきます。第1回では、セキュアコーディングの意味と、その効果について解説します。

はじめに

 昨年、C/C++に関してセキュアコーディングの連載があったことを御存じの方もいるかもしれません。今回始まる「Javaセキュアコーディング入門」は、Javaのプログラミングにおいて、入力値検査、引数の安全な渡し方、例外処理、整数演算といったソフトウェアの脆弱性に直結する問題に対して、コーディング上の注意点や脆弱性を作り込まない作法を解説するものです。具体的には、演算処理、文字列処理、ファイル操作などトピックごとに、よりセキュアなコーディングスタイルを「コーディングスタンダード」として示すことで、落とし穴のないプログラミングを効率よく行うことを目指します。

 このセキュアコーディングの考え方は、米国カーネギーメロン大学のSEI(Software Engineering Institute)が運営するCERTが中心となって提唱し、多数のコーディングルールや推奨コードを公開しています。昨年の連載は、CERTが公開するセキュアコーディングスタンダードのいくつかを紹介しながら、実際のプログラミングへの適用例などを解説したものです。

 CERTは、C/C++言語に続いて Java版(CERT Oracle Secure Coding Standard for Java)のセキュアコーディングスタンダードを公開しました。JPCERT/CCは、C言語版に引き続き、このドキュメントの作成と日本語版の翻訳作業に関わり、11月7日に日本語版の公開を開始し、ひきつづき改善を行っています。

 前置きが長くなりましたが、この連載では、CERT Oracle Secure Coding Standard for Javaの内容をベースに、Javaセキュアコーディングの解説を行っていきたいと思います。

なぜセキュアコーディングなのか

 企業によっては、開発ツールやライブラリの指定があり、コーディングスタイルやルールが細かく決められていたり、詳細なテスト項目やクライテリアを設定されていると思います。そのような制約の中で、さらにセキュリティを意識したルールの導入に負担を感じる人もいるかもしれません。

 いまさらいうまでもないかもしれませんが、バッファオーバーフローを起こす可能性のあるコード、権限昇格を認めてしまうコード、処理系依存で予期せぬ動作をするコード、といった脆弱性を含むプログラムが元で、実際の被害が発生した場合を考えてみてください。会社が受けるダメージ、損害賠償やシステムの改修費用、修正パッチのリリースを含む社内外への対応など、開発者としても考えたくない手間や負荷が発生します。

 コーディング時の配慮や習慣として、セキュアコーディングという考え方を実践することで、これらの問題を回避できる可能性が高まります。実際、この連載で対象としているCERTのセキュアコーディングのルールは、どれも実際のプログラムで実績があり、対応方法が具体的なものばかりです。ベストプラクティスとして洗練されたものを標準化していますので、ほとんどのルールにそのまま従うだけで、セキュアなプログラムにすることができます。

C/C++とJavaの違い

 「プログラマを信頼する」―Cの言語仕様書には、Cの基本思想を象徴するこの言葉が書かれています。ポインタの直接操作、配列や文字列の終端チェック、符号付き整数のオーバーフローチェック。これらをプログラマ自身が行える(行わなくてはならない)のは、プログラマがその意味を正しく理解しているはずであり、書かれたコードはプログラマが「意図して」書いたからに違いない(たとえそのコードがセキュリティ上の脆弱性につながるとしても)、という思想です。処理系(コンパイラ)はこの思想に基づいて、比較的高速な実行コードを作成します。

 それに対して、Javaの思想は、「プログラマを守る」であると言えるでしょう。配列や文字列の終端は自動的にチェックされ(問題があれば例外がスローされ)、ナルポインタ参照はトラップされます。Cでは当たり前のように行われる暗黙的型変換は基本的にはNGで、明示的なキャストが求められます。ポインタの直接操作はネイティブコードを書かない限り不可能です。Javaはそもそもの言語設計でセキュリティが考慮されており、java.lang.SecurityManager クラスを使ってセキュリティポリシーを定義すれば、例えばファイル単位のアクセス制御を実装することも可能です。これらの違いが、C/C++と比べるとJavaが比較的セキュアなプログラミング言語であると思われているゆえんでしょう。

 しかしJavaプログラムのセキュリティを破ることは可能です。実際の攻撃事例や脆弱性の発見情報は後を絶ちません。次回以降の連載ではどのようなケースでJavaのプログラムが攻撃されうるのか見ていきます。

Android開発への対応

 スマートフォンやタブレットなどのAndroid端末は、その利用スタイルや特性から、現在もっとも攻撃者のターゲットにされやすく、その矢面に立たされている存在です。個人情報が保存され、会社のイントラネットやクラウドサービスの接続端末にも利用されるこれらのデバイスが攻撃された場合、深刻な被害も想定されます。その原因が自分(自社)が開発したアプリになるのはぜひとも避けたいでしょう。

 この連載では、Androidプログラマにも役立つ情報を提供したいと思っています。

 CERT Oracle Secure Coding Standard for Javaは、Javaプログラム一般に適用可能なコーディングルールを意図しており、特定の開発環境やフレームワークのみに関するルールは含まれていません。Androidアプリケーション開発の観点からは、ルールによって、Android開発にも直接適用できるもの、なんらかの形で適用できるもの、関係しないものといった違いが出てきます。Android開発にも適用できるルールを紹介するときは、必要な情報を加えて解説する予定です。

 また、連載の中では、個々のスタンダードルールに直接対応した解説だけでなく、Android開発に特化したコーディング時の注意点などを紹介する記事もいくつか執筆する予定でいます。

 さて、連載の第1回は、Javaのセキュアコーディングについての紹介と、その意味や効果について紹介しました。次回以降で、具体的なルールを取り上げながら、セキュアコーディングの詳細を説明していきます。御期待ください。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

バックナンバー

連載:Javaセキュアコーディング入門

もっと読む

All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5