Exaforce Blog Author Image – Bleon Proko
Exaforce Blog Author Image – Jakub Pavlik
リサーチ
September 9, 2025

ゴースト・イン・ザ・スクリプト:Google App Script プロジェクトになりすましてステルスパーシスタンスを行う

クリプトマイニングからステルスサービスアカウントまで、Google Apps Script の悪用のリスクと、不正使用を検出する方法について解説します。

Exaforce Blog Featured Image

インフラストラクチャ攻撃における最も重要なステップの1つは、ターゲットの環境内で攻撃を続けることです。パーシステンスは、獲得したアクセスレベルにもよりますが、多くの場合、何度も確立する必要があります。セキュリティシステムは、さまざまな形態の永続化メカニズムを検出できるほどスマートになっています。そのため、攻撃者は標的の環境に侵入し続けるための新しくて独創的な方法を模索し続けています。

Google Workspace Apps Scriptは、Gmailアカウントを持つすべてのユーザーがビジネスアプリケーションを自動化し、アプリケーションが相互にやり取りできるようにする機能です。その下で Apps Script アプリをデプロイすると、そのアカウントが所属する GCP 組織に GCP プロジェクトが作成されます。プロジェクト ID の形式は別として、これらのプロジェクトは通常の GCP プロジェクトとそれほど変わりません。つまり、攻撃者はこれらのプロジェクトのうちの 1 つを使用してリソースをホストし、ターゲットに持続させることができるということです。また、Apps Script プロジェクトと同じ名前形式の GCP プロジェクトを作成して、正規の Apps Script プロジェクトになりすまして検出を回避することもできます。

このブログでは、Apps Scriptプロジェクトの仕組みと、攻撃者がApps Scriptプロジェクトを利用してターゲットの環境で存続する方法について説明します。次に、攻撃者がこれらの手法を悪用できないように、これらの手法を検出して防止する方法について見ていきます。

アプリスクリプトの詳細

エンドポイントに関連付けられた Google Workspace アプリスクリプト script.google.comはローコードソリューションであり、Gmail アカウントを持っている人なら誰でも Google Workspace と統合するビジネスアプリケーションを自動化できます。JavaScript を使用するスクリプトインターフェイスを備えており、Google のサービスを統合して軽量な自動化を構築できます。

Google Apps Script editor showing “myFunction” in Code.gs of an untitled project.
Google アプリスクリプトの例

アプリスクリプトは非常に柔軟です。これを使うと、次のことが可能になります。

  • Google ドキュメント、スプレッドシート、フォームでカスタムメニュー、ダイアログ、サイドバーを作成する
  • Google スプレッドシート用のカスタム関数とマクロを開発する
  • ウェブアプリをスタンドアロンアプリケーションとして、または Google サイトに埋め込んで公開する
  • AdSense、アナリティクス、カレンダー、ドライブ、Gmail、マップなど、他の Google サービスと連携する
  • 軽量なアドオンを作成し、Google Workspace マーケットプレイスで共有しましょう
New deployment settings in Google Apps Script with Web app selected from configuration menu.
利用可能なアプリスクリプトタイプ

アプリスクリプトが作成されると、プレフィックス付きのプロジェクト システム- 自動的に作成されます。これらのプロジェクトはコンソールの組織のプロジェクトリストには表示されませんが、これは理にかなっています。組織プロジェクトとは見なされないからです。

Google Cloud Console “Select a resource” dialog showing Exaforce organization and project list.
Apps Script プロジェクトを含まないプロジェクトリスト

ただし、プロジェクトはターミナルツール () から表示できます。gcloud) 実行権限を持つIDによる リソースマネージャー.プロジェクト.リスト

Terminal showing gcloud projects list output with project IDs and names.
アプリスクリプトプロジェクトを含む gcloud プロジェクトリスト

App Script プロジェクトが作成されると、GCP はデフォルトで Resource Manager フォルダとサブフォルダを組織内に次の名前で作成します。 システムスイート/アプリスクリプト。ここでも、コンソールで見ると、これらのフォルダにはプロジェクトがないようです。

Google Cloud Console resources table showing Exaforce organization and projects.
プロジェクトが表示されていない Apps Script サブフォルダーのコンソールビュー

ただし、CLIを使用すると、App Scriptプロジェクトが内部に表示されます アプリスクリプト サブフォルダー。作成後、App Script プロジェクトが格納される場所です。

Terminal filtering projects by folder ID using gcloud projects list --filter.
システムスイート/アプリスクリプトサブフォルダー内のアプリスクリプトプロジェクトを含む CLI 出力

GCP 組織におけるアプリスクリプトのなりすましの悪用

クリプトマイニングインスタンス

アプリスクリプトプロジェクトは、次の ID 形式に従います。 システム-<26 numbers>。GCP では、プロジェクトを作成してアクセスできる任意のフォルダーまたはサブフォルダーに保存できます。また、ASCII 文字、数字、ハイフンが含まれていて、6 ~ 30 文字であれば、プロジェクト名は何でも設定できます。の組み合わせ システム-<26 numbers> はちょうど 30 文字で、数字、文字、ハイフンが含まれています。

Terminal output showing successful creation of new GCP projects using gcloud projects create.
Apps Script プロジェクトに似た GCP プロジェクトの作成

私たちが見つけた違いの 1 つは、保存場所によってプロジェクトがどのように表示されるかということでした。プロジェクトが組織レベルで保存されている場合、そのプロジェクトの ID 形式は システム-<26 numbers>、コンソール (プロジェクト) に表示されます sys-99990000000000)。ただし、内部で作成した場合 アプリスクリプト フォルダ、アプリはコンソール(プロジェクト)にプロジェクトとして表示されません sys-1111111111111111111111)。

Resources table in Google Cloud Console showing organization, projects, and folders.
組織レベルにあるために sys-111111110000000000 が表示されているが、apps-script フォルダーの sys-1111111111111111111111 が表示されていないプロジェクトのコンソールビュー

以下の場合、プロジェクトは引き続き一覧表示されます。 リソースマネージャー.プロジェクト.リスト ターミナルで実行されます。

Terminal output listing GCP projects with IDs, names, and project numbers.
両方のプロジェクトを一覧表示する gcloud CLI

以下の権限を持つ攻撃者 リソースマネージャ. プロジェクト. 作成 App Scriptプロジェクトが他のプロジェクトのように表示されないという事実を利用して、ターゲットの組織にプロジェクトを作成し、そこにリソースを保存できます。各プロジェクトには、作成者が指定できる名前を付けることもできます。攻撃者は、標的の組織内の他のプロジェクトを調べて、そのプロジェクトにふさわしい名前を見つけることもできます。

gcloud command creating a new project named ‘Exaforce Google Sheet Function’.
隠しプロジェクトの作成に使用される gcloud CLI

たとえば、悪意のある攻撃者がこの隠しプロジェクトを利用して大規模なインスタンスを作成し、それをクリプトマイニングハーベスターとして使用する可能性があります。そのためには、以下のことが必要です。

  • プロジェクトの課金を有効にする
  • コンピュート API を有効にする
  • インスタンスを作成
Terminal showing GCP billing link and VM instance creation with gcloud compute.
非表示のプロジェクトでラージインスタンスを有効にしてから作成する

攻撃者は、クリプトマイニングハーベスターとして使用できる高性能インスタンスを制御するようになりました。

非表示のプロジェクト内のサービスアカウントを使用して組織に存続する

永続性により、攻撃者は理想的には高権限のIDとしてターゲットのインフラストラクチャに戻ることができます。GCP 組織で存続するにはさまざまな方法があります。たとえば、ユーザー作成サービスアカウントの作成、永続的な認証情報の作成、高権限の ID が割り当てられたリソースの作成などです。永続化メカニズムをプロジェクト内で作成できる場合は、App Script を装ったプロジェクトに作成することもできます。たとえば、サービスアカウントを作成してそのキーを作成し、組織や他のプロジェクトに高い権限を持つ役割を割り当てて、後で使用できるように保管しておくことができます。

gcloud IAM policy binding output showing roles assigned to Exaforce service accounts.
非表示のプロジェクトでのサービスアカウントの作成

さらに悪いことに、IDはプロジェクト名がわかっている場合にのみ表示されます。さらに、誰もサービスアカウントにアクセスできないようにするポリシーをプロジェクトに設定することもできます。これは「解読不可能な」防止策ではありませんが、サービスアカウントをクリーンアップしようとする試みが妨げられる可能性があります。特に、これらのプロジェクトは Google が作成および管理しているように見えるためです。

name: organizations/ORG_ID/denyPolicies/deny-service-account-all
displayName: "Restrict all SA usage"
rules:
- denyRule:    
    deniedPrincipals:
    - principalSet://goog/public:all    
    deniedPermissions:    
    - iam.serviceAccounts.*

なぜアプリスクリプトプロジェクトになりすますのか?

その下にあるApps Scriptプロジェクトは通常の GCP プロジェクトです。通常のプロジェクトと異なる点は、デフォルトでは Google が管理する 1 つの ID を除き、どの ID にも適切なアクセス権が付与されない点です。サービスアカウント appsdev-apps-dev-script-auth@system.gserviceaccount.com は Apps Script プロジェクトを作成するユニバーサルアイデンティティであり、Google のみが管理しています。デフォルトで Apps Script プロジェクトとそのリソースを管理できる唯一の ID です。

Terminal output showing gcloud IAM policy for project with service account owner role.
デフォルトで Google アカウントだけが実際の Apps Script プロジェクトにアクセスできる方法を示す

適切な権限を持つ攻撃者は、プロジェクトのIAMポリシーを変更して、このプロジェクトで必要なすべてのサービスで任意のリソースをホストできるようにすることができます。

gcloud command adding admin@exaforce.cloud  as owner and verifying IAM policy update.
攻撃者が実際の Apps Script プロジェクトにアクセスして変更できるようにプロジェクトポリシーを更新する

たとえば、悪役は次のような行為をする可能性があります。

  • サービスアカウントを作成し、それに組織ポリシーを割り当てて、対象組織で存続できるようにする
  • プロジェクトを請求先アカウントにリンクし、クリプトマイニング用の大規模なリソースを作成します

アプリスクリプトプロジェクトの不正利用の検知

プロジェクトの請求情報を調べてプロジェクトのなりすまし行為を発見する

GCP にはさまざまなリソース請求タイプがあり、中には無制限の無料請求タイプもあります。IAM ID はこのようなリソースの好例です。無料リソースのその他の例としては、IAM リソースマネージャー組織、アーティファクトレジストリ、VPC 基本ネットワークなどがあります。

特定のサービスとそのリソースを使用できるようにするには、組織のオーナーはプロジェクトを請求先アカウントにリンクする必要があります。プロジェクトを請求先アカウントにリンクするのは、「プロジェクトに支払い方法を決める」というお洒落な言い方です。請求先アカウントは支払い方法をプロジェクトにリンクし、毎月、リソースの使用状況に基づいてプロジェクトのオーナーが支払いを行い、請求先アカウントは費用の請求書を各自に渡します。

大規模なコンピューティングインスタンスを作成できるということは、請求先アカウントをプロジェクトにリンクする必要があるということです。App Script プロジェクトが攻撃者によって作成され、大規模なリソースのホストとして使用されているかどうかを検出する 1 つの方法は、プロジェクトが請求先アカウントにリンクされているかどうかを確認することです。以下の例では、project sys-22222222222222222222222222攻撃者が作成した大規模なコンピュートインスタンスを含むプロジェクトには、請求先アカウントがリンクされます (フィールドで確認できます)。 請求先アカウント名 そして 請求有効ただし、正規の App Script プロジェクト (プロジェクト) sys-14600875379148140018929136) には請求先アカウントへのリンクは必要ありません。

Terminal shows billing account linked for one project but missing for another, indicating disabled billing.
請求先アカウントに添付されている非表示のプロジェクトと、請求先アカウントに添付されていない正規の Apps Script プロジェクトの比較

請求情報を変更してプロジェクトに溶け込ませる

この検出を回避する方法の 1 つは、請求先アカウントからプロジェクトのリンクを解除することです。攻撃者がインスタンス (または任意の有料サービス) を作成したい場合、プロジェクトは請求先アカウントに含まれている必要があります。そのため、無料利用枠で提供されていないリソースやサービスは、請求先アカウントがリンクされたプロジェクトにデプロイする必要があります。

請求先アカウントからプロジェクトのリンクを解除すると、リソースが削除されます。

インスタンスを削除する請求先アカウントのリンク解除

IAM サービスアカウントは有料リソースの範囲には該当しないため、請求先アカウントにリンクされていないプロジェクトでも永続的なサービスアカウントが含まれる可能性があり、以前の検出が妨げられます。

Output showing disabled billing and two listed service accounts in the GCP project.
サービスアカウントを永続化しながら請求先アカウントのリンクを解除する

有効な API サービスによる App Script プロジェクトのなりすましの発生箇所の検出

API を使用してプロジェクトで特定のサービスを使用できるようにするには ( gcloud uses) の場合は、サービス API を有効にする必要があります。デフォルトでは、新しいプロジェクトでは複数のサービスが有効化され、これを使用してさらに多くのサービスを有効化または無効化できます。 サービス使用.サービス.有効化 または サービス使用状況.サービス.無効化

一方、Apps Script プロジェクトでは、デフォルトではサービスは有効になっていませんが、必要に応じて有効にすることができます。プロジェクトが実際に Apps Script プロジェクトではないかどうかを調べる方法の 1 つは、有効になっているサービスを調べることです。

Comparison of enabled Google Cloud services lists for two different projects.
本物と偽の Apps Script プロジェクトのリストサービス

API エンドポイントを無効化することによるブレンド

この検出方法の問題の 1 つは、Apps Script プロジェクトが実行するタスクによっては、一部のサービスを有効にする必要がある場合があることです。攻撃者は、使用していないサービスをすべて無効にして、プロジェクトをもう少し正当なものに見せかけることができます。

Terminal loop disabling multiple Google Cloud services successfully for a project.
未使用のサービスを無効にして、実際の Apps Script プロジェクトのように見せる

たとえば、プロジェクトでコンピュートインスタンスを作成できるようにするには、 計算します そして oslogin サービスを有効にする必要があります。リソースが存在しているときに無効にすると、実行は失敗し、現在のプロジェクトの使用状況が表示されます。それ以外にも、ターゲットの環境でタスクを実行するたびに、攻撃者は残りのサービスを無効にしてから一時的に再び有効にすることができます。

Error message when disabling a compute service that still has active resources.
サービスが無効になっている場合の実行失敗

もう 1 つの問題は、サービス API がプロジェクトで有効になっていなくても、一部のサービス API がプロジェクトで機能することです。そのため、IAM などのサービスや基本的なストレージコマンドだけでなく、サービス利用 API (プロジェクトでサービス API を有効または無効にできるようにする) や Resource Manager も許可されます。

  • IAM
  • クラウドリソースマネージャー
  • サービス利用API
  • Cloud Storage (基本機能はいつでも利用できます。課金を有効にすると、より詳細な制御、請求、指標が可能になります)。

つまり、サービスが有効になっていないプロジェクトでも、攻撃者が永続化メカニズムとして使用できるサービスアカウントをホストできるということです。

App Script プロジェクトのなりすまし行為の発生箇所をログで検出する

もう 1 つの検出方法は、ログを調べることです。 アプリスクリプト フォルダ。以下の例では、攻撃者が作成したプロジェクト (sys-1111111111111111111111 そして sys-22222222222222222222222222)持っている プリンシパルメール フィールドは作成者のユーザーメールアドレスに設定され、Googleが作成したフィールドには次のメールアドレスが設定されています appsdev-apps-dev-script-auth@system.gserviceaccount.com。イベントはフォルダのイベントにのみ表示され、組織のイベントには表示されないため、注意が必要です。

Log entries showing multiple CreateProject actions by different service accounts in GCP.
PrincipalEmail と、偽アプリスクリプトプロジェクトや正規アプリスクリプトプロジェクトの違いを示すログ

組織ポリシーによるプロジェクト偽装の制限

Apps Script プロジェクトを作成すると、ID 形式は システム-<26 random digits>。Apps Script になりすましているユーザーのプロジェクト作成を防ぐ方法の 1 つは、の ID 形式のプロジェクトの作成と更新を拒否することです。 システム-<26 random digits> 次のポリシーを使用します。

name: >-

organizations/012345678912/customConstraints/custom.denyAppsScriptProjectImpersonation
resource_types: cloudresourcemanager.googleapis.com/Project
method_types:
  - CREATE
  - UPDATE
condition: 'resource.projectId.matches(''sys-[0-9]{26}'')'
action_type: DENY
display_name: Deny Apps Script Project Impersonation
description: ''

攻撃者がその形式のプロジェクトを作成しようとすると、組織のポリシーによって実行が拒否されます。

Error showing project creation denied due to organization policy constraints in GCP.
隠しプロジェクトの作成をブロックする組織のポリシー

組織ポリシーにより、ID形式のプロジェクトの作成は拒否されます システム-<26 random digits>(Google がエンドポイントを通じて作成した正規のものを含む) script.google.com

ブロックされたアプリスクリプトプロジェクトの作成

Exaforce によるアプリスクリプトプロジェクトの不正使用の検出

エクサフォース は、なりすましや悪用などによる Apps Script プロジェクトの悪質な使用を検出して阻止するための階層化されたカバレッジを提供します。当社のアプローチでは、高度な異常検出を活用して環境内のエンティティのベースライン動作を把握し、異常な動作を特定します。この調査の結果、お客様を保護するためにいくつかの新しい検出が可能になりました。

  • Exaforceは、通常とは異なるAPIサービス、ラベル、またはポリシーバインディングを使用するGoogle Apps Scriptプロジェクトを検出し、オンボーディング時にフラグが立てられます。
  • Exaforceは、攻撃者がApps Scriptプロジェクトのように見えるプロジェクトを作成しようとするプロジェクト偽装の試みを検出します。

以下は、App Script プロジェクトになりすまそうとするシナリオの例です。

Exaforce dashboard showing detection of attempt to impersonate GCP Apps Script project naming pattern.
非表示の Apps Script なりすましプロジェクトの検出例

検出概要には、Exabot(AIエージェント)によるアラートの自動トリアージの要約と結論が表示されます。問題のプリンシパルなどの重要な情報の概要が示されます。

Session timeline showing GCP project and billing API activity from a single Boston IP address.
インパーソネーションが実行されるすべての関連イベントを含むセッション

このプリンシパルの関連イベントをセッションにまとめるので、このプロジェクトが作成された背景や、このプリンシパルが行ったその他のアクティビティをわかりやすく把握して、包括的な影響分析を行うことができます。

Graph linking user bproko@exaforce.com  and IP 86.62.29.143 to multiple CreateProject and EnableService calls.
なりすまし Apps Script プロジェクトの作成中のイベントのビジュアルグラフ

影響を受けるすべての関連イベントとリソースは、簡単に調査できるようにグラフに視覚的にマッピングされます。

予防的管理

Exaforceの検出により、この潜在的な問題を確実に把握できます。また、ID が一致するプロジェクトの作成をブロックする前述の組織ポリシーを適用することもお勧めします。 システム-[0-9] {26} アプリスクリプトが組織で使用されていない場合。これにより、攻撃対象領域が縮小され、組織のセキュリティ体制が大幅に改善されます。

ステルスパーシスタンスとディフェンス

Apps Script プロジェクトは、監視されないままにしておくと、ステルスパーシスタンスメカニズムとして機能する可能性があります。攻撃者はこれらになりすまして、クリプトマイニング、特権サービスアカウント、またはその他の悪意のあるリソースを環境内に隠すことができます。

ディフェンダーは、Apps Script プロジェクトの内部での仕組みと、潜在的な悪用を検出してブロックする方法を理解する必要があります。Exaforce が提供しているような組織のポリシーと強力な検出機能を活用することで、この永続的なベクトルが包括的にカバーされます。

最近の投稿

初めての AWS re: Invent での廊下からの教訓

エージェント AI セキュリティによる高度な Google Workspace 侵入の検出と妨害

やわらかく濁ったパンを虫に食べさせる:シャイ・フルドの再臨

AI SocとAnthropicの愛というスポーツの祭日大会

丸太の指輪は嘘をつかない:一目瞭然の歴史的列挙

セキュリティ検出の過去、現在、未来

Exaforce HITRUST award

私たちはHITRUST認定を受けています:クラウドネイティブなSOC自動化全体にわたる信頼の強化

Exaforce Blog Featured Image

GPTはセキュリティのために再配線する必要がある

Exaforce Blog Featured Image

アグリゲーションの再定義:ノイズの削減、コンテキストの強化

Exaforce Blog Featured Image

エクサフォースが2025年のAWSジェネレーティブAIアクセラレーターへの参加に選ばれました

Exaforce Blog Featured Image

コントロールできていると感じますか?攻撃ツールとしての AWS クラウドコントロール API の分析

Exaforce Blog Featured Image

Exaforceは、2025年のSecOpsオートメーション向けGigaOMレーダーでリーダーおよびアウトパフォーマーに選ばれました

Exaforce Blog Featured Image

エージェント AI が GuardDuty インシデント対応プレイブックの実行を簡素化する方法

Exaforce Blog Featured Image

パッケージにヘビが入ってる!攻撃者はどのようにしてコードからコインへと移行しているのか

Exaforce Blog Featured Image

ExaforceがマルチモデルAIを活用して、お客様の環境でアカウント乗っ取り攻撃を検出した方法

Exaforce Blog Featured Image

s1ngularityサプライチェーン攻撃:何が起こったのか、そしてExaforceがどのように顧客を保護したのか

Exaforce Blog Featured Image

Exaforce MDR のご紹介:人工知能 (AI) 上で動作するマネージドSOC

Exaforce Blog Featured Image

Exaforceに会いましょう:フルライフサイクルのAI SOCプラットフォーム

Exaforce Blog Featured Image

Exaforceでの信頼構築:セキュリティとコンプライアンスを通じた当社の歩み

Exaforce Blog Featured Image

より多くのシグナルとより少ないノイズによる壊れたアラートトリアージプロセスの修正

Exaforce Blog Featured Image

御社の AI SOC イニシアティブを評価してください

Exaforce Blog Featured Image

一社の合同会社が AI SOC を作るわけではありません

Exaforce Blog Featured Image

適切な検出:脅威の検出には、ルールや異常検出だけでは不十分です

Exaforce Blog Featured Image

KiranaProの侵害:クラウド脅威監視への警鐘を鳴らす

Exaforce Blog Featured Image

RSACでのエージェントAIの会話には3つのポイントが欠けている

Exaforce Blog Featured Image

セキュリティ調査が失敗する5つの理由と、Exaforceがそれらを修正する方法

Exaforce Blog Featured Image

クラウドセキュリティギャップの解消:脅威監視の実際のユースケース

Exaforce Blog Featured Image

SOCの再構築:人間 + AI ボット = より優れた、より速く、より安価なセキュリティと運用

Exaforce Blog Featured Image

Github アクション (tj-アクション/変更ファイル) の侵害からの保護

Exaforce Blog Featured Image

Npm Provenance: JavaScript ライブラリに欠けているセキュリティレイヤーの橋渡し

Exaforce Blog Featured Image

ロッティファイルの npm パッケージ侵害に対するエクサフォースの対応

Exaforce がセキュリティ業務の変革にどのように役立つかをご覧ください

Exabots + ヒューマンがあなたのために何ができるか見てみましょう