berita

Master Karpathy: Saya memberikan serangan "injeksi SQL" ke model besar, dan itu tidak mudah sama sekali

2024-08-16

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina



Laporan Jantung Mesin

Editor: Du Wei, Zenan

Keamanan model besar dapat dikatakan memiliki “banyak ruang untuk perbaikan.”

Guru AI Andrej Karpathy kembali hadir untuk mempopulerkan ilmu pengetahuan. Kali ini temanya adalah "Menggunakan token khusus untuk melakukan serangan seperti injeksi SQL pada LLM」。

Yang disebut serangan injeksi SQL adalah teknologi serangan jaringan. Penyerang menipu database backend agar mengeksekusi pernyataan SQL berbahaya dengan memasukkannya ke dalam kolom input aplikasi. Jenis serangan ini biasanya mengeksploitasi penanganan masukan pengguna yang tidak tepat oleh aplikasi, seperti tidak memfilter atau menghindari masukan dengan benar, sehingga memungkinkan penyerang mengakses, mengubah, atau bahkan menghapus data dalam database.



Karena meningkatnya kesadaran keamanan masyarakat, injeksi SQL seharusnya tidak terjadi di sebagian besar produk perangkat lunak saat ini.

Namun di dunia model besar, semuanya masih dalam tahap awal. Tokenizer LLM bertanggung jawab untuk menguraikan token khusus (seperti <|endoftext|>, dll.) dalam string input. Meskipun hal ini mungkin terlihat mudah, hal ini dapat menyebabkan salah penilaian dan kerentanan keamanan LLM, yang setara dengan serangan injeksi SQL, dalam kondisi terburuk.

Penting untuk diperhatikan di sini: string masukan pengguna adalah data yang tidak tepercaya.

Dalam injeksi SQL, Anda dapat menggunakan serangan "DROP TABLE" untuk memecahkan kode yang buruk. Masalah yang sama akan ditemui di LLM. Kode yang buruk akan mengurai deskriptor token khusus dari string menjadi token khusus yang sebenarnya, membingungkan representasi masukan, menyebabkan LLM tidak dapat mendistribusikan templat obrolan.

Di bawah ini adalah contoh penggunaan tokenizer default Huggingface Llama 3 saat ini.

Seperti yang Anda lihat, dua situasi tidak intuitif terjadi secara bersamaan:

  • <|begin_of_text|> token (128000) ditambahkan ke depan urutan
  • <|end_of_text|> token (128001) diuraikan dari string dan token khusus dimasukkan. Sekarang teks (mungkin dari pengguna) dapat tertukar dengan protokol token dan menyebabkan LLM gagal didistribusikan, sehingga menghasilkan keluaran yang tidak ditentukan.

Oleh karena itu, Karpathy merekomendasikan untuk selalu menggunakan dua tanda tambahan untuk operasi tokenisasi, menonaktifkan add_special_tokens=False dan split_special_tokens=True, dan menambahkan sendiri token khusus ke dalam kode. Menurutnya penamaan kedua opsi tersebut akan sedikit membingungkan. Untuk model chatnya bisa juga menggunakan template chat apply_chat_template.

Dengan melakukan hal di atas, Anda bisa mendapatkan sesuatu yang lebih tepat untuk dilihat. Misalnya <|end_of_text|> sekarang diperlakukan sebagai rangkaian string lainnya dan dipecah oleh tokenizer BPE yang mendasarinya sama seperti string lainnya.



Karpathy percaya bahwa panggilan untuk pengkodean dan decoding tidak boleh mengurai string untuk menangani token khusus, dan kita perlu menghentikan fungsi ini sepenuhnya. Sebaliknya, ini hanya boleh ditambahkan secara eksplisit dan terprogram melalui jalur kode terpisah. Di tiktoken, selalu gunakan encode_ordinary; di huggingface, lebih aman menggunakan flag yang disebutkan di atas. Setidaknya waspadai masalah ini dan selalu jaga agar token Anda tetap terlihat dan uji kode Anda.

Karpathy percaya bahwa hal-hal ini sangat tidak kentara dan tidak terdokumentasi dengan baik, dan dia memperkirakan sekitar 50% kode sekarang memiliki bug yang disebabkan oleh masalah di atas.

Bahkan ChatGPT, yang telah menjalani pengujian ketat sebelum keluar dari pabriknya, memiliki beberapa masalah aneh. Paling-paling itu hanya menghapus token, paling buruk itu membingungkan LLM dengan cara yang tidak ditentukan. Karpathy tidak tahu apa yang terjadi di balik layar, tapi ChatGPT tidak bisa mengiriminya string <|endoftext|> berulang kali. Jadi berikan perhatian ekstra di sini.



Begitu artikel Andrej Karpathy keluar, langsung ramai diperbincangkan. Seseorang bertanya: Jadi, langkah apa yang perlu diambil pengembang LLM untuk meningkatkan keamanan?

Menurut Karpathy, mudah untuk mengatakannya, selalu tandai string dengan cara "normal", yaitu urutan byte utf8. Hal ini mengingatkan kita pada prinsip "hak istimewa paling rendah" dalam keamanan - pada dasarnya, dengan membatasi fungsionalitas pada hal yang benar-benar diperlukan, Anda meminimalkan kemungkinan terjadinya konsekuensi yang tidak diinginkan.



Beberapa orang juga mengatakan, "Kami sudah bergerak ke arah ini." Lucas Beyer, penulis model VLM PaliGemma dan ilmuwan Google DeepMind, mengatakan bahwa kami telah meningkatkan mekanisme keamanan dalam kode kerja baru, yang akan sedikit merepotkan, terutama ketika mendukung banyak tokenizer, namun secara keseluruhan itu sepadan. Itu juga membuat kodenya lebih mudah.



Beberapa netizen juga bertanya, apa yang terjadi jika kodenya benar, tetapi <|endoftext|> dimasukkan saat data pelatihan?

Karpathy mengatakan jika kodenya benar maka tidak akan terjadi apa-apa. Namun masalahnya adalah banyak kode yang mungkin tidak benar, yang secara diam-diam dapat merusak pandangan dunia model besar.



Apa pendapat Anda tentang masalah baru yang ditemukan Karpathy?

Konten referensi:

https://twitter.com/karpathy/status/1823418177197646104