Bayangkan skenario ini: tim Anda baru saja mengunduh model machine learning (ML) terbaru dari repositori populer untuk diintegrasikan ke dalam sistem. Proses loading pun berjalan lancar. Namun, tanpa disadari, alih-alih hanya memuat bobot dan arsitektur model, Anda justru telah membuka pintu bagi penyerang untuk mengendalikan sistem. Ini bukanlah fiksi ilmiah, melainkan ancaman nyata yang disebut sebagai supply chain attack pada AI/ML .

Mengapa Loading Model Sama Berbahayanya dengan Menjalankan Kode?

Prinsip keamanan fundamental yang sering terabaikan adalah: memuat model ML pada dasarnya setara dengan menjalankan kode dari sumber yang tidak dikenal . Mengapa demikian? Karena format serialisasi yang umum digunakan, seperti pickle Python, tidak hanya menyimpan data, tetapi juga instruksi yang dapat dieksekusi.

Ketika Anda menjalankan fungsi pickle.load() atau torch.load() pada file model, proses deserialisasi dapat memicu eksekusi kode arbitrer yang tertanam dalam file tersebut . Penyerang dapat memanfaatkan celah ini untuk:

  • Memasang backdoor atau ransomware .

  • Mengeksfiltrasi data sensitif dari lingkungan Anda .

  • Melakukan gerakan lateral ke sistem lain dalam jaringan .

Risiko ini semakin krusial mengingat maraknya platform berbagi model seperti Hugging Face, di mana masih banyak model (44.9% dari model populer) yang menggunakan format pickle yang tidak aman .

Celah Keamanan di Balik Layar

Bahkan ketika Anda merasa sudah berhati-hati, ancaman bisa datang dari celah yang tidak terduga. Sebuah penelitian mengungkapkan bahwa persepsi keamanan seringkali tidak sesuai dengan kenyataan. Sebanyak 73% praktisi ML merasa lebih aman memuat model dari hub terkenal, namun alat pemindai keamanan di platform tersebut terkadang gagal mendeteksi model berbahaya .

Beberapa kerentanan spesifik yang ditemukan antara lain:

  1. Keras safe_mode yang Tidak Konsisten: Parameter safe_mode=True pada Model.load_model Keras ternyata diabaikan secara diam-diam saat memuat file .h5 lawas, menciptakan ilusi keamanan . Bahkan, kerentanan lain (CVE-2025-9906) menunjukkan bahwa safe_mode dapat dinonaktifkan secara paksa oleh file .keras yang dirancang khusus .

  2. Fungsi Internal yang Disalahgunakan: Serangan tidak selalu harus berupa kode pickle eksplisit. Peneliti menemukan bahwa fungsi internal Keras (seperti keras.utils.get_file) dapat disalahgunakan untuk mengunduh dan menimpa file berbahaya, seperti authorized_keys untuk akses SSH .

  3. Teknik Evasi nullifAI: Penyerang menggunakan file pickle yang sengaja “rusak” untuk lolos dari pemindaian (misalnya, Picklescan). Malware dijalankan pada saat deserialisasi, lalu file tersebut “rusak” untuk menghindari deteksi lebih lanjut .

  4. lmdeploy dan weights_only: Framework lmdeploy ditemukan rentan terhadap RCE karena memanggil torch.load() tanpa parameter keamanan weights_only=True, sebuah pola tidak aman yang telah diketahui .

Strategi Praktis Mengamankan Loading Model

Untuk memitigasi risiko, organisasi perlu mengadopsi pendekatan berlapis yang mencakup kebijakan, teknologi, dan proses.

1. Perlakukan Model sebagai Kode (Zero Trust)

Prinsip utama: jangan pernah memuat model dari sumber yang tidak terpercaya tanpa verifikasi. Prinsip ini berlaku untuk semua framework, termasuk PyTorch, TensorFlow/Keras, dan Apache Spark .

  • Verifikasi Sumber dan Integritas: Hanya gunakan model dari sumber resmi dan terverifikasi. Selalu verifikasi hash kriptografi (seperti SHA-256) untuk memastikan model tidak dirusak selama perjalanan .

  • Isolasi (Sandboxing): Jalankan proses loading dan inferensi model dalam lingkungan yang terisolasi (misalnya, container terbatas) untuk membatasi dampak jika terjadi serangan .

  • Kebijakan Pembaruan: Pastikan semua framework ML (PyTorch, Keras, dll.) dan dependensi selalu diperbarui ke versi terbaru yang mencakup tambalan keamanan .

2. Pilih Format yang Lebih Aman: SafeTensors

Langkah paling efektif adalah beralih dari format pickle ke SafeTensors. Ini adalah format serialisasi yang dirancang khusus untuk keamanan dengan hanya menyimpan data tensor murni, tanpa kode yang dapat dieksekusi . Jika memungkinkan, ini harus menjadi standar untuk proyek baru .

3. Amankan Kode dengan weights_only dan Analisis Statis

  • Gunakan weights_only=True: Untuk PyTorch, selalu gunakan parameter weights_only=True pada torch.load(). Ini secara signifikan membatasi apa yang dapat dimuat, meskipun masih memiliki keterbatasan .

  • Analisis Kode Statis (SAST): Integrasikan alat seperti Semgrep atau CodeGuru ke dalam CI/CD untuk secara otomatis mendeteksi pola pemanggilan fungsi pickle.load() atau torch.load() yang tidak aman di kode Anda .

4. Terapkan Enforcements dan Alat Keamanan

  • Allowlist Import (Fickling): Alat seperti Fickling memungkinkan Anda untuk melakukan monkey-patch pada modul pickle dan menerapkan allowlist impor. Hanya pustaka ML yang dikenal (NumPy, PyTorch, dll.) yang diizinkan untuk diimpor selama deserialisasi. Ini secara efektif memblokir kode berbahaya yang mencoba mengimpor modul sistem (misalnya, ossubprocess.

  • Solusi Canggih (PickleBall): Untuk keamanan yang lebih ketat dengan kompatibilitas tinggi, pertimbangkan pendekatan seperti PickleBall. Alat ini secara statis menganalisis kode Anda untuk menghasilkan kebijakan yang aman dan spesifik, lalu menegakkannya secara dinamis. Penelitian menunjukkan ini dapat memuat 79.8% model aman dan memblokir 100% contoh berbahaya .

Kesimpulan

Mengamankan proses loading model ML adalah tantangan baru dalam rantai pasok perangkat lunak. Kesadaran bahwa memuat model sama dengan menjalankan kode adalah langkah pertama dan paling penting. Dengan menerapkan kebijakan zero-trust, memilih format yang aman (seperti SafeTensors), menggunakan alat analisis statis, dan menerapkan enforcement saat runtime, organisasi dapat secara signifikan mengurangi permukaan serangan dan melindungi infrastruktur mereka dari ancaman yang terus berkembang.