JavaScriptのランタイムであるDenoは、コードが外部世界にアクセスする際に明示的な権限を必要とすることで、自らを「デフォルトで安全」と宣伝しています。しかし、技術的な批評によれば、このモデルは根本的に不安全です。なぜなら、OSレベルでプロセスを隔離するのではなく、標準ライブラリの呼び出しをフィルタリングすることでシステムレベルのセキュリティを模倣しているだけだからです。

この画像は、Denoのセキュリティモデルを批判するために使用された特定のコードレベルの分析に対する視覚的な参照を提供します。

この画像は、セキュリティ批評のさらなる技術的詳細を示すことで、最初の画像を補完します。
ターミナルプロンプトの脆弱性
Denoの権限システムは、実行時にユーザーに権限を求めるためのインタラクティブなプロンプトをターミナルに表示します。これらのプロンプトはプレーンテキストとしてstdoutに送信され、stdinから入力を受け取るため、実行されている可能性のある悪意のあるコードと同じ通信チャネルを共有しています。
攻撃者はターミナルの色を操作したり、非標準のエスケープコードを使用したりして、これらのプロンプトを隠したり偽装したりすることができます。これにより、プロンプトが表示される前にコードによってターミナルの状態が変更され、ユーザーが気づかないうちにリクエストへの承認を与えてしまう状況が生じます。
「Denoのプロセスは実際にはサンドボックス化されておらず、そう見せかけているだけである。」
— I’m not a fan of Deno’s security model | max’s place
環境変数によるサンドボックス脱出
'--allow-run' フラグは、'uname'のような特定のコマンドを実行させることを目的としています。しかし、プログラムは固有のパスではなく名前で識別されるため、攻撃者はPATH環境変数を変更して、同じ名前を持つ悪意のあるバイナリを指すようにすることができます。
さらに、PATHが保護されている場合でも、ほとんどの実行ファイルはLD_PRELOADのような環境変数に影響を受ける動的ローダーを使用します。ロードプロセスに悪意のあるライブラリを注入することで、攻撃者はロード時に任意のコードを実行でき、事実上Denoの権限チェックをバイパスできます。
擬似サンドボックス vs 真の隔離
特定された核心的な問題は、Denoが真のサンドボックスではなく、自身の標準ライブラリAPIをフィルタリングするランタイムであるということです。このアプローチは、プログラムがDeno固有のライブラリ以外の手段を通じてオペレーティングシステムと相互作用した瞬間に崩壊します。
Denoのモデルは「単純な」悪意のあるコードからは保護するかもしれませんが、高リスクな信頼できない実行に対しては偽りの安心感を与えるだけです。著者は、唯一の堅牢な解決策は、許可された標準ライブラリの呼び出しリストを管理しようとするのではなく、プロセスを完全に隔離するために適切なOSレベルのサンドボックスを使用することであると結論付けています。