独立行政法人 産業技術総合研究所【理事長 吉川 弘之】(以下「産総研」という)情報セキュリティ研究センター【研究センター長 今井 秀樹】ソフトウェアセキュリティ研究チーム【研究チーム長 柴山 悦哉】の 大岩 寛 研究員は、日本工業規格(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コンパイラシステム」のさらなる利便性の向上や機能の強化などに取り組んでゆく。公開したソフトウェアについては継続してメンテナンスを行ってゆくと共に、その応用や普及についても積極的に取り組んで行く。また、このコンパイラ技術をベースに、より高度なセキュリティ機能を実現する方法についても、基礎的な研究を進めてゆく。