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 就是在檢查這些外部套件是否有已知漏洞。

會員專屬免費教學

本章節為註冊會員專屬的免費開放內容!請先登入或註冊會員,即可立即解鎖閱讀。

立即登入 / 註冊