Menjalankan benchmark evaluasi model AI (seperti harness pada repositori komunitas benchflow-ai/awesome-evals) memerlukan eksekusi prompt yang tidak tepercaya terhadap model dengan kemampuan eksekusi kode atau tool calling. Risiko terbesar dari pipeline ini adalah serangan indirect prompt injection yang memaksa agen membocorkan API key penyedia LLM (OpenAI, Anthropic) atau mengeksfiltrasi data sensitif ke server penyerang melalui network egress.
Untuk memitigasi vektor serangan ini, pipeline evaluasi harus menerapkan prinsip defense-in-depth: membatasi masa berlaku credential, memblokir lalu lintas keluar yang tidak sah, dan menghapus secret dari log hasil benchmark sebelum disimpan sebagai artifact.
Vektor Ancaman pada Runner Evaluasi AI
Runner evaluasi umumnya mengeksekusi dataset eksternal yang dapat berisi instruksi berbahaya. Dua skenario eksfiltrasi yang paling umum meliputi:
- SSRF dan Out-of-Band Exfiltration: Prompt memanipulasi agen yang memiliki akses shell atau HTTP client untuk mengirim token lingkungan (
$OPENAI_API_KEY) ke endpoint milik penyerang. - Artifact Leakage: Agen mencetak konfigurasi runtime atau payload respons model yang mengandung raw token ke
stdout/stderr, yang kemudian disimpan langsung oleh sistem CI/CD ke storage publik.
1. Injeksi Ephemeral Secret Menggunakan HashiCorp Vault
Menyimpan static API key pada environment runner CI/CD membuka celah eksfiltrasi jangka panjang. Gunakan ephemeral credential via Vault Token Helper atau short-lived AppRole token yang masa berlakunya dibatasi persis selama durasi eksekusi suite evaluasi.
#!/usr/bin/env bash
set -euo pipefail
# 1. Login menggunakan ephemeral role ID yang di-inject via CI runtime
export VAULT_TOKEN=$(vault write -field=token auth/approle/login \
role_id="${CI_EVAL_ROLE_ID}" \
secret_id="${CI_EVAL_SECRET_ID}")
# 2. Ambil token penyedia LLM dengan TTL 15 menit
LLM_SECRET_JSON=$(vault kv get -format=json -mount=secret llm/eval-keys)
OPENAI_API_KEY=$(echo "${LLM_SECRET_JSON}" | jq -r '.data.data.OPENAI_API_KEY')
export OPENAI_API_KEY
# 3. Jalankan harness evaluasi dalam subshell terisolasi
python -m evals_harness.run --benchmark benchflow-ai/swe-bench --output-dir ./results
# 4. Revoke token segera setelah eksekusi selesai
vault token revoke -self
Pendekatan ini memastikan jika prompt berhasil mengekstraksi nilai token via OOB channel, token tersebut invalid saat dieksploitasi di luar window eksekusi pipeline.
2. Filtering Network Egress: Membatasi Koneksi Runner
LLM evaluator hanya membutuhkan akses ke API endpoint resmi (misal: api.openai.com atau host inference lokal). Matikan rute publik default pada runner container dan gunakan kontrol firewall berbasis iptables atau forward-proxy ketat seperti Envoy/Squid.
Konfigurasi Linux iptables pada Host Runner
Terapkan aturan drop-all untuk egress, kecuali untuk DNS internal dan IP endpoint LLM:
# Flush rule egress bawaan
iptables -F OUTPUT
iptables -P OUTPUT DROP
# Izinkan loopback
iptables -A OUTPUT -o lo -j ACCEPT
# Izinkan DNS lookup terbatas ke resolver lokal/internal
iptables -A OUTPUT -p udp --dport 53 -d 10.0.0.2 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -d 10.0.0.2 -j ACCEPT
# Izinkan koneksi established dan related
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Izinkan HTTPS ke IP range provider (disarankan menggunakan HTTP Proxy terotentikasi)
iptables -A OUTPUT -p tcp --dport 443 -d 10.100.0.0/16 -j ACCEPT
Catatan: Jika provider LLM menggunakan dynamic CDN IP, gunakan proxy forward (misal: Squid) dengan konfigurasi domain whitelisting ketat (misal:.openai.com,.anthropic.com) dan paksa runner menggunakan variabel lingkunganHTTP_PROXY/HTTPS_PROXY.
3. Sanitasi Log Artifact dan Reporting Benchmark
Harness evaluasi sering kali membuang log eksekusi, prompt history, dan stack trace ke format JSON/JSONL. Bila evaluasi memicu exception API, traceback sering menampilkan nilai header Authorization: Bearer sk-....
Gunakan script sanitasi pre-upload untuk membersihkan pattern token sebelum data diunggah ke object storage atau CI artifact storage.
import re
import sys
from pathlib import Path
TOKEN_PATTERNS = [
re.compile(r'sk-[a-zA-Z0-9]{20,T3BlbkFJ[a-zA-Z0-9]{20,}'), # OpenAI patterns
re.compile(r'sk-ant-[a-zA-Z0-9_-]{20,}'), # Anthropic patterns
re.compile(r's\.[a-zA-Z0-9]{24}'), # Vault ephemeral tokens
]
def sanitize_file(file_path: Path) -> None:
content = file_path.read_text(encoding='utf-8')
modified = False
for pattern in TOKEN_PATTERNS:
if pattern.search(content):
content = pattern.sub('[REDACTED_API_KEY]', content)
modified = True
if modified:
file_path.write_text(content, encoding='utf-8')
print(f"Sanitized secret from: {file_path}")
def main(target_dir: str):
results_path = Path(target_dir)
for ext in ('*.json', '*.jsonl', '*.log', '*.txt'):
for log_file in results_path.rglob(ext):
sanitize_file(log_file)
if __name__ == '__main__':
if len(sys.argv) < 2:
sys.exit(1)
main(sys.argv[1])
Trade-offs dan Pertimbangan Operasional
- Proxy Latency vs Security: Inspeksi egress melalui forward proxy TLS-decrypting menambah overhead beberapa milidetik per query. Ini dapat sedikit menggeser metrik latensi pada benchmark yang menguji response time token.
- Failure Handling: Jika proses sanitasi log crash, seluruh step deployment artifact harus diset fail-closed (gagalkan pipeline) agar log kotor tidak lolos ke remote storage.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!