SAST 工具評比報告 — asphalt9cn_web 碼庫
評估日期:2026-06-18 | 評估者:AI 輔助分析
⚙ 模式宣告:本次採用模式 B — 報告可信度、一致性與可操作性研判
理由:未取得 asphalt9cn_web 原始碼壓縮檔,無法以事實基準逐筆裁決 TP/FP。
精確度與漏報結論須取得原始碼後依模式 A 重做方為有效。
B0. 可比性與掃描策略對位
| 項目 | 工具 A Checkmarx | 工具 B Mend SAST |
| 掃描標的 | asphalt9cn_web (Scan Tag) | ACD_RD1 專案(同一碼庫) |
| LOC | 276,903 | 138,168 / 158,626 |
| 檔案數 | 789 | 573 / 733 |
| 掃描時間 | 2025-12-08(19m59s) | 2026-06-12(40m05s) |
| 語言 | PHP (18,864), JavaScript (172) | PHP, JavaScript/TypeScript |
| Preset / 規則集 | OWASP TOP 10 – 2021 | 49 CWEs tested |
| 合規框架 | OWASP 2021, PCI DSS v4.0, NIST 800-53, ASD STIG 6.1, FISMA 2014, CWE Top 25, SANS Top 25 等 15+ 框架 | OWASP Top 10(圖表呈現) |
| 掃描來源 | ZIP 上傳 | 本機掃描(ScanPack) |
LOC 差異研判:A 納入更多靜態資源/第三方庫(如 ckeditor),或計算規則不同。兩者掃描同一碼庫根目錄 asphalt9cn-web/,由報告內檔案路徑可確認。掃描時間相隔約 6 個月,無證據顯示碼庫有結構性改動。
B1. 客觀欄位與可操作性訊號記錄
工具 A Checkmarx — 總覽
| 維度 | 數據 |
| 總發現量 | 19,065(SAST 19,036 + SCA 29) |
| 嚴重度結構 | Critical 4,450 (23.3%) / High 7,648 (40.1%) / Medium 6,967 (36.5%) Low+Info 已於報告匯出時排除 |
| 高價值占比 | Critical+High = 63.5% |
| 分流狀態 | 100% To Verify(0 Confirmed / 0 Urgent) |
| 密度 | 68.75 findings / KLOC |
| 資料流呈現 | Source file:line + Dest file:line,各附 1 行 snippet(共 2 行) |
| 框架版本 | OWASP 2021, PCI DSS v4.0, ASD STIG 6.1(均為現行版本) |
工具 A — 發現類型分布
| 類型 | CWE | 嚴重度 | 筆數 |
| Stored_XSS | 79 | Critical | 2,559 |
| SQL_Injection | 89 | Critical | 1,792 |
| Second_Order_SQL_Injection | 89 | Critical | 96 |
| Stored_Code_Injection | 94 | Critical | 3 |
| Reflected_XSS | 79 | High | 7,579 |
| Relative_Path_Traversal | 22 | High | 41 |
| SSRF | 918 | High | 15 |
| Prototype_Pollution | 1321 | High | 8 |
| Parameter_Tampering | — | Medium | 2,607 |
| CSRF | 352 | Medium | 1,555 |
| Unchecked_Input_for_Loop | 606 | Medium | 1,244 |
| Cookie flags ×3 | 1004/— | Medium | 1,080 |
| Privacy_Violation | 359 | Medium | 120 |
| Hardcoded_Password | 798 | Medium | 117 |
| 其他 Medium | — | Medium | ~244 |
工具 B Mend SAST — 總覽
| 維度 | 數據 |
| 總發現量 | 2,688 |
| 嚴重度結構 | Critical 0 (0%) / High 1,174 (43.7%) / Medium 613 (22.8%) / Low 901 (33.5%) |
| 高價值占比 | High = 43.7%(無 Critical 等級) |
| 分流狀態 | 每筆標示 Exploitable flag + Rating 數值分數 (抽樣全為 EXPLOITABLE: FALSE) |
| 密度 | 19.5 findings / KLOC |
| 資料流呈現 | 完整 multi-step data flow(2~11 步),每步含 file:line + code |
| 每筆附帶欄位 | Severity, File, Line, Sink, Tainted Input, Data Flows count, Rating, Probability, Endpoint Access, Exploitable, Detection Date |
| CWE 涵蓋 | 49 CWEs(含 SSRF, NoSQL Injection, Deserialization 等現代威脅) |
工具 B — 發現類型分布
| 類型 | CWE | 嚴重度 | 筆數 |
| Cross-Site Scripting | 79 | High | 810 |
| SQL Injection | 89 | High | 278 |
| File Manipulation | 73 | High | 45 |
| Session Fixation | 384 | High | 20 |
| Path/Directory Traversal | 22 | High | 9 |
| FTP Command Injection | 78 | High | 8 |
| Command Injection | 78 | High | 4 |
| File Upload | 434 | Medium | 7 |
| Hidden HTML Input | 472 | Medium | 466 |
| Hardcoded Password | 798 | Medium | 143 |
| Error Messages Info Exposure | 209 | Medium | 4 |
| Cookie without HttpOnly | 1004 | Low | 702 |
| Cookie Injection | 20 | Low | 138 |
| Weak Encryption | 326 | Low | 46 |
| HTTP Response Splitting | 113 | Low | 8 |
B2. 報告自證誤報研判
工具 A 抽樣(依報告所印資料流判斷)
| # | 類型 | 檔案 | 資料流摘要 | 研判 |
| 1 | Stored_XSS | /html/vr/phpmailer/class.pop3.php | fgets() → print_r() | 合理但低利用性 — phpmailer 內部除錯,需攻擊者控制 POP3 回應 |
| 2 | Stored_XSS | /html/main.php L92→L112 | fetch() → echo $name | ✓ 可信 — DB 取值直接 echo 無跳脫 |
| 3 | SQL_Injection | /html/control/excel_income.php L41→L429 | $_COOKIE → prepare($str_total) | ✓ 可信 — Cookie 拼入 SQL |
| 4 | SQL_Injection | /html/control/excel_income.php L12→L429 | $_GET['ipAddress'] → prepare() | ✓ 可信 — GET 直接拼入 SQL |
| 5 | SSRF | /html/qr-rank/json_result.php L38→L41 | $_GET['d'] → file_get_contents(URL) | ✓ 可信但降級 — 已有 urlencode,仍可操縱 URL path |
| 6 | Reflected_XSS | /html/control/excel_income.php L12→L450 | $_GET → echo $total_create | ⚠ 待確認 — 中間經 DB 查詢,流程長,需原始碼驗證 |
小結:6 筆中 4 筆可信、1 筆低利用性、1 筆待確認。但每筆僅 2 行片段(source + sink),中間資料流邏輯不可見。
工具 B 抽樣(依報告所印資料流判斷)
| # | 類型 | 檔案 | 資料流摘要 | 研判 |
| 1 | Path Traversal | /html/source.php L3→L4 | $_GET['url'] → $url → file_get_contents($url)(3 步) | ✓ 高度可信 |
| 2 | File Manipulation | /html/control/add_event.php L215→L216 | $_GET['file'] → $file → unlink($file_path.$file)(3 步) | ✓ 高度可信 — 任意刪檔 |
| 3 | Command Injection | /html/control/add_store.php L340 | $_POST['system'] → system()(2 步) | ✓ 高度可信 — 直接 RCE |
| 4 | XSS | /html/control/adm_remain.php L194→L361 | $_GET['page'] → $page → echo(3 步) | ✓ 可信 — >=1 條件不阻字串 payload |
| 5 | SQL Injection | /html/control/add_news.php L180→L212 | $_GET['k'] → $key_name → prepare("select $key_name...")(3 步) | ✓ 高度可信 — column name injection |
| 6 | Hidden HTML Input | /html/vr/contact.php L223 | <input type="hidden" name="do"> | 低價值/資訊級 — 無汙染源 |
| 7 | Cookie w/o HttpOnly | 多檔案 setcookie | Rating 0.2, Exploitable FALSE | 低價值/最佳實務 |
小結:7 筆中 5 筆高度可信(完整 multi-step 資料流),2 筆為低價值/最佳實務類。資料流描述清晰,每步驟可定位。
B3. 交叉一致性比對
| 弱點類別 | 工具 A | 工具 B | 一致性 |
| XSS (CWE-79) | 10,138 (Stored 2559 + Reflected 7579) | 810 | ⚠ 量差 12.5× — A 以 source×sink 組合計筆 |
| SQL Injection (CWE-89) | 1,888 (1792 + 2nd Order 96) | 278 | ⚠ 量差 6.8× — 計筆方式差異 |
| Path Traversal (CWE-22) | 41 | 9 | ✓ 方向一致 |
| File Manipulation (CWE-73) | 未單獨分類 | 45 | ⚠ A 可能歸入 Path Traversal |
| SSRF (CWE-918) | 15 | 0(規則有覆蓋但無 finding) | ⚠ B 漏報?需確認規則邏輯 |
| Command Injection (CWE-78) | 0(未報出) | 12 (FTP 8 + OS 4) | ⚠⚠ A 未報 — 含直接 RCE |
| CSRF | 1,555 | 0 | B 規則集無 CSRF |
| Parameter_Tampering | 2,607 | 0 | B 規則集無此類 |
| Hidden HTML Input (CWE-472) | 0 | 466 | A 不報此類 |
| Cookie flags | 1,080 | 702 | ✓ 方向一致 |
| Hardcoded Password (CWE-798) | 117 | 143 | ✓ 一致 |
| Session Fixation (CWE-384) | 0 | 20 | B 報出,A 未涵蓋 |
關鍵落差(待人工複查):
- Command Injection:B 報出
$_POST['system'] → system()(/html/control/add_store.php L340),A 完全未報。若為 TP,屬最高危弱點,A 存在顯著盲區。
- SSRF:A 報 15 筆(file_get_contents with user-controlled URL),B 規則覆蓋但 0 筆。需確認 B 是否因 urlencode 存在而不報。
- XSS 量差(10,138 vs 810):需確認是純計筆方式差異或 B 有漏報。
- Session Fixation (20 筆):B 報出,A Preset 未涵蓋。
B4. CWE 自洽性
| 工具 | 檢查項目 | 結果 |
| A | Stored_XSS → CWE-79, SQL_Injection → CWE-89, SSRF → CWE-918 | ✓ 自洽 |
| Parameter_Tampering / CSRF 未標明確 CWE ID | ⚠ 缺乏標準對位 |
| sink 型態與 CWE 定義一致性 | ✓ 抽樣均符合 |
| B | 每筆均明確標示 CWE ID | ✓ 全數自洽 |
| CWE-472 Hidden HTML Input:sink 為 <input type="hidden"> | 符合 CWE 定義但低利用性 |
| CWE-78 Command Injection → system() sink | ✓ 完全符合 |
B5. 可操作性研判
訊噪比
| 指標 | 工具 A | 工具 B |
| 高價值可處置發現(可利用弱點類) | ~12,098 (Crit+High) | ~1,174 (High 全部) |
| 中/低價值最佳實務類 | ~6,967 (Medium 全部) | ~1,514 (Medium 613 + Low 901) |
| 帳面訊噪比(高價值 ÷ 總量) | 63.4% | 43.7% |
| 重複計筆程度 | 高 — 同一 sink 以 6+ tainted input 各計 1 筆 | 低 — 以 sink 為單位,多 source 歸入 data flows |
| 估計唯一修復位置 | ~2,000-3,000(實際可操作) | ~1,500-2,000 |
工具 A 帳面 63.4% 高價值比看似較佳,但因計筆方式(每條 tainted input × 每個 sink = 1 finding),同一修復動作被報 5~10 筆。例:excel_income.php 的 prepare($str_total) 一個 sink 就產出 6+ 筆 Critical SQLi。
告警疲勞風險
| 工具 | 風險等級 | 說明 |
| A | 極高 | 19,065 筆全數 To Verify。Medium 中 Parameter_Tampering 2607 + CSRF 1555 + Loop Condition 1244 = 5,406 筆純防禦性建議。需大量人力分流。 |
| B | 中等 | 2,688 筆含 Exploitable flag + Rating score 可快速篩選。Low 901 筆可一次性濾除。 |
分流就緒度
| 維度 | 工具 A | 工具 B |
| 明確嚴重度 | ✓ Critical/High/Medium 三級 | ✓ High/Medium/Low + 數值 Rating |
| 可定位性 | Source+Dest file:line + 2 行 snippet | File, Line, Sink, 完整 data flow (2-11 steps) |
| 分流輔助 | ❌ 100% To Verify,無 exploitability 判斷 | ✓ Exploitable flag + Rating(可排序優先級) |
| 修復指引 | 類型級描述(非逐筆) | 類型級 CWE Description + Mitigating Recommendations |
| 合規對位 | ✓✓✓ 15+ 框架,每筆對位 | △ 僅 OWASP Top 10 圖表 |
框架時效性
| 工具 | 框架版本 | 研判 |
| A | OWASP Top 10 2021、PCI DSS v4.0、ASD STIG 6.1、OWASP API 2023 | ✓ 時效性佳,貼合 2024-2026 威脅面 |
| B | OWASP Top 10(未標年份),49 CWEs 含 SSRF/NoSQL/Deserialization | △ 未明示版本,但 CWE 覆蓋含現代威脅 |
研判結論
一致性(互相佐證之發現)
- XSS、SQL Injection、Path Traversal、Cookie 相關、Hardcoded Password — 兩工具均偵出,方向一致,互為佐證。
- SQL Injection 手法一致:兩者均識別 $_GET / $_COOKIE 直接拼入 prepare() 的模式。
待人工複查
- Command Injection($_POST['system'] → system()):B 報出、A 未報。若為 TP,屬最高危弱點。
- SSRF:A 報 15 筆(file_get_contents),B 0 筆。需確認 B 規則邏輯。
- XSS 量差(10,138 vs 810):需確認是計筆差異或 B 漏報。
- Session Fixation (20 筆):B 報出、A 未涵蓋。
雙向最強論點
| 最強優點 | 最大弱點 |
| 工具 A |
合規對位最完整(15+ 框架、每筆對位),含 SCA 組件弱點,覆蓋 LOC 最廣(276K)。SSRF 偵測優於 B。 |
19,065 筆 100% To Verify + 高重複計筆 + 6,967 筆 Medium 大量為防禦性建議 → 告警疲勞風險極高。每筆僅 2 行 snippet,中間資料流不可見。未報 Command Injection 為潛在盲區。 |
| 工具 B |
完整 multi-step data flow(最多 11 步)+ Exploitable flag + Rating score → 分流就緒度最高。命中 Command Injection 高危類別。以 sink 計筆,修復效率直接對應。 |
無 Critical 等級分類。未偵出 SSRF。合規對位薄弱(僅 OWASP Top 10 圖表)。LOC 覆蓋較窄(138K)。CWE-472 Hidden HTML Input 466 筆屬低價值雜訊。 |
整體可採用性研判
在「精確度 × 可操作性 × 時效性」三軸綜合研判下:
工具 B(Mend SAST)在真實導入後較能直接產生可處置的價值。
其 2,688 筆發現已附帶完整資料流路徑、Exploitable 判斷與數值 Rating,資安團隊可立即排序優先級並指派修復,無需逐筆回平台重判。以 sink 為單位的計筆方式讓「一個修復動作消除一筆 finding」直覺對應,修復追蹤效率高。Command Injection 的偵出也顯示其在關鍵高危類別的覆蓋具實戰價值。
工具 A(Checkmarx)的優勢在合規報告完整度與覆蓋廣度。
15+ 合規框架逐筆對位、SCA 組件掃描整合、LOC 覆蓋最廣,適合需產出合規稽核文件的場景。但其 19,065 筆 100% To Verify 的輸出,在未建立完善分流流程前,將對團隊產生顯著的告警疲勞負擔。Medium 中 ~5,400 筆純防禦性建議與高重複計筆,使其需投入較高的後續分流人力才能萃取可操作的修復清單。
仍需於使用者實際碼庫補測之處
- Command Injection(B 報出 / A 未報)是否為 TP — 需查 /html/control/add_store.php L340
- SSRF 落差(A 報 / B 未報)— 需確認 B 的 CWE-918 規則邏輯
- XSS 量差是否為計筆方式造成,或 B 有遺漏特定 pattern
- 工具 A 的 Reflected_XSS 受 10,000 筆上限截斷,真實數量可能更高
- 兩工具對 PHP 自定義 sanitization 函式(如
filterText())的解析能力需實測
聲明:本評估為模式 B,精確度(TP/FP 比率)與漏報(Recall)結論須取得原始碼後依模式 A 重做方為有效。
報告產出時間:2026-06-18