Model AI code completion seperti GitHub Copilot sering menyarankan pola kode usang atau tidak aman demi kenyamanan pengembang. Contoh umum meliputi penonaktifan verifikasi sertifikat SSL/TLS (verify=False) untuk mengatasi error handshake lokal, atau penggunaan algoritma hash lemah (MD5/SHA1) untuk token generation. Tanpa filter otomatis, kode ini rawan lolos review.
Vektor Kerentanan Autocomplete AI
Asisten kode generatif mengoptimalkan kelengkapan sintaksis berdasarkan bobot probabilistik, bukan keamanan fungsional. Ada dua pola umum yang sering disarankan:
- Bypass validasi jaringan: Argumen
verify=Falsepada library HTTP (seperti Pythonrequests). - Kriptografi rentan: Penggunaan
hashlib.md5()atauhashlib.sha1()saat membuat identifier unik atau token sementara.
Deteksi Pola dengan Custom Rule Semgrep
Static Application Security Testing (SAST) berbasis aturan sintaksis konkret seperti Semgrep dapat mencegat pola insecure completion sebelum tahap build. Buat file konfigurasi .semgrep/ai-insecure-rules.yml:
rules:
- id: python-insecure-requests-verify-false
patterns:
- pattern: requests.$METHOD(..., verify=False, ...)
message: "Deteksi verify=False pada panggilan requests. Berisiko Man-in-the-Middle (MitM)."
languages: [python]
severity: ERROR
- id: python-weak-hashing-md5
patterns:
- pattern: hashlib.md5(...)
message: "Penggunaan MD5 terdeteksi. Gunakan hashlib.sha256() atau algoritma password hashing (Argon2, bcrypt)."
languages: [python]
severity: WARNINGEksekusi Semgrep Lokal
Uji aturan Semgrep secara lokal terhadap codebase:
semgrep --config=.semgrep/ai-insecure-rules.yml --error --strict .Validasi Deterministik Menggunakan Unit Test Assertion
SAST menganalisis kode secara statis. Validasi dinamis melalui test suite memastikan konfigurasi runtime menolak insecure pattern secara eksplisit. Gunakan Python unittest untuk memverifikasi konfigurasi HTTP client:
import unittest
from unittest.mock import patch
import requests
from app.client import fetch_upstream_data
class TestSecurityAssertions(unittest.TestCase):
@patch("requests.Session.send")
def test_client_enforces_tls_verification(self, mock_send):
# Eksekusi fungsi wrapper client aplikasi
try:
fetch_upstream_data("https://internal-api.lan/resource")
except Exception:
pass
# Verifikasi bahwa request tidak mematikan TLS check
args, kwargs = mock_send.call_args
request_obj = args[0] if args else kwargs.get("request")
verify_setting = kwargs.get("verify", True)
self.assertTrue(
verify_setting is True or isinstance(verify_setting, str),
f"Pelanggaran keamanan: TLS verification dimatikan (verify={verify_setting})"
)Integrasi CI Pipeline (GitHub Actions)
Pasang verifikasi otomatis pada GitHub Actions workflow (.github/workflows/security.yml). Pipeline gagal jika ditemukan rule violation atau assertion error:
name: Security Checks
on:
pull_request:
branches: [main]
jobs:
sast-and-assertions:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install semgrep requests
- name: Run Semgrep SAST
run: semgrep --config=.semgrep/ai-insecure-rules.yml --error .
- name: Run Test Assertions
run: python -m unittest discover -s tests -p "test_*.py"Trade-off dan Limitasi
Semgrep memproses pattern matching berbasis AST (Abstract Syntax Tree), meminimalkan false positive dibanding regex biasa. Namun, SAST tidak dapat melacak nilai variabel dinamis jika konfigurasi verify=False di-load dari dictionary dinamis atau file eksternal tanpa taint tracking (Semgrep Pro engine). Unit test assertion deterministik menutup celah ini dengan menguji objek aktual saat eksekusi.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!