2010年以降、OWASP(オープンウェブアプリケーションセキュリティプロジェクト)トップ10リストは、 コードインジェクションをWebアプリケーションの最も重要なセキュリティリスクとして定義しました。 8年後の今日、このことを認識していたにもかかわらず、リスクを軽減するための有効な対策がほとんどありません。 Webアプリケーションには容易に検出できる共通のセキュリティ脆弱性が存在し、そのリスクは重大で、回避するためのコストは膨大です。

なぜ、Webアプリケーションで深刻な既知のセキュリティリスクが長い間放置されたのでしょうか? その理由の一つとして、 2010年以来のIT分野での急激な成長と進歩が挙げられます。クラウドコンピューティングの誕生、スマートホームデバイスの開発、そして人工知能と機械学習への関心の高まり。 私たちは今後ますます多くのデータを収集・保存し、より多くのコネクティッドデバイスを開発するでしょう。しかし、その中核となる最も重要な技術の既知の脆弱性は放置されています。 現在多くのWebアプリケーションはその脆弱性の上に構築されています。一歩踏み込んで土台を守りましょう。そのためのソリューションを私たちは提供します。

Polyscriptingはインジェクション攻撃を最も重要なセキュリティリスクと捉え、排除することを目指します。 それは「安全な」テクニックのリストに従い、細心注意を払ったコードやホワイトリストを書くのではなく、インジェクション攻撃の根本的な要素を対策します。

そう、不可能なのです。

基本的に、悪意のあるアクターが脆弱性をみつけると、プログラムに自由に命令を送り、インジェクション攻撃を始めることができます。 これにより、サーバにマルウェアをインストールしたり、データを不正に取得したりすることができます。 しかし、ハッカーがWebアプリケーションの欠陥をうまく利用するには、命令を実行するためのプログラミング言語を知っている必要があります。 つまり、使用する言語がわからないとハッカーはプログラムと対話することはできないのです。 Polyscriptingは、プログラミングの最も基本的な側面であるMoving Target Defense(目くらまし防御)戦略を適用します。

脆弱なサーバ側の言語(例えばphp)を取得し、インタプリタのソースコードとプログラムファイルをスクランブルすることにより、 Polyscriptingはその言語の一意のインスタンスを生成します。 これはPHPのように振る舞い、動作する言語ですが、実際は全く異なるものです。 独自のインタプリタとPHPコードをPolyscriptingコードに変換する方法により、あなたのプログラムは事実上全く別の言語を使用していることになります。

Polyscriptingの特徴は不可逆的であるということです。一度PHPがスクランブルされ、ファイルが変換されると、それらを戻すことはできません。 それらを元に戻すためのキーやマジック値は存在しません。しかし、Polyscripting言語は同じルールに従い、元の言語と同じパターンを維持します。 その特定のPolyscripted-phpインスタンス用にランダム化されたユニークな単語やパターンを使用して、そのプログラムは実行されます。

標準のPHPでコードを記述してテストをすることはできますが、実際にはスクランブルされたインタプリタと変換されたファイルを使ってのコード実行となります。 したがって、悪意のあるアクターが "echo exec( 'whoami');"を実行しようとすると、言語は "echo"または "exec"を有効な呼び出しとして認識せず、エラーを返します。 これは、Moving Target Defense戦略をサイバーセキュリティに採用することの強力で有意義な例です。

ここでは、簡単な「hello world」プログラムを使ってPolyscripted-phpの例を紹介します。

root:/pwd# cat hello.php
echo "Hello, ";
echo "Small World.\n";
?>
root:/pwd# php hello.php
Parse error: syntax error, unexpected '"Hello "' (T_CONSTANT_ENCAPSED_STRING) in /pwd/ hello.php on line 2
root:/pwd# cat scrambled.php
arFktyO "Hello, ";
arFktyO "Small World.\n";
?>
root:/pwd/php-src# php scrambled.php
Hello, Small World.
root:/pwd/#

インタプリタはコマンド "echo"を理解しなくても、"arFktyO"(ランダムに生成された文字列)を受け取り、以前に定義された関数 "echo"と同じ機能を実行します。 この例のphpのキーワードはスクランブルされ変更されていますが、 さらに一歩考えを進めて、AST(抽象構文木)も同様にスクランブルします。 これにより、オリジナルの言語と同等の機能を維持しながら、言語の文法を変更することができます。 さらにこの考えはPolyscriptingの美しさに磨きを加えます。実行中の構文エラーは、不正なコードの実行と悪意のあるアクターの検出フラグに使用できます。

phpを使った簡単なテストケース:

Polyscripting-phpリポジトリをクローン:
https://github.com/polyverse/polyscripted-php

gitディレクトリーから以下を実行します:

docker build -t polyscripting .
docker run ? rm -it polyscripting bash

Dockerコンテナ内に、標準phpをビルドし、それをスクランブルします。約10分程度かかります。

./build-php.sh
./build-scrambled.sh ?t

注: -tオプションは最初標準phpをコピーします。Testディレクトリー内のphpファイルは全て独自ファイルとなります。〔ファイル名〕_php phpがスクランブルされた後、どれかテストプログラムを実行してみてください。

/polyscripting-php/bin/php tests/smallWorld.php

これらのプログラムはPolyscripted版に変換されているので実行されないことが分かるでしょう。実行する前に以下をやらなければなりません。

./transformer ?f tests/smallWorld.php

こうすることでプリフィックス付きphpファイルに修正されます。変換されたファイルを実行するには以下の通りです。

/polyscripting-php/bin/php tests/ps-smallWorld.php

少しでも興味を持って頂けたら、gitリポジトリのps-PlaygroundReadMeを一読ください。 tests / evalExploitディレクトリには、コードインジェクションされやすい「ユーザ入力に対してeval()を実行する」という処理が記述されたPHPファイルがあり、 Polyscriptingの機能を体験できます。

Polyscriptingは、インジェクション攻撃に対する防御の最も強力なツールとなる可能性があります。 我たちはプログラミング言語に期待することの中で新しい標準を作り出しています。 インジェクション攻撃によく利用されている言語(SQL、JavaScript、Python)などにPolyscriptingを適用することで、 10年以上にわたって放置されてきた脆弱性を上手く解決することができます。

私たちは日々インターネットを使っています。そろそろ対策を見直す時期ではないでしょうか?

元記事はこちら

PolyscriptingについてのホワイトペーパーのDLはこちら