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=False pada library HTTP (seperti Python requests).
  • Kriptografi rentan: Penggunaan hashlib.md5() atau hashlib.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: WARNING

Eksekusi 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.