https://nodejs.org/docs/latest-v26.x/api/vm.html#vm-executing-javascript
The
node:vmmodule is not a security mechanism. Do not use it to run untrusted code.
自分はそうは思いません
初心者向けヒント1: 問題概要
- 配布された
jail.jsを読むと、入力した JavaScript コードがnode:vmのrunInNewContextで実行されていることがわかります。 runInNewContextは、おおまかにrunInNewContext(code, contextObject, options)の形で使います。第1引数は実行するコード、第2引数はそのコードから見えるグローバルオブジェクト、第3引数は実行時のオプションです。- この問題では
runInNewContext(code.toString(), {}, { timeout: 1000 })が実行されています。つまり、入力したコードは新しいコンテキストで実行され、グローバルオブジェクトとして空の{}が渡されています。timeout: 1000は、長すぎる実行を止めるための設定です。 - フラグは環境変数
FLAGに入っており、普通はprocess.env.FLAGで取得できます。しかし、この問題ではrunInNewContextの第2引数の{}にはprocessが入っていないので、ReferenceError: process is not definedとなり失敗します。 - では、どうすれば
FLAGを取得できるでしょうか?
初心者向けヒント2: 解法へのアプローチ
- 一見すると
processなどのオブジェクトにはアクセスできなさそうですが、実はそうではありません。 - JavaScript では、オブジェクトのプロパティを読むとき、そのオブジェクト自身になければプロトタイプチェーン上のプロパティも探索されます。
- vm のコンテキストで
globalThisから見えるプロパティの中でも、特にconstructorに注目して調査してみましょう。
初心者向けヒント3: もう少し踏み込んだアプローチ
globalThis.constructor.constructorは文字列から関数を作るためのFunctionコンストラクタになります。- これを使って作った関数はどのコンテキストで評価されるでしょうか?