セキュリティガイド

このセキュリティガイドでは、GraalVMの上にセキュアなアプリケーションを構築しようとする開発者や組み込み開発者向けに、GraalVMのセキュリティモデルと機能に関する情報を提供します。読者はGraalVMのアーキテクチャに精通していることを前提としています。このガイドは、Java SEのセキュアコーディングガイドラインなど、Javaのセキュリティドキュメントを置き換えるものではなく、GraalVMに固有の側面を補足するものです。

セキュリティモデル #

GraalVMは共有ランタイムです。入力として高レベルプログラミング言語(またはその中間表現)の命令を受け取り、後で実行します。GraalVMによって実行されるコードで、アプリケーションのセキュリティ制御(アクセス制御など)を実装する開発者は、命令が正しく実行されることを信頼できます。GraalVM上で実行されているセキュリティ上重要なコードの誤った実行により、そのようなセキュリティ制御を回避できる場合は、セキュリティの脆弱性として見なされます。

デバッグ機能は、アプリケーションへの特権アクセスを提供し、その状態と動作を検査および変更できるため、信頼された環境でのみ使用する必要があります。また、デバッグクライアントが接続できるようにネットワークソケットを開く場合があります。

GraalVMの実験的な機能は、本番環境での使用を目的としておらず、セキュリティガイドでカバーされていないセキュリティ上の制限がある場合があります。

GraalVMを使用すると、適切に構成されたポリグロット実行コンテキストで信頼できないコードを実行できます(「サンドボックス化」を参照)。

セキュリティモデルを破るバグのレポートは、脆弱性レポートガイドに概説されているプロセスを通じて受け付けています。

Graal言語 #

GraalVMリリースで一般的に利用可能なすべての言語ランタイムは、たとえばインタラクティブシェルなどのランチャーを提供します。これらのランチャーは同じように動作し、「オリジナル」の対応物と同じセキュリティ保証が付属しています。

サンドボックス化 #

サンドボックス化は、Polyglot APIを通じて、特権を持つホストコードと特権を持たないゲストコードの間にセキュリティ境界を確立できます。詳細については、「サンドボックス化ドキュメント」を参照してください。

ScriptEngineの互換性 #

下位互換性のために、特定のPolyglot言語はJava Scripting APIもサポートしています。たとえば、これにより、GraalVM JavaScriptランタイムをNashornのドロップイン置換として使用できます。ただし、互換性を維持するために、Nashorn GraalVM JavaScript ScriptEngineインターフェイスは、スクリプトにすべての権限が付与されたコンテキストを作成します。信頼できるコードでのみ、細心の注意を払って使用する必要があります。

ネイティブコードの管理された実行 #

Polyglot埋め込みは、LLVM中間表現(IR)ゲストコードもサポートしています。特にC/C++を含むいくつかのネイティブシステムプログラミング言語は、LLVMコンパイラツールチェーンを使用してLLVM IRにコンパイルできます。通常、これらの言語は、管理された実行を使用しない限りメモリセーフではなく、メモリ安全性違反がセキュリティ脆弱性の頻繁な原因であることを覚えておく必要があります。

管理モードでは、オペレーティングシステムを含む管理されていないコードへのすべてのアクセスは、言語ランタイムによって仲介されます。特にこれは、

  • 時間的および空間的なメモリ安全性に関して、メモリはJavaヒープから割り当てられます。つまり、メモリ割り当ては管理対象オブジェクトであり、すべてのアクセスはメモリセーフな方法で実行されます(任意のポインタ演算や、チェックされていない範囲外アクセスはありません)。
  • 型安全性に関して、データポインタを関数ポインタに再解釈して、任意の命令を実行することはできません(これらはLLVMランタイムにとって異なるポインタ型であるため)。
  • システムコールはインターセプトされ、対応するTruffle APIにルーティングされます。たとえば、ファイルIOはTruffle FileSystem APIにマップされます。現在サポートされているシステムコールのセットは非常に限られています。Truffle APIレベルに安全にマップできるシステムコールのみが利用可能です。管理モードのLLVMランタイムは常にLinux/x86用にコンパイルされたビットコードを実行するため、このプラットフォームのシステムコールのみを実装する必要があります。
  • すべての依存ライブラリも管理モードで実行され、ネイティブに実行されるシステムライブラリへのすべての参照が削除されます。これには、muslibcなど、LLVMランタイムによって提供されるライブラリが含まれます。

管理モードは、コンテキスト(Context.create())を作成するとき、または--llvm.managedオプションを指定してbin/lliバイナリを呼び出すときに選択できます。「管理された」コンテキストは、コンテキストの作成中に渡された制限(たとえば、allowIO)に従い、allowNativeAccess権限は必要ありません。

ネイティブイメージ #

GraalVMネイティブイメージでは、アプリケーションの状態は起動後にキャプチャされ、到達可能なすべてのコードは事前にコンパイルされ、ネイティブ実行可能ファイルとしてバンドルされます。詳細については、「ネイティブイメージセキュリティガイド」を参照してください。

セキュリティマネージャ #

セキュリティマネージャはJEP-411で非推奨になりました。GraalVMはJavaでの信頼できないコードの実行をサポートしていません。

GraalVM Community Editionのダウングレード #

サンドボックス化はGraalVM Community Editionでは利用できません。ネイティブコードの管理された実行は、GraalVM Community Editionでは利用できません。

GraalVM Community Editionにダウングレードすると、ネイティブコードの実行はallowNativeAccess権限でのみ可能になります。これは、PythonやRubyなど、ネイティブコード拡張を許可するTruffleで実装された言語にも当てはまります。

お問い合わせ