本文說明 GitHub Copilot 現代化的應用程式評估功能能偵測到什麼。 評估涵蓋兩項關鍵能力:
三個對於您的現代化旅程至關重要的領域中進行問題偵測:
- 雲端準備度:識別 16 類問題,包括檔案系統使用、憑證管理、訊息服務、資料庫連線、容器化缺口、會話處理、遠端通訊模式等。
- Java 升級:標記過時的 Java 版本、已結束支援 OSS 的框架(Spring Boot、Spring Cloud、Jakarta EE)、數百個已移除或棄用的 API,以及像 Ant 這類舊有建置工具。
- 安全性:偵測 ISO/IEC 5055 標準中 42 項安全弱點,涵蓋注入漏洞(SQL、LDAP、XPath、OS 指令)、硬編碼憑證與密碼金鑰、同步問題、資源生命週期問題及其他高影響 CWE。
應用理解:對於舊有程式碼庫,評估會揭示相依性與使用的技術,讓你在開始遷移前清楚了解應用程式所依賴的是什麼。
以下章節將詳細說明各領域的議題覆蓋情況。
領域:雲端準備
| Domain | 類別 | 偵測摘要 | 為什麼它很重要 |
|---|---|---|---|
cloud-readiness |
credential-migration |
偵測硬編碼的 AWS 憑證(aws_access_key_id、)、 aws_secret_access_keyAWS Secrets Manager 的使用情況,以及像 Spring Cloud Vault 這類嵌入式秘密管理函式庫。 |
安全性: 硬編碼的憑證和廠商專屬的秘密儲存庫非常脆弱。 雲端原生應用需要集中式、基於身份的安全措施來防止憑證被竊。 |
cloud-readiness |
region-configuration |
在程式碼或設定檔中識別硬編碼的 AWS 區域識別碼(aws.region, AWS_REGION)。 |
攜帶性: 硬編碼地理區域會將應用程式綁定於特定廠商的實體基礎設施,阻礙全球部署與韌性。 |
cloud-readiness |
storage-migration |
偵測 AWS S3 SDK 的使用情況(桶、物件、預簽 URL)、S3 TransferManager 以及 Google Cloud Storage 用戶端函式庫。 | 可靠性與校準性: 這些相依性會把你鎖定在廠商的物件儲存中,無法與目標平台的原生儲存服務相容。 |
cloud-readiness |
messaging-service-migration |
為 Amazon SQS/SNS、Kafka、RabbitMQ(AMQP)、ActiveMQ(Artemis)、IBM MQ、TIBCO EMS、Solace PubSub+、Amazon Kinesis、Apache Pulsar 及 Google Cloud Pub/Sub 標示相依與連線字串。 | 可擴展性與可靠性:傳統訊息代理商常依賴固定端點與磁碟持續性,這阻礙了雲端環境中的水平擴展與高可用性。 |
cloud-readiness |
database-migration |
偵測 MongoDB、MySQL、PostgreSQL、MSSQL、Cassandra、MariaDB、Oracle、Db2、Sybase ASE、Firebird、SQLite、Google Firestore 及 Google Cloud Spanner 的連線字串、驅動程式及逾時設定。 | 可靠性: 自我管理或非原生資料庫缺乏自動化雲端擴展功能。 硬編碼的超時和固定重試間隔可能在部分系統中斷時導致阻塞和「重試風暴」。 |
cloud-readiness |
file-system-management |
識別相對/絕對路徑、home 路徑(/home/)、file:// 機制,以及標準 Java IO/NIO 或 Apache Commons IO 呼叫以便於存取本地儲存。 |
無國籍: 雲端容器是短暫的。 寫入本地檔案系統會導致實例重新啟動或縮放操作時資料遺失;持久性資料必須外部化。 |
cloud-readiness |
local-credential |
在屬性或 XML 檔案中標記 Java KeyStore (.jks) 檔案、 KeyStore.load 方法呼叫及明文密碼(password, pwd) |
安全風險: 儲存在明文或本地檔案中的敏感資料,若未經授權者存取應用程式環境或設定檔,很容易遭到入侵。 |
cloud-readiness |
configuration-management |
偵測System.getenvSystem.getProperty、外部.properties/.xml/.ini檔案,以及應用程式設定的 Windows 登錄檔存取。 |
外部化: 作業系統專用的儲存或本地檔案無法大規模管理,且無法動態更新,除非所有實例都修改程式碼。 |
cloud-readiness |
session-management |
識別物件中的 HttpSession 資料儲存,以及網頁描述符中「distributable」標籤的使用。 |
可擴展性: 標準 HTTP 會話不適合雲端擴展;狀態必須外部輸出到分散式快取,以防止在實例間流量轉移時資料遺失。 |
cloud-readiness |
remote-communication |
偵測緊密耦合協定(CORBA、RMI、JCA)、未加密的 HTTP/FTP 協定、Java Mail API、直接 Socket/NIO 通道使用,以及硬編碼的 URL。 | 雲端相容性與安全性: 緊密耦合的互動會阻礙擴展性。 未加密的協定與硬編碼的網址在動態雲端網路環境中極易受攻擊且脆弱。 |
cloud-readiness |
jakarta-migration |
偵測 NoSQL、JPA、Data、WebSockets 及 JAX-RS 專用 Jakarta/Java EE API 的使用,以及來自 JBoss EAP、WebLogic 或 WebSphere 的伺服器專屬產物。 | 可支持性: 遷移到雲端原生執行環境需要與現代雅加達命名空間對齊,並移除專有應用伺服器依賴,以確保可攜性。 |
cloud-readiness |
containerization |
標記缺少 Dockerfile 或有問題的 Dockerfile 指令,如 apt-get upgrade、小寫語法及語法間距問題。 |
可靠性: 容器建置中的標準化是穩定且可重現部署的必要條件,並確保映像檔在不同環境中的可預測行為。 |
cloud-readiness |
scheduled-job-migration |
識別 AWS Lambda 處理器、Google Cloud Functions、Quartz 排程器相依性及 Spring Batch 處理工作流程。 | 雲端運算對齊: 排程工作與無伺服器函數必須重構,以使用目標雲端的事件驅動與無伺服器計算模型,以降低基礎設施負擔。 |
cloud-readiness |
apm-migration |
識別 New Relic、Elastic APM 及 Dynatrace 的嵌入式 APM 代理與函式庫。 | 可觀察性: 這些工具需要特定的雲端平台整合,才能在受管理環境中正確捕捉遙測、延遲與健康數據。 |
cloud-readiness |
auth-migration |
偵測 SAML/OpenSAML、OAuth 2.0、OpenID、Spring Security、LDAP 使用及舊有網頁表單認證模式。 | 現代身份: 傳統的網頁表單與 LDAP 認證缺乏現代基於理賠的雲端身份提供者所具備的彈性與安全功能(多重認證、SSO)。 |
cloud-readiness |
os-compatibility |
識別專案對 Windows 專屬 Dynamic-Link 函式庫(.dll 檔案)的依賴。 | 攜帶性: DLL 是作業系統專用的,無法在標準的 Linux 雲端容器環境中執行。 你需要用跨平台的共享函式庫來取代它們。 |
網域:java-upgrade
| Domain | 類別 | 偵測摘要 | 為什麼它很重要 |
|---|---|---|---|
java-upgrade |
java-version-upgrade |
識別非 LTS Java 版本(9、10、12-16、19、20)及舊版(1.x 至 8 及 11)的使用情況。 | 安全性與支援: 舊版及非LTS版本存在已知漏洞,且缺乏長期維護更新,使基礎設施暴露於攻擊風險。 |
java-upgrade |
framework-upgrade |
偵測已結束 OSS 支援的 Spring Boot、Spring Cloud、Spring Framework 及 Jakarta EE 版本。 | 可支持性: 過時的框架停止獲得安全修補,使應用程式成為安全風險,且與現代雲原生工具不相容。 |
java-upgrade |
deprecated-apis |
目錄中包含數百個已移除或棄用的 API,包括 sun.misc.BASE64、 Thread.stop、 方法 SecurityManager ,以及來自 JBoss、Seam 2、WebLogic 和 WebSphere 的專有鉤子。 |
穩定性與便攜性: 使用移除的 API 會導致現代 JVM 的執行時當機。 專有廠商的掛鉤(如 WebLogic/JBoss 內部結構)會妨礙應用程式於標準執行環境間的可移植性。 |
java-upgrade |
build-tool |
識別舊有建置系統,如 Ant(build.xml)或 Eclipse 專屬專案配置(WTP/JEM 性質)。 |
自動化: 舊有工具缺乏標準慣例與相依管理,無法有效整合進現代 CI/CD 管線。 |
領域:安全(ISO 5055 指導)
ISO/IEC 5055 是一項 ISO 標準,用於衡量軟體產品內部結構,涵蓋四項業務關鍵因素:安全性、可靠性、效能效率與可維護性。 這些因素決定了軟體系統的可信度、可靠性與韌性。 本質上,ISO 5055 旨在「找出並預防造成 90% 生產問題的 8% 缺陷」。 ISO 5055 在各品質特徵下,識別出最關鍵且具影響力的 CWE:可靠性、效能效率、安全性與可維護性。 在 GitHub Copilot 現代化中,你必須針對 ISO 5055 中定義的安全規範所整理的常見弱點枚舉(CWEs)進行檢測,如下表所示。
| CWE_ID | 標題 | 說明 |
|---|---|---|
CWE-22 |
路徑名稱不當限制於受限目錄(「路徑遍歷」) | 該產品利用外部輸入來構建路徑名稱,目的是識別受限父目錄下方的檔案或目錄。 但是,它無法有效地消除可能導致路徑名稱解析到受限目錄外部的特殊元素。 |
CWE-23 |
相對路徑遍歷 | 該產品使用外部輸入在受限目錄內建構路徑名稱,但無法中和像 這樣的序列 ..,因為這些序列可以在該目錄外解析。 |
CWE-36 |
絕對路徑遍歷 | 該產品使用外部輸入在受限目錄內建構路徑名稱,但無法中和像 這樣的絕對路徑序列 /abs/path,這些序列可以在該目錄外解析。 |
CWE-77 |
命令中使用特殊元素的不當處理(「命令注入」) | 該產品使用受外部影響的輸入構建指令,但未能中和可能改變傳輸至下游元件的特殊元素。 |
CWE-78 |
作業系統指令中使用特殊元素的不當中和(「作業系統指令注入」) | 該產品透過外部影響的輸入構建作業系統指令,但未能中和可能修改傳送至下游元件的作業系統指令的特殊元素。 |
CWE-88 |
指令中參數分隔符的不當消除(「參數注入」) | 該產品為一個獨立元件建構了指令字串,但並未正確區隔該字串中的參數、選項或開關。 |
CWE-79 |
網頁生成過程中輸入中和不當(「跨站腳本」) | 該產品未能在將使用者可控制的輸入中和後,才將其添加至作為提供給其他使用者的網頁的輸出中。 |
CWE-89 |
SQL 指令中使用特殊元素的處理不當(「SQL 注入」) | 該產品透過外部影響的輸入構建 SQL 指令,但未能中和可能修改指令的元素,使輸入能被解讀為 SQL 語法,而非一般資料。 |
CWE-564 |
SQL 注入:休眠 | 使用 Hibernate 執行由使用者控制輸入建構的動態 SQL 語句,可能讓攻擊者修改語句的意義或執行任意 SQL 指令。 |
CWE-90 |
LDAP 查詢中使用特殊元素的不當中和(「LDAP 注入」) | 該產品透過受到外部影響的輸入構建 LDAP 查詢,但未能中和可能修改傳送至下游元件的查詢元素。 |
CWE-91 |
XML 注入(亦稱為盲 XPath 注入) | 該產品無法妥善中和 XML 中使用的特殊元素,導致攻擊者在處理前修改語法、內容或指令。 |
CWE-99 |
資源識別碼控制不當(「資源注入」) | 產品會接收輸入,但在將其作為超出預期控制範圍的資源識別碼前,並未正確限制輸入。 |
CWE-130 |
長度參數不一致的處理不當 | 產品解析格式化的訊息或結構,卻錯誤處理與相關資料實際長度不一致的長度欄位。 |
CWE-259 |
硬編碼密碼的使用 | 該產品包含一個硬編碼密碼,用於自身的入站驗證或與外部元件的出站通訊。 |
CWE-321 |
硬編碼密碼金鑰的使用 | 該產品使用硬編碼且不可更改的密碼金鑰。 |
CWE-434 |
危險類型檔案的無限制上傳 | 該產品允許上傳危險檔案類型,並自動在其環境中處理。 |
CWE-456 |
缺少變數初始化 | 產品不會初始化關鍵變數,導致執行環境使用意料之外的值。 |
CWE-457 |
未初始化變數的使用 | 程式碼使用未初始化的變數,導致無法預測或非預期的結果。 |
CWE-477 |
過時函數的使用 | 程式碼使用已棄用或過時的函式,顯示未被積極審查或維護。 |
CWE-502 |
不可信資料的反序列化 | 該產品在未充分確保資料有效性的情況下,將不受信任的資料反序列化。 |
CWE-543 |
在多執行緒情境下使用單例模式而不同步 | 該產品在多執行緒環境中建立資源時,使用單例模式,但缺乏適當的同步機制。 |
CWE-567 |
在多執行緒情境下對共享資料的非同步存取 | 該產品無法在執行緒間正確同步共享資料,例如靜態變數,導致行為未定義。 |
CWE-570 |
表達總是虛假的 | 該產品包含一個表達式,該表達式總是評估為假。 |
CWE-571 |
表達永遠是真實的 | 產品包含一個始終評估為真值的表達式。 |
CWE-606 |
迴圈條件的未檢查輸入 | 該產品未正確檢查用於迴圈條件的輸入,這可能導致過度迴圈,進而造成拒絕服務。 |
CWE-643 |
XPath 表達式中資料中和不當(「XPath 注入」)。 | 該產品利用外部輸入動態建構 XML 資料庫的 XPath 表達式,但無法中和該輸入。 |
CWE-652 |
XQuery 表達式中資料中和不當(「XQuery 注入」) | 該產品利用外部輸入動態構建 XQuery 表達式,但未能正確中和該輸入。 |
CWE-662 |
不當同步 | 該產品允許多個執行緒或系統在未適當同步的情況下存取共享資源,可能導致同時存取問題。 |
CWE-665 |
初始化不正確 | 產品不會初始化或錯誤初始化資源,可能導致存取時處於意想不到的狀態。 |
CWE-667 |
不當鎖定 | 產品未能正確地取得或釋放對資源的鎖定,導致非預期的狀態變化。 |
CWE-672 |
資源過期或釋放後的操作 | 該產品在資源過期、釋放或被撤銷後,存取或運作於該資源上。 |
CWE-681 |
數值類型間的錯誤轉換 | 在型別轉換過程中,資料可能會被省略或轉換成意想不到的值,這在敏感情境中使用時可能很危險。 |
CWE-682 |
錯誤計算 | 該產品執行計算,產生錯誤結果,後續用於安全關鍵決策或資源管理。 |
CWE-732 |
關鍵資源權限分配錯誤 | 對於安全關鍵資源的權限,會以允許非預期行為者讀取或修改的方式來指定。 |
CWE-772 |
有效壽命後未釋放資源 | 產品在有效生命週期結束且不再需要資源後,不會釋出資源。 |
CWE-775 |
檔案描述符或句柄在有效生命週期後未釋出 | 產品在不再需要檔案描述符或處理件後,無法釋出。 |
CWE-778 |
記錄不足 | 產品無法記錄安全關鍵事件,或在記錄時遺漏重要細節。 |
CWE-783 |
運算子優先順序邏輯錯誤 | 表達式使用了因運算子優先順序而產生的錯誤邏輯。 |
CWE-789 |
記憶體配置與過大大小值 | 該產品根據一個不信任且容量龐大的值分配記憶體,卻不確保其在預期範圍內。 |
CWE-798 |
硬編碼憑證的使用 | 產品包含硬編碼的憑證,例如密碼或密碼金鑰。 |
CWE-820 |
缺少同步 | 該產品同時使用共享資源,且不嘗試同步存取。 |
CWE-821 |
錯誤同步 | 該產品同時使用共享資源,但無法正確同步存取。 |
CWE-835 |
無法滿足出口條件的迴圈(即「無限迴圈」) | 該產品包含一個迭代或迴圈,其中有一個無法達到的退出條件。 |
CWE-611 |
XML 外部實體參考的不當限制 | 這款產品處理包含 URI 實體的 XML 文件,而這些 URI 的解析超出了預期的控制範圍。 |
CWE-1057 |
預期之外的資料存取操作位於資料管理元件外部 | 該產品執行的資料存取操作,繞過設計上必須的專用中央資料管理元件。 |