SAST 靜態分析
Vibe Prompt
「幫我在 GitHub Actions 中加入 SonarQube 掃描,檢查 JavaScript/TypeScript 的安全漏洞。」
GitHub Actions + SonarQube
name: SAST Scan
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
sonar:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: SonarQube Scan
uses: SonarSource/sonarcloud-github-action@master
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CodeQL 掃描
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: javascript, python
- name: Autobuild
uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:javascript"
SAST 工具比較
| 工具 | 語言 | 類型 | |------|------|------| | SonarQube | 多語言 | 程式碼品質 + 安全 | | CodeQL | 多語言 | 深層安全分析 | | Snyk | 多語言 | 開源漏洞 + IaC | | Semgrep | 多語言 | 自訂規則 | | Bandit | Python | 安全掃描 |
Vibe Prompt
「幫我寫 Semgrep 規則:檢測 Python 程式碼中的 SQL Injection。」
rules:
- id: sql-injection-detection
patterns:
- pattern: |
$CURSOR.execute("..." + $USER_INPUT + "...")
- pattern: |
f"SELECT ... WHERE id = {$USER_INPUT}"
message: "偵測到可能的 SQL Injection"
languages: [python]
severity: ERROR
關鍵要點
SAST 工具比較表
| 工具 | 語言支援 | 整合方式 | 費用 | |:----:|:--------:|---------|:----:| | SonarQube | 30+ 語言 | CI/CD Pipeline、PR 檢查 | 社群版免費 | | CodeQL | 10+ 語言 | GitHub Actions | 公開 repo 免費 | | Semgrep | 20+ 語言 | CLI、CI/CD | 社群版免費 | | Snyk Code | 10+ 語言 | CI/CD、PR 檢查 | 有限免費 | | Checkmarx | 20+ 語言 | CI/CD、IDE | 商業版 |
GitHub Actions 整合
name: SAST Scan
on: [push, pull_request]
jobs:
sonarqube:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: SonarQube Scan
uses: SonarSource/sonarcloud-github-action@master
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
在 PR 中阻擋
SonarQube 的 Quality Gate 可以在 PR 中自動檢查:如果新程式碼的測試覆蓋率低於 80% 或有 Critical 以上的漏洞,PR 會被自動阻擋無法合併。
SAST:在程式碼編寫階段就揪出漏洞
SAST(Static Application Security Testing)是一種白箱測試技術——在不執行程式碼的情況下,透過分析原始碼來找出安全漏洞。
SAST 可以找到什麼?
| 漏洞類型 | 範例 | SonarQube 規則 |
|:--------|:----|:-------------|
| SQL Injection | SELECT * FROM users WHERE id = " + input | 字串拼接查詢 |
| XSS | innerHTML = userInput | 未跳脫的輸出 |
| 硬編碼密碼 | password = "123456" | 密碼字串常數 |
| Buffer Overflow | 固定大小的陣列操作 | 陣列邊界檢查 |
| Unvalidated Redirect | 直接使用 URL 參數作為跳轉目標 | 未驗證的轉向 |
SAST 的優缺點
| 優點 | 缺點 | |:----|:----| | 在開發早期發現問題(修復成本最低) | 可能產生大量誤報(False Positive) | | 不需要執行環境,速度快 | 無法發現執行時期的漏洞(如認證邏輯錯誤) | | 直接指出問題程式碼行數 | 對動態語言(Python、JS)的分析相對有限 | | 可以整合進 CI/CD | 需要維護規則庫 |
最佳實踐
SAST 的最佳用法是:作為 PR Review 的關卡。在合併 PR 之前,SAST 必須通過。這能確保每一行程式碼進到 main 分支之前都經過安全掃描。
下一章預告:SCA 軟體組成分析
SAST 分析的是你自己寫的程式碼。下一章的 SCA 分析的是你用到的第三方套件——現代應用程式中 80% 的程式碼來自 open source, SCA 就是在檢查這些外部套件是否有已知漏洞。