Ada pola yang mulai terasa membosankan di dunia keamanan developer: tool AI coding yang menjanjikan produktivitas, lalu ketahuan mengirim data workspace ke cloud tanpa izin yang benar-benar paham. Terakhir CrowdSec yang source code-nya bocor, sekarang ZCode, desktop app AI coding resmi dari Zhipu, yang dibedah oleh seorang peneliti dan hasilnya bikin banyak developer geleng-geleng kepala.
TL;DR
- ZCode, aplikasi AI coding dari Zhipu, ditemukan memaketkan seluruh workspace pengguna termasuk riwayat commit lengkap setiap kali login dan mengunggahnya ke cloud.
- Investigasi dimulai dari direktori ~/.zcode berukuran lebih dari 700MB, dengan arsip 313MB dari proyek komersial berstatus gagal upload hingga 564 kali, sementara satu repo publik berisi 538 file tercatat diterima server.
- Dari satu snapshot berisi 42.411 file, direktori .git mencakup 86,6 persen payload, terdiri dari cache LFS 196,1MB dan objek commit 102,2MB.
- Kunci enkripsi snapshot dipegang server, dan toggle di antarmuka aplikasi terbukti tidak menghentikan proses pengemasan dan pengunggahan.
- Proteksi yang direkomendasikan adalah mengunci direktori snapshot (misalnya chattr +i di Linux), memisahkan user account, dan merotasi kredensial yang pernah masuk riwayat Git.
Seperti dilaporkan di blog ferstar.org (18 September 2026, dengan update respons perusahaan sehari kemudian), aplikasi tersebut memaketkan seluruh workspace pengguna setiap kali login. Bukan cuma file yang sedang diedit, tetapi riwayat commit lengkap, cache LFS, reflog, sampai konfigurasi global aplikasi. Artikel ini merangkum temuannya, apa yang sudah dikonfirmasi, apa yang masih jadi tanda tanya, dan langkah proteksi yang bisa langsung dipraktikkan.
Awal Mula: 700MB yang Mencurigakan di Home Directory
Investigasi ini bermula dari hal paling membosankan sedunia: kehabisan ruang disk. Sang penulis sedang membereskan file ketika menemukan direktori ~/.zcode menempati lebih dari 700MB. Setelah dibedah, komposisinya kurang lebih begini:
cli/sekitar 257MB, berisi database sesi dan log eksekusicomputer-use/sekitar 130MB, berisi app dan dependency runtime yang dibundelv2/checkpoints/sekitar 303MB, dan inilah tersangka utamanya
Di folder checkpoints itulah ditemukan arsip 313MB dari proyek komersial milik pengguna yang statusnya menggantung di antrean upload, dengan penghitung kegagalan mencapai 564 kali. Satu proyek memang gagal kirim. Tapi di situlah bagian yang bikin tidak nyaman: workspace lain, berupa repo publik berisi 538 file (sekitar 15KB setelah dikompres dan dienkripsi), berstatus diterima server. Jadi pertanyaan "apakah data benar-benar pernah keluar dari mesin" sudah terjawab: ya, minimal yang satu itu.
Peneliti lain kemudian mereproduksi pola yang sama di Windows, menemukan struktur direktori dan file state yang serupa, termasuk beberapa workspace kecil tanpa catatan kegagalan yang tampak lolos upload. Artinya ini bukan artefak satu mesin atau satu sistem operasi.
Isi Paketnya: 86 Persen adalah Folder .git
Yang membuat kasus ini berbeda dari sekadar aplikasi yang menyimpan telemetri adalah isi paketnya. Manifest (daftar isi file) dari proses pengemasan tersimpan dalam bentuk plaintext di lokal, sehingga bisa diaudit tanpa membongkar enkripsi. Salah satu snapshot berisi 42.411 file dengan komposisi kurang lebih begini:
.git/lfs/sebesar 196,1MB atau 56,8 persen, cache LFS berisi semua aset biner dan media besar yang pernah diunduh.git/objects/sebesar 102,2MB atau 29,6 persen, storage objek commit, tree, dan blob yang lengkap.git/logs/sebesar 0,6MB, reflog yang menyimpan jejak operasi lokal termasuk hal-hal yang belum sempat di-push- Sisanya sekitar 46,2MB atau 13,4 persen baru kode sumber dan dokumen
Ditotal, direktori .git saja mencakup 86,6 persen dari payload. Ini poin yang sering salah dipahami developer: bagi pihak yang tidak seharusnya punya akses, riwayat Git sering jauh lebih berharga daripada kode hari ini. Diff lama menyimpan kredensial yang sudah dirotasi, URL internal, pola arsitektur, komentar commit yang membocorkan nama klien, sampai jejak branch proyek yang dibatalkan.
Kunci Enkripsi Ada di Tangan Server
Ada argumen pembelaan yang muncul: datanya dienkripsi kok. Sang peneliti menyebut sisi ironisnya. Untuk skenario checkpoint restore atau sinkronisasi antar perangkat, kunci semestinya hidup di sisi klien, persis seperti Git atau Time Machine yang bisa berjalan end-to-end. Dalam kasus ini, kunci justru dipegang server. Fungsi satu-satunya kunci di sisi server adalah memastikan server bisa membaca kode kapan pun ia mau.
Manifest plaintext memperkuat pembacaan itu: infrastruktur paket ini dirancang agar sisi server tahu persis apa yang dikemas, bahkan kalau isinya terenkripsi.
Toggle di UI Tidak Menghentikan Upload
Bagian yang paling mengganggu untuk soal consent: switch dan toggle pengaturan di antarmuka aplikasi terbukti tidak menghentikan proses pengemasan dan pengunggahan. Mengosongkan opsi di UI bukan mekanisme opt-out. Kebijakan privasi yang diarsipkan penulis pada 18 September juga tidak menggambarkan perilaku ini dengan jelas.
Respons perusahaan datang sehari kemudian lewat pembaruan di blog yang sama. Versi 3.14.0 disebut mengubah perilaku dibanding 3.12.3 yang dibedah, endpoint pengunggahan dilaporkan sudah tidak aktif (mengembalikan 404), dan ada klaim data tidak disimpan. Tapi beberapa pertanyaan penting masih menggantung, dan penulis aslinya sendiri merincinya dengan jujur:
- Bagaimana membuktikan klaim "langsung dihancurkan" dari luar?
- Apakah snapshot lama yang sudah terlanjur ada di cloud benar-benar dimusnahkan secara fisik, dan siapa yang memegang hak dekripsi?
- Klaim restore checkpoint agak bertabrakan dengan klaim data tidak disimpan; jadi apa yang sebenarnya tertinggal?
- Kalau benar akan open-source, apakah yang dirilis termasuk sisi upload lama yang bermasalah, atau hanya kode bersih versi terkini?
Sampai pertanyaan-pertanyaan itu dijawab dengan bukti yang bisa diaudit, posisi paling aman untuk pengguna adalah menganggap data workspace pernah keluar.
Cara Proteksi Diri: Jangan Hapus, Kunci Direktori
Rekomendasi penulis blog tersebut cukup tajam: menghapus file hasil snapshot saja tidak cukup, karena aplikasinya membuat ulang, persis permainan pukul tikus. Yang bertahan adalah mengunci direktorinya sehingga proses pengemasan gagal menulis, sekaligus berfungsi sebagai tripwire: begitu muncul error atau file baru lagi di sana, lo tahu aplikasinya mencoba mengulang.
Pola umumnya di Linux dan macOS: buat file pengganti di path target atau set permission direktori menjadi read-only untuk user lo. Di Linux, atribut immutable via chattr +i membuat file kebal terhadap perubahan sampai atributnya dilepas manual. Di macOS dan Windows ada padanan ACL-nya yang dibahas di komunitas yang mengutip riset ini. Semua ini mitigasi teknis, bukan pengganti keputusan yang lebih mendasar.
Langkah yang lebih mendasar, dan sebenarnya sudah lama jadi hygiene standar:
- Jalankan tool AI coding di user account terpisah atau environment terisolasi dengan home directory yang bersih dari kredensial.
- Jangan login tool coding AI apa pun dengan mesin yang menyimpan seluruh repo pekerjaan sensitif tanpa pemisahan.
- Perlakukan setiap
~/.namatoolyang tiba-tiba membengkak sebagai barang bukti: bedah sebelum hapus. - Rotasi kredensial yang pernah ada di riwayat Git lo, karena riwayat itu panjang umurnya, bahkan setelah lo force push.
💬 Komentar (0)
Belum ada komentar. Jadilah yang pertama! 💬