アーカイブ

第1章 1.C/C++がもたらす問題

公開日:2007年9月26日

独立行政法人情報処理推進機構
セキュリティセンター

本ページの情報は2007年9月時点のものです。
記載の資料は資料公開当時のもので、現在は公開されていないものも含みます。

言語を選ぼう

C言語およびC++言語は、不用意に用いるとソフトウェアにセキュリティ脆弱性を生みやすいプログラミング言語である。

読者のあなたがいま新しいソフトウェア構築プロジェクトを始めるところであり、選択の余地があるのであれば、C言語やC++言語以外の、セキュリティの観点からの考慮すべき事項が少ないプログラミング言語(例:Java等)の使用を十分に考慮することをお奨めする。

C/C++は脆弱性を生みやすい

C言語やC++言語はその汎用性・移植性の高さから、オープンソースソフトウェアや多くの 製品ソフトウェアの記述に用いられている。コンパイラの入手が容易であること、作られる実行可能ファイルがコンパクトであることも、多くの場面で採用される要因となっている。

その一方で、C言語/C++言語にはコンピュータを乗っ取るに至るようなセキュリティ脆弱性を生みやすいという特性がある。代表的な脆弱性として、バッファオーバーフロー脆弱性、フォーマット文字列脆弱性、整数オーバーフロー脆弱性等が挙げられる。

  • 図1-1: C/C++のご利用の注意
    図1-1: C/C++

C言語の成り立ちと特性

C言語は、当時生まれて間もないUnixを高い移植性をもつOSに書き直す目的で1972年ベル研究所で開発され、その後何年かかかってUnixの書き直しが行われた。

OSを記述するための言語であったC言語は次のような特徴をもつ。

  • コンパイルされ、プロセッサのネイティブコードで実行される
  • ひとつひとつのステートメントは軽量なマシンコードにコンパイルされる
  • アセンブラ言語のように、メモリ内容への柔軟なアクセスが可能である
  • 構造化プログラミングが行える

C言語はUnixとともに普及し、その汎用性と軽量さゆえに他の多くのOSにも移植されて現在に至っている。

一部改良が施されてANSI規格、ISO/IEC規格にもなったが、その本質は変わっていない。

軽量であるがゆえに、C言語には安全機構が欠けている。例えば、次のような問題を言語処理系が未然に防いでくれない。

  • データの転記の際の領域あふれ
  • ポインタによる誤った領域へのアクセス
  • データへのポインタと関数へのポインタの混同

これらの問題を防ぐための安全ロジックを組み込むことは、本来、プログラマの役目であるが、それはしばしば忘れられてしまう。

C++言語

C++言語はC言語が普及したのち、1980年代に再びベル研究所で作られた言語である。コンピュータシミュレーション記述言語から発展したSimula 67がもつ「クラス」の概念に基づくプログラミングをC言語ベースで行えるよう、いわばC言語の拡張機能として考案された。

C++はC言語の要素をほぼそのまま引継ぎ、新しい構文や機能を追加した形になっている。高度なオブジェクト指向プログラミングが可能である一方で、純粋なC言語のスタイルのプログラミングも行える。

このことはC++言語でもC言語と同様、安全なロジックに欠けたプログラムがしばしば書かれ得ることを意味している。