2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ServiceNowのGlideScopedEvaluatorを使って任意のスクリプトを実行する

Last updated at Posted at 2025-10-11

概要

ServiceNow開発をしていると、1つのインスタンスに複数のアプリケーションを乗せるタイプの開発もよくあると思います。
そうすると、インスタンスを運用するチームとアプリケーションを開発するチームに分かれることもあり、運用チームの許可がないとバックグラウンドスクリプトなどで自由にスクリプトを実行できないような制約がある場合があったりします。

商用環境でのバックグラウンドスクリプト実行はNG!!!というケースでも自由にスクリプトを実行できる可能性があったので紹介してみます(自己責任でお願いします)
※Yokohamaで実験してみました

GlideScopedEvaluatorを利用することで任意のスクリプトを自分のスコープ内で実行します

想定している環境

  • 1つのインスタンスに複数のアプリケーションがあり、それぞれで開発を行っている
  • アプリケーション開発チームは任意のスクリプトを実行できない
  • 自己責任で任意のスクリプトを実行してみたい

やったこと

  • カスタムテーブル作成
  • UIAction作成
  • 適当なスクリプトを実行

実装

カスタムテーブル作成

Scriptタイプのフィールドを持つカスタムテーブルを作成
image.png
作成されたテーブル
image.png

UIAction作成

今回はスクリプトを実行するトリガーをUIActionにしてみました。
UIActionではなければダメでありません。
image.png

var result = ge.evaluateScript(current, "script");

でテーブルのscriptカラムに書かれているスクリプトを実行
※resultは実行結果などを呼び出し元から利用したいときに使えそうです

適当なスクリプトを実行

image.png
適当に作ったtest1テーブルにレコードを挿入して「OK」という戻り値を返すスクリプトをカスタムテーブルに記載します

最低限の権限しか持たないユーザーに変更

image.png

レコードが挿入される前のtestテーブル

image.png
実行
image.png

実行結果が表示されました
image.png
レコードも増えました
image.png

さいごに

PDIで試しただけですが、これなら自分のスコープ内のテーブルに対して任意のスクリプトを実行できると思います。
実行ユーザーも最低限の権限があれば実行できたようなので、これをしれっと商用環境にリリースすれば、スコープ内で自由にスクリプトが実行できそうな気がします(自己責任で)

追記

本当に使っても大丈夫なのか気になったのでAI(Gemini)に聞いてみました

GlideScopedEvaluator を使用する際の重要なポイント

  1. セキュリティ上の注意 ⚠️
    $\text{GlideScopedEvaluator}$は、**文字列として渡されたJavaScriptコードを評価(実行)**します。これは本質的にセキュリティリスクを伴います。

意図しないコード実行の危険性: もし評価するコードがユーザー入力など制御不能なソースから来た場合、悪意のあるコード(例:gs.sql() の実行など)を実行してしまう可能性があります。

だそうです。使う際はお気を付けを(AI(Gemini)の回答を抜粋)

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?