発表・掲載日:2008/04/11

安全性を確保した実用的なC言語コンパイラを開発

-既存のC言語プログラムにメモリ操作の安全性を付与できる-

ポイント

  • 既存のC言語プログラムを書き換えずに、安全性を確保できる実用的な処理システムを開発。
  • 完全なメモリ安全性と日本工業規格(JIS)への完全な互換性を両立。
  • インターネット上でオープンソース・ソフトウェアとして配布開始。

概要

 独立行政法人 産業技術総合研究所【理事長 吉川 弘之】(以下「産総研」という)情報セキュリティ研究センター【研究センター長 今井 秀樹】ソフトウェアセキュリティ研究チーム【研究チーム長 柴山 悦哉】の 大岩 寛 研究員は、日本工業規格(JIS)や、米国規格協会のANSI C規格互換でメモリ安全性を確保するC言語コンパイラFail-Safe C - release 1」を開発した。インターネット上で用いられるサーバーソフトウェアなどのセキュリティ脆弱性の防止に利用できる。今回、産総研情報セキュリティ研究センターは「Fail-Safe C - release 1」をウェブサイト上で一般に公開する(https://www.rcis.aist.go.jp/project/FailSafeC-ja.html)。

 このコンパイラはC言語で書かれた既存のプログラムをそのまま処理し、プログラム中のメモリ操作の正しさを常に保証しながら動作させることが可能である。そのため、通常のコンパイラの代わりに、このコンパイラを用いてC言語で書かれたプログラムを処理すると、不正コードを含むコンピューターウイルス等によりプログラムが攻撃された場合でも、通常のコンパイラで処理されたプログラムのように実行が汚染されることや不正コードに乗っ取られたりすることを防止し、プログラムを安全に停止させることができ、システム全体の安全性が大きく向上する。

 今回公開する「Fail-Safe C - release 1」は、Linuxオペレーティングシステム上で動作し、日本工業規格(JIS)または米国規格協会のANSI規格に準拠したC言語プログラムを基本的にすべて動作させることができる。これまで完全なメモリ安全性とANSI規格への完全準拠を両立したものはなく、これを実現したことが本コンパイラの特長である。

システム概念図画像
システム概念図

開発の社会的背景

 C言語は1972年に米国AT&Tベル研究所にて開発されたシステム記述用のプログラミング言語で、現在でもプログラム開発言語として頻繁に用いられている。特に、Webサーバーやメールサーバー等のシステム系ソフトウェアのプログラミングでは、今も圧倒的な利用シェアを維持している。C言語が設計された当時のコンピューターシステムは低速かつ低容量で、C言語もそのようなシステムに合わせて軽量で柔軟な言語として設計された。特に、通常機械語を直接用いなければ記述できない低水準のメモリ操作の記述が高水準言語だけで可能となる設計は、C言語の大きな特長となっている。しかし、言語の設計から35年以上が経過し、必ずしも現在の要求に適合しているとはいえなくなってきている。特に、低水準のメモリ操作が可能である特徴は、セキュリティ脆弱性の原因となるバグ(ソフトウェアの誤り)を引き起こす大きな要因となってきている。

 一方、プログラムに誤りがあっても著しい不正な動作を引き起こさないメモリ安全なプログラミング言語の研究は、この35年間で大幅に進展した。現在では、メモリ安全性を備え、一般プログラマーの実用に耐えうる言語が、いくつか利用可能になっている。しかしながら、既存のC言語プログラムからの移植コストやプログラマーの教育コストなどさまざまな問題から、特にサーバープログラミング等の分野ではこれら安全な言語がC言語を置き換えるに至っていない。依然として脆弱性を潜めたC言語プログラムが大量に流通していることから、C言語プログラムを変更せずに安全性を確保できる技術の開発が望まれている。

研究の経緯

 以上のような背景から、産総研では、具体的なサーバープログラムに従来の基礎技術を適用して、実際の計算機システムの安全性に役立てるための研究を2005年より開始した。本研究は、2005年12月から2008年3月まで行われた経済産業省委託研究「新世代情報セキュリティ研究開発プロジェクト」のテーマ「情報漏えいに堅牢なデータ管理方式及びそのソフトウェアによる安全な実装・検証方法」の一部として採択され、実用的な実装の構築に取り組んできた。なお、本プログラム開発の一部は、株式会社レピダムと共同で行なったものである。また、2007年10月より研究者向けに試用実装を開示して、複数の研究者から有用な意見を頂いた。その一部は今回公開するコンパイラに反映させた。

研究の内容

 この開発ではC言語プログラム自体は変更せずに、コンパイラなど言語処理系を根本的に改良することで安全性を確保する手法を提案し、安全であり、実用可能なC言語の処理系である「Fail-Safe C」を作成した。この処理系はANSI、 ISO、 JIS(JIS X3010:1993)の各規格に定められたC言語のメモリ操作に関する仕様を完全に満たしながら、メモリ操作に関する安全性を理論的に完全な形で保証している。そのため、既存のC言語プログラムをプログラマーの手作業により他の安全な言語に書き換えて(移植して)得られるプログラムと同等のメモリ安全性を、C言語プログラム自体をいじることなく、単にこのコンパイラを通すだけで実現できる。これにより、ウイルスなどの不正データを受信した際にも、少なくとも実行状態の乗っ取りとそれによる不正機械語コードのメモリへの導入を完全に防止することができる。

 このような機能を実現するため、「Fail-Safe C」では、既存の安全な言語の技術を取り入れつつ、C言語に特有の柔軟なメモリ操作機能を使ったプログラムを動作させるための枠組みを構築した。特に、ポインタ演算キャスト操作の2つの機能を実現するために、仮想アドレス演算などのさまざまな新しい機構を考案し導入した。また、単純にC言語仕様への準拠と完全なメモリ安全性を両立させようとすると、プログラムの実行速度が非常に遅くなってしまい実用に耐えなくなるため、実行時キャスト解析など、さまざまな最適化を導入することで、実行速度の低下を可能な限り抑えている。

 今回公開するC言語コンパイラシステム「Fail-Safe C - release 1」は、C言語規格のほぼすべての機能と500以上の安全な標準関数を備え、Linuxオペレーティングシステム上でOpenSSL、 OpenSSH、 BIND9 などの既存のサーバーソフトウェアをメモリ操作の安全性を保証しつつ動作させることができる。「Fail-Safe C - release 1」のソースコードはオープンソース・ソフトウェアとして公開され、産総研情報セキュリティ研究センターのウェブサイトのプロジェクトページ
 https://www.rcis.aist.go.jp/project/FailSafeC-ja.html
からQ・パブリック・ライセンス(QPL)を基にした配布条件で入手できる。同ウェブサイトでは、上記の既存ソフトウェアを「Fail-Safe C」で処理するための手順についても公開する。

今後の予定

 産総研情報セキュリティ研究センターでは今後もこの研究開発を継続し、「Fail-Safe Cコンパイラシステム」のさらなる利便性の向上や機能の強化などに取り組んでゆく。公開したソフトウェアについては継続してメンテナンスを行ってゆくと共に、その応用や普及についても積極的に取り組んで行く。また、このコンパイラ技術をベースに、より高度なセキュリティ機能を実現する方法についても、基礎的な研究を進めてゆく。



用語の説明

◆メモリ安全性
計算機ソフトウェアの安全性のうち最も基本的な性質の1つ。プログラム動作中にメモリ上に格納されている特定のデータの変更が、不当にほかのデータやプログラム等へ影響を及ぼさないこと。[参照元へ戻る]
◆コンパイラ
人間が読み書きできるように計算機プログラミング言語で記述されたプログラムを、計算機が実際に解釈・実行できる「機械語」に翻訳するソフトウェア。[参照元へ戻る]
◆セキュリティ脆弱(ぜいじゃく)性
計算機プログラムを作成する際の誤り(バグ)により引き起こされる誤動作等の問題のうち、特に情報漏えいや計算機の乗っ取りなどセキュリティ上の問題となる事象のこと。[参照元へ戻る]
Linux オペレーティングシステム
Linus Torvaldsにより開発されたLinuxカーネルを含むソフトウェアで構成された基本ソフトウェア。Linuxカーネルを含むソフトウェアの多くは一定の条件の下で無償で入手でき、再配布することができる。[参照元へ戻る]
◆低水準・高水準(言語・記述)
低水準とは、機械語、あるいは機械語の命令を1つ1つ記述するアセンブリ言語など、機械の動作を直接的に記述するプログラミング言語、プログラミング手法などを形容する。一方、高水準とは、例えば「ある条件で繰り返し」とだけ記述するだけで自動的に比較・分岐など必要な低水準処理が行われるなど、より論理的な記述で動作を記述するプログラミング言語、プログラミング手法などを形容する。[参照元へ戻る]
◆ポインタ演算
C言語および機械語に特有な操作で、あるデータが格納された計算機のメモリ上の位置を表す「番地(アドレス)」の値(ポインタ値と呼ぶ)に対し、加減算などの数値演算を行って「隣に格納されたデータの番地」などを計算する演算操作。[参照元へ戻る]
◆キャスト操作
C言語および機械語に特有な操作で、ある特定の種類のデータが格納されているアドレスを指すポインタを、無理やり別の種類のデータを指すポインタとみなして利用するための操作。これにより、ある種類のデータを強制的に別の種類のデータとして扱うことができる。[参照元へ戻る]
◆オープンソース・ソフトウェア
一般に市販されている多くのソフトウェア・プログラムと異なり、そのプログラムのソースコード(まだコンパイラにより処理されていないプログラミング言語による記述)が公開され、一定の条件下で再配布や改変が可能となる条件で配布されているソフトウェア。一般的には、Open Source Initiative(OSI)という非営利団体が定義したいくつかの条件を満たす配布条件で配布されているソフトウェアを指す。[参照元へ戻る]
◆Q・パブリック・ライセンス(QPL)
Open Source Initiativeによるオープンソース・ライセンスの定義を満たすソフトウェア利用許諾(ライセンス)条項の1つ。元々はTrolltech社が自社のソフトウェアの配布のために定めた条項だが、それ以外にもObjective Camlなどいくつかのソフトウェアで採用されている。[参照元へ戻る]



お問い合わせ

お問い合わせフォーム