日本電信電話(以下、NTT)と早稲田大学は10月28日、情報漏洩やサービス停止の原因となり得るインジェクション攻撃による被害を防ぐため、ソフトウェアを構成するプログラム中の文字列関数を用いた文字列操作の誤り(バグ)を修正する技術を実現したことを発表した。

  • 文字列関数に対する処理の例

    文字列関数に対する処理の例

研究背景

ソフトウェアの脆弱性を悪用した攻撃は重大な脅威となるが、その代表例にインジェクション攻撃が挙げられる。インジェクション攻撃はサーバなどへの攻撃手法の一つで、サーバで利用しているデータベースに対して不正な入力情報を送信して、予期しない動作を引き起こすというもの。この攻撃をもたらす欠陥はインジェクション脆弱性と呼ばれ、プログラム中の文字列操作の誤り(バグ)が主な原因であることが知られている。

ソフトウェアを構成するプログラム中で文字列操作を記述する際には文字列関数が利用される。文字列関数は多くのプログラミング言語で提供されており、文字列の抽出や置換検索などを記述するために頻繁に利用される。しかし文字列関数を利用して文字列操作を行う際には正規表現やその他の入力情報、文字列関数自体の仕様に関する専門的な知識が要求され、適切な記述は高度な知識が必要とされる。

文字列操作を伴うプログラムはさまざまなソフトウェアで幅広く利用されるが、文字列操作に誤りがあるとサービスの誤動作を引き起こし、情報漏洩やサービス停止の原因となる場合もある。しかし、サービスの運用段階におけるソフトウェアの誤りの修正には多大なコストがかかる。この誤動作を意図的に起こそうとするサイバー攻撃も顕在化しており、安全なサービスの実現を脅かすリスク要因となっている。

研究の成果

NTTと早稲田大学は共同で、プログラム中で文字列を扱う操作により発生し得る脆弱性や誤りを自動修正する技術について研究してきた。しかし、その対象は正規表現に限定されていた。

今回の研究成果では、プログラム中の文字列関数を使った文字列操作の誤りをソフトウェア開発者が与える入出力例を基に修正する技術を実現。正規表現を含む文字列操作にまで修正対象を広げることを可能としている。

技術のポイント

両者が今回発表したのは、インジェクション攻撃の主要な原因であるプログラム中の文字列操作の誤りをソフトウェア開発者が与える入出力例を基に修正し、修正結果に誤りがないことを保証する技術。

従来のように入出力のみを提示する例を用いた場合と比べて、ソフトウェア開発者が文字列関数に期待する入出力例を、入力と出力だけでなく入力のどの部分をどのように変換したいのかも含めて表記できるようになり、適切な修正結果の出力に寄与するという。この表記はプログラムが満たすべき入出力の例を基にプログラムを生成する「Programming by Examples (PBE)」メソッドを用いて与える。

この定義を用いることで、修正対象の文字列関数に与えるパラメータとして、すべての入出力例を満たすための条件を導き出せるようになる。この技術では、Webアプリケーションなどで広く利用されているECMAScript 2023に準拠した文字列関数の振る舞いを厳密に定義した。

加えて、修正結果のパラメータとなり得る候補を、明らかに入出力例を満たさないものを除外しつつ網羅的に探索する手法を考案。この手法では、現実的な時間内に修正処理を終えることが可能になるとのことだ。また、修正結果が修正前のパラメータに対して最小限の変更となる修正が可能となり、ソフトウェア開発者が目視で容易に修正結果を確認できる。