SAST - Static Application Security Testing
Pendahuluan
Static Application Security Testing (SAST) adalah teknik pengujian keamanan yang menganalisis kode sumber, kode byte, atau binary aplikasi tanpa menjalankannya. Pendekatan ini dikenal sebagai white-box testing karena penguji memiliki akses penuh ke kode sumber - berbeda dengan DAST yang menguji aplikasi dari luar seperti black-box.
SAST bekerja dengan memeriksa struktur, aliran data, dan pola kode untuk mendeteksi kerentanan keamanan seperti SQL Injection, Cross-Site Scripting (XSS), buffer overflow, hardcoded credentials, dan insecure cryptographic algorithms. Dengan menganalisis kode pada tingkat sintaks dan semantik, SAST dapat menemukan kerentanan yang mungkin terlewatkan oleh pengujian manual atau pengujian dinamis.
Prinsip kerja SAST dapat diringkas dalam beberapa langkah:
- Parsing: Kode sumber diurai menjadi Abstract Syntax Tree (AST) atau representasi internal lainnya.
- Data Flow Analysis: Melacak bagaimana data mengalir dari source (input pengguna) ke sink (fungsi berbahaya seperti query SQL).
- Control Flow Analysis: Menganalisis jalur eksekusi yang mungkin dilewati program.
- Pattern Matching: Mencocokkan pola kode yang dikenal berbahaya atau melanggar secure coding practices.
- Reporting: Menghasilkan laporan temuan dengan lokasi baris kode, deskripsi kerentanan, dan rekomendasi perbaikan.
Tools SAST Populer
Semgrep
Semgrep adalah tool SAST open-source yang menggunakan pattern matching berbasis AST. Keunggulan utamanya adalah kemampuan menulis custom rules dengan sintaks yang mirip kode asli - tidak perlu belajar bahasa query baru. Semgrep mendukung bahasa seperti Python, JavaScript, TypeScript, Java, Go, Ruby, dan PHP.
Contoh aturan Semgrep untuk mendeteksi SQL Injection di Python:
rules:
- id: sql-injection-detection
patterns:
- pattern: |
cursor.execute(f"$QUERY", ...)
- pattern-not: |
cursor.execute("...", (...,))
message: "Potensi SQL Injection - gunakan parameterized query"
languages: [python]
severity: ERROR
Aturan ini mendeteksi penggunaan f-string pada query SQL yang dikirim
ke cursor.execute. Jika parameter dibangun dengan
string formatting, Semgrep akan memperingatkan developer untuk
menggunakan parameterized query sebagai gantinya.
Contoh aturan Semgrep untuk hardcoded password:
rules:
- id: hardcoded-password
patterns:
- pattern: |
$VAR = "$PASSWORD"
- metavariable-regex:
metavariable: $VAR
regex: .*(passwd|password|pass|pwd).*
- metavariable-regex:
metavariable: $PASSWORD
regex: .{3,}
message: "Hardcoded password terdeteksi - gunakan environment variable"
languages: [python, javascript, typescript]
severity: WARNING
SonarQube
SonarQube adalah platform code quality dan code security yang sudah sangat matang. Selain mendeteksi bugs dan code smells, SonarQube memiliki aturan keamanan yang mencakup OWASP Top 10 dan CWE/SANS Top 25. SonarQube mendukung lebih dari 30 bahasa pemrograman dan menyediakan Quality Gate yang bisa memblokir pipeline jika ambang kualitas tidak terpenuhi.
SonarQube dapat dijalankan sebagai server (self-hosted) atau menggunakan SonarCloud (SaaS). Integrasi dengan CI/CD sangat mudah melalui Scanner CLI atau plugin Maven/Gradle.
CodeQL
CodeQL adalah mesin analisis kode milik GitHub (sebelumnya Semmle). CodeQL menggunakan bahasa query tersendiri - juga bernama CodeQL - untuk mendefinisikan vulnerability patterns. Karena berbasis relational query, CodeQL mampu melakukan analisis data flow yang sangat kompleks.
Contoh query CodeQL untuk mendeteksi path traversal di Java:
import java
import semmle.code.java.security.PathTraversal
from PathTraversalConfig config, PathTraversalSink sink,
PathTraversalSource source
where config.hasSource(source) and config.hasSink(sink)
select sink.getNode(), "Path traversal dari $@.", source.getNode(),
"source ini"
Contoh query CodeQL untuk reflektif XSS di JavaScript:
import javascript
import semmle.javascript.security.dataflow.ReflectedXss
from ReflectedXss::Configuration config,
DataFlow::Node source, DataFlow::Node sink
where config.hasFlow(source, sink)
select sink.getNode(), "Reflected XSS dari $@.", source.getNode(),
"source"
Fortify Static Code Analyzer
Fortify SCA (Micro Focus / OpenText) adalah solusi SAST enterprise yang mendukung ratusan bahasa dan framework. Fortify menggunakan teknik data flow analysis, control flow analysis, configuration analysis, dan semantic analysis secara simultan. Tool ini menghasilkan laporan yang sangat detail termasuk proof of concept, risk rating, dan remediation guidance.
Fortify terintegrasi dengan Fortify Software Security Center (SSC) untuk manajemen temuan, audit workflow, dan dashboard.
Checkmarx CxSAST
Checkmarx CxSAST menggunakan mesin query-based yang memungkinkan tim keamanan menulis custom queries dalam bahasa CxQL (Checkmarx Query Language). Checkmarx dikenal dengan kemampuannya menganalisis kode tanpa membutuhkan kompilasi atau build - cukup dengan kode sumber mentah.
Bandit
Bandit adalah tool SAST khusus untuk Python yang dikembangkan oleh PyCQA. Bandit bekerja dengan membangun AST dari kode Python dan menjalankan plugins untuk mendeteksi pola berbahaya.
Menjalankan Bandit:
# Instalasi
pip install bandit
# Scan direktori
bandit -r src/
# Output dalam format JSON
bandit -r src/ -f json -o report.json
# Scan dengan threshold
bandit -r src/ -lll # hanya temuan LOW ke atas
bandit -r src/ -iii # hanya Confidence HIGH
ESLint Security Plugin
Untuk ekosistem JavaScript/TypeScript, ESLint dengan plugin
eslint-plugin-security menyediakan aturan SAST ringan
yang berjalan di dalam editor dan pre-commit hook. Plugin ini
mendeteksi pola seperti eval(), RegExp
dari input pengguna, penggunaan child_process, dan
lain-lain.
Contoh konfigurasi ESLint dengan security plugin:
{
"plugins": ["security"],
"extends": ["plugin:security/recommended"],
"rules": {
"security/detect-eval-with-expression": "error",
"security/detect-non-literal-regexp": "warn",
"security/detect-unsafe-regex": "error",
"security/detect-object-injection": "warn"
}
}
Custom Rules dan False Positive Management
Setiap tool SAST memiliki mekanisme custom rules. Kemampuan menulis aturan sendiri sangat penting karena:
- Domain-specific vulnerabilities: Kerentanan yang spesifik pada framework internal.
- Company security policies: Aturan internal seperti "tidak boleh menggunakan fungsi X".
- Reducing false positives: Menambahkan konteks bisnis untuk menyaring alarm palsu.
Strategi Mengelola False Positive
False positive adalah temuan SAST yang sebenarnya bukan kerentanan. Tanpa manajemen yang baik, developer akan mengalami alert fatigue dan mulai mengabaikan semua temuan.
- Triage Process: Tetapkan proses triage - temuan dari SAST harus ditinjau oleh security champion atau lead engineer sebelum masuk ke backlog.
- Baseline dan Suppression: Untuk proyek warisan (legacy), buat baseline temuan yang sudah diverifikasi sebagai false positive. Hanya fokus pada temuan baru di kode yang berubah.
- Context-Aware Rules: Sesuaikan
severity aturan berdasarkan konteks. Misalnya,
penggunaan
eval()di build script mungkin berisiko rendah, tapi di API endpoint berisiko tinggi. - Automated Deduplication: Banyak tool SAST menghasilkan temuan duplikat untuk satu kerentanan (misalnya satu fungsi yang dipanggil dari 10 tempat). Tool seperti SonarQube atau Fortify SSC memiliki fitur deduplikasi built-in.
- Feedback Loop: Developer harus bisa menandai temuan sebagai false positive dengan alasan yang jelas. Gunakan data ini untuk menyempurnakan aturan.
Integrasi di IDE dengan Pre-commit Hook
Integrasi SAST di IDE memberikan feedback instan kepada developer sebelum kode meninggalkan mesin lokal. Ini adalah implementasi shift-left yang paling awal.
Contoh pre-commit hook menggunakan Semgrep:
File .pre-commit-config.yaml:
repos:
- repo: https://github.com/returntocorp/semgrep
rev: v1.60.0
hooks:
- id: semgrep
args:
- --config=auto
- --config=rules/
- --error
Menggunakan pre-commit framework:
# Instalasi
pip install pre-commit
# Setup
pre-commit install
# Jalankan semua hook
pre-commit run --all-files
Integrasi ESLint security di IDE (VS Code):
VS Code dengan ekstensi ESLint akan langsung menampilkan squiggly lines di baris kode yang melanggar aturan keamanan. Developer bisa langsung memperbaikinya tanpa perlu menjalankan scanning terpisah.
Integrasi SAST di CI/CD Pipeline
Integrasi SAST di pipeline CI/CD memastikan setiap pull request dan push otomatis dipindai. Pipeline akan gagal jika ditemukan kerentanan dengan severity tertentu.
Contoh: Semgrep di GitHub Actions
name: SAST Scan
on:
pull_request:
branches: [main]
push:
branches: [main]
jobs:
semgrep:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Semgrep Scan
uses: semgrep/semgrep-action@v1
with:
config: >-
p/default
p/owasp-top-ten
rules/
auditOn: push
publishToken: ${{ secrets.SEMGREP_APP_TOKEN }}
publishDeployment: ${{ secrets.SEMGREP_DEPLOYMENT_ID }}
Contoh: SonarQube di Jenkins Pipeline
pipeline {
agent any
stages {
stage('SonarQube Analysis') {
steps {
withSonarQubeEnv('SonarQube') {
sh '''
sonar-scanner \
-Dsonar.projectKey=myapp \
-Dsonar.sources=. \
-Dsonar.host.url=$SONAR_HOST_URL \
-Dsonar.login=$SONAR_TOKEN \
-Dsonar.qualitygate.wait=true
'''
}
}
}
}
}
Contoh: CodeQL di GitHub Actions
name: CodeQL Analysis
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
codeql:
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- uses: actions/checkout@v4
- uses: github/codeql-action/init@v3
with:
languages: javascript, python
- uses: github/codeql-action/analyze@v3
Praktik Terbaik SAST
- Jalankan SAST di setiap commit, bukan hanya di malam hari: Semakin cepat umpan balik, semakin cepat perbaikan.
- Gunakan kombinasi tool: Semgrep untuk custom rules cepat, SonarQube untuk quality gate komprehensif, CodeQL untuk deep data flow analysis.
- Sesuaikan severity threshold di pipeline: Pipeline sebaiknya gagal untuk temuan CRITICAL dan HIGH, tapi cukup warn untuk LOW dan MEDIUM.
- Pertahankan baseline kerentanan: Jangan biarkan backlog false positive menumpuk. Lakukan triage secara rutin.
- Edukasi developer: SAST bukan alat untuk menghukum, tapi untuk membantu. Pastikan developer memahami why di balik setiap temuan.
- Lingkungan testing: Pastikan SAST dijalankan dengan konfigurasi yang sesuai - kode testing (unit test, integration test) mungkin memiliki aturan yang lebih longgar.
- Monitoring metrik: Pantau metrik seperti time-to-fix, false positive rate, dan coverage. Ini membantu mengukur efektivitas program SAST.
Kesimpulan
SAST adalah fondasi dari program application security yang solid. Dengan kemampuannya menemukan kerentanan sejak fase pengembangan - bahkan sebelum kode dijalankan - SAST secara dramatis mengurangi biaya perbaikan dan mempercepat siklus rilis yang aman.
Kunci keberhasilan implementasi SAST bukan terletak pada tool yang paling mahal, melainkan pada: (1) aturan yang relevan dengan konteks aplikasi, (2) manajemen false positive yang disiplin, (3) integrasi yang mulus di IDE dan CI/CD, serta (4) budaya tim yang melihat keamanan sebagai tanggung jawab bersama.
Mulailah dengan satu tool - Semgrep untuk custom rules atau SonarQube untuk enterprise grade - perluas cakupan secara bertahap, dan jadikan SAST sebagai kebiasaan, bukan proyek satu kali.