web-dev-qa-db-ja.com

コード/スクリプト署名を強制する

VPSで実行するコードに署名するために使用できるX.509コード署名証明書とGPGキーペアの両方を持っています。時々、iOS、OS X、Windows用のコードを作成し、常にX.509証明書でバイナリに署名するようにしています。ただし、私がVPSで実行するすべてのもの(PHP/Djangoスクリプト、およびおそらくクライアントに送信するJavascript)にも署名されていることを確認したいと思います。

私のGPGキーペアを使用してディレクトリ内のすべてのファイルに署名するbashスクリプトを単に作成することもできますが、私の問題は、コードがnotである場合、追加のエラーが発生しないという事実ですそれは正しく署名されたので、明示的に承認されていない悪意のあるスクリプトの送信/実行からサーバーを保護するために、GPGキーペア(またはX.509証明書さえ)を使用する方法はありますか- [〜#〜] ensure [〜#〜]特定の、たとえば、ディレクトリ内のすべてのコードがalways実行前に有効な署名がチェックされますか?

作業でスパナをさらに投げるには、強制チェックの範囲外に配置された悪意のあるスクリプトが干渉できないような方法で、これをどのように効果的に「サンドボックス」にできるでしょうか?たとえば、ディレクトリにすべてのファイルに強制署名が必要であると「フラグが立てられている」場合、このディレクトリ外のファイルを使用してコード署名を回避し、アプリケーションまたはスクリプトを妨害することは可能ですか?

署名アルゴリズム、スクリプト、バイナリ、オペレーティングシステムにはあまり興味がありませんが、これを適用するアプリケーションでは、Python/DjangoまたはPHP Debian VPS(Webアプリケーション用)。

ただ面白い考えですが、適切な解決策があるかどうかは確かに追求したいと思います。アイデアや議論は大歓迎です!

8
TC Fox

PHPの場合、 ionCube PHPエンコーダー )のようなさまざまな暗号化エンジンがあります-これらの作業as PHPパーサーにフックし、実行されるコードを復号化し、署名を検証し、ライセンスファイルの制限(MACアドレス、ドメイン名、時間制限など)をチェックする拡張機能)。適切なキーで「暗号化」されていないコードをまったく実行できないように設定できるため、PHP作成者が暗号化したコードのみを実行できます。

残念ながら、これらは有料のクローズドソースソリューションであり、私が知る限り、GPGとの互換性はありません(そのため、独自のGPGキーを署名に使用することはできません)。ただし、アプリケーションビルドスクリプトなどに簡単に統合できます。

別のアプローチは、PHPアプリケーション全体を Phar アーカイブとしてパッケージ化することです。Pharはコード署名機能をサポートしています。 veは、 PharUtil と呼ばれる一連のスクリプトも作成しました。これは、署名されたコードを安全に配布するためにそれを使用します。これは、現在の使用例とは異なりますが、役立つ場合がありますはじめに。

Pythonおよび/またはJavascriptの同様の解決策は知りません。

3

この機能をサポートするには、インタープリターを拡張する必要があります。幸いにも、このコード歌唱機能はおそらくPHP hardened-php のような拡張機能を必要としません。実際にはもっと簡単な方法があります。

Php.iniを auto-prepend a php script に変更して、_$_SERVER['SCRIPT_FILENAME']_を読み取り、現在のスクリプトの署名を検証することができます。署名チェックが失敗した場合は、die();を呼び出すと、実行できなくなります。

これは非常にシンプルなソリューションです。ただし、これは、攻撃者が既存のコードの脆弱性を悪用して コード実行 を取得することを防ぎません。これには、eval()およびRFI/LFIの脆弱性が含まれますが、これらに限定されません。また、各インタープリターには独自のソリューションが必要です。たとえば、クライアント側のJavaScriptでは NoScript のようなブラウザ固有の拡張機能が必要です。 「無許可のJavaScript」は、より一般的にはXSSと呼ばれます。 XSSの優れたソリューションは コンテンツセキュリティポリシー です。これにより、ブラウザーがJavaScriptを実行できる場所を制御できます。この問題へのすべての答えに適したサイズはありません。

4
rook