Skip to main content
BlogSecurity

Slopsquatting 2026: Rate Halusinasi Package dan 127 Nama

Uji ulang Mei 2026 pada lima model frontier menemukan rate halusinasi package 4,62% sampai 6,10%, tetapi 127 nama dikarang oleh kelimanya. Apa yang perlu di-gate.

Matthews Wong

Software Engineer

Oktober 202612 menit baca
Slopsquatting 2026: Rate Halusinasi Package dan 127 Nama

Ringkasan Utama

Slopsquatting, yaitu mendaftarkan malware dengan nama package yang dikarang model AI, belum hilang. Uji ulang 2026 pada lima model frontier mengukur rate halusinasi 4,62% sampai 6,10%, turun dari rentang 5,2% sampai 21,7%, tetapi 127 nama dikarang oleh kelimanya dan 53 masih bisa didaftarkan. Verifikasi keberadaan, umur, dan hash sebelum install apa pun.

Hal pertama yang saya lakukan setelah membaca paper ini adalah menjalankan nama Python yang paling sering dihalusinasikan ke endpoint JSON PyPI. Delapan nama, delapan respons 404. Itulah seluruh serangannya dalam satu layar: perintah package manager yang dengan senang hati ditulis asisten, menunjuk ke nama yang belum dimiliki siapa pun.

Post ini membaca arXiv 2605.17062, replikasi studi slopsquatting USENIX Security 2025 pada lima model 2026, cukup dekat untuk memisahkan apa yang benar-benar diukur dari apa yang dibuat oleh judul berita. Setiap angka di bawah berasal dari paper itu, dari halaman studi aslinya, atau dari perintah yang saya jalankan pada 17 Oktober 2026. Separuh kedua adalah gate pra-install yang bisa Anda tempel ke repository.

Rentangnya menyempit, batas bawahnya tidak bergeser

Studi asli oleh Spracklen dan kolega menghasilkan 576.000 sampel kode dari 16 model, dan menemukan bahwa minimal 5,2% output model komersial dan 21,7% output model open-source menyebut package yang tidak ada. Replikasi oleh peneliti independen Aleksandr Churilov menjalankan ulang dataset prompt yang sama pada lima model yang dirilis antara Oktober 2025 dan Maret 2026: 199.845 generasi, tiap package divalidasi terhadap daftar nama PyPI dan npm. Rate keseluruhan berada di antara 4,62% untuk Claude Haiku 4.5 dan 6,10% untuk GPT-5.4-mini.

Bacalah ini sebagai rentang yang menyempit, bukan batas bawah yang lebih aman. Selisih terbaik dan terburuk turun dari 16,5 poin persentase menjadi 1,48, terutama karena model open-weight dalam kohort, DeepSeek V3.2, tidak lagi tertinggal dari model komersial. Namun grafik paper itu sendiri mencatat bahwa tidak ada model 2026 yang mengalahkan hasil terbaik 2024, yaitu 3,6% untuk GPT-4 Turbo. Ekor yang buruk menghilang; ujung yang baik tidak membaik.

Rate halusinasi per model menurut bahasa, dalam persen, dari Tabel 2 replikasi.

ModelPythonJavaScriptKeseluruhan
Claude Haiku 4.55.492.764.62
Claude Sonnet 4.66.632.625.41
Gemini 2.5 Pro6.753.615.80
DeepSeek V3.26.693.785.89
GPT-5.4-mini7.273.146.10

Pemisahan per bahasa adalah kejutannya. Setiap model lebih banyak berhalusinasi di Python daripada JavaScript, selisih 2,73 sampai 4,13 poin persentase, yang membalik temuan 2024 bahwa npm ekosistem yang lebih berisik. Dugaan penulis, nama Python punya lebih banyak cara untuk tampak masuk akal tetapi salah: aws-cdk, aws_cdk, dan aws-cdk-lib semuanya ada dengan arti berbeda. Mereka menandainya sebagai hipotesis, bukan hasil.

Apa yang diukur angka itu, dan apa yang tidak

Metodenya sengaja lama. Satu sampel per prompt, pengaturan sampling default, ekstraksi regex untuk baris pip install, npm install, import, dan require, dan sebuah nama dihitung halusinasi hanya jika tidak ada di master list yang dikirim bersama artifact 2025. Penolakan dan balasan yang tidak bisa di-parse dikeluarkan dari penyebut, sehingga model yang lebih sering menolak bisa tampak lebih baik atau lebih buruk dari perilakunya.

Penulis mencantumkan batasan yang penting jika Anda menimbang seberapa percaya pada 4,62%. GPT-5.4-mini dijalankan pada reasoning effort minimal dan menolak 32,14% prompt, jadi rate-nya berdiri di atas penyebut yang timpang. Alias deepseek-chat mengembalikan identifier deepseek-v4-flash pada metadata respons selama pengujian, sehingga label V3.2 adalah sebuah catatan kehati-hatian. Korpus prompt sudah publik sejak Januari 2025 dan mungkin bocor ke data training, yang akan membiaskan rate ke bawah. Dan tidak ada setup agentic dengan tool use atau retrieval yang diuji, padahal di sana model bisa mengecek nama sebelum menulisnya.

Celah terakhir itulah yang akan saya awasi. Jika asisten Anda mengecek registry sebelum menyarankan install, rate di paper ini tidak menggambarkan Anda. Jika ia menjawab dari ingatan di jendela chat, rate itu menggambarkan Anda.

127 nama yang dikarang semua model, 53 bisa diambil penyerang

Kontribusi paling berguna dari paper ini adalah sebuah irisan. Mengambil hanya nama yang dihalusinasikan kelima model, setelah noise filter, menyisakan 127: 109 di PyPI dan 18 di npm. Penulis mengungkapkan daftar lengkap ke PyPI Security dan Socket.dev pada 29 April 2026. Aturan prohibited-name dan normalisasi PyPI menyisakan 41 dari 109 yang bisa didaftarkan. Review Socket membuang enam dari 18 nama npm, tersisa 12. Itu 53 nama, 41 ditambah 12, yang bisa didaftarkan satu penyerang sekali dan menjangkau pengguna semua provider.

Nama karangan (PyPI)Jumlah lintas modelYang mungkin dimaksud model
aws-cdk429package aslinya aws-cdk-lib
objc375package aslinya pyobjc
opentelemetry374package aslinya opentelemetry-api dan opentelemetry-sdk
rest-framework315package aslinya djangorestframework
tencentcloud215package aslinya tencentcloud-sdk-python

Dua mekanisme menjelaskan mengapa model berbeda sepakat pada jawaban yang salah. Tutorial dan blog yang salah menamai package, misalnya memakai rest_framework seolah itu nama install, menjadi sinyal training bersama. Dan model terlalu menggeneralisasi konvensi penamaan, seperti scope npm, ke hal yang tidak dipublikasikan sebagai package mandiri: empat nama @ember adalah halusinasi universal tetapi berada di scope yang hanya dikontrol Ember, makanya Socket menandainya tidak bisa dieksploitasi. Paper juga mencatat bahwa dari nama Python teratas, banyak yang berjarak edit 2 dari package asli, sehingga typo-squat yang sudah ada bisa menangkap kesalahan yang sama.

Mengapa 4 sampai 7 persen tetap serangan yang ekonomis

Hitungan paper itu lugas. Pada rate terendah yang teramati, sapuan 39.969 prompt per model menghasilkan lebih dari 1.300 penyebutan halusinasi, yang memetakan ke beberapa ratus nama unik. Upload ke PyPI atau npm gratis, dan penulis menyebut biaya API untuk seluruh sapuan lima model sebesar 860,90 USD. Bagi penyerang titik impasnya jauh di bawah 1%, jadi ancaman tidak bergantung pada rate yang tinggi.

Dua temuan mereka memperburuk posisi defender. Prompt sintetis, yang dibuat model lain, menghasilkan lebih banyak halusinasi daripada pertanyaan Stack Overflow yang dikurasi, sehingga penyerang yang membangun kumpulan prompt untuk memaksimalkan panen akan mengumpulkan lebih banyak daripada survei yang memakai pertanyaan organik. Dan biaya satu nama universal adalah satu pendaftaran, sementara jangkauannya adalah gabungan pengguna semua provider.

Kegagalannya: menganggap rate yang turun sebagai risiko yang turun

Kesalahan yang saya lihat saat hasil ini diulang-ulang adalah aritmetika yang keliru. Rate per model turun, jadi orang menyimpulkan eksposur turun. Eksposur adalah jumlah nama yang bisa didaftarkan dan akan dikeluarkan asisten dengan yakin, dikalikan berapa banyak install yang terjadi tanpa dibaca manusia. Suku pertama adalah 53 dan bukan nol; suku kedua tumbuh dalam delapan belas bulan yang sama ketika agent mulai menjalankan install sendiri.

404 pada sebuah nama package bukan tanda aman, dan 200 juga bukan. Penulis menyatakan angka 53 adalah estimasi pada satu titik waktu terhadap kondisi registry April 2026, dan sebagian nama kini sudah menjadi package nyata. Nama yang ada hari ini bisa saja didaftarkan minggu lalu oleh orang yang membaca paper yang sama. Periksa keberadaan dan umur sekaligus.

Saya menjalankan pengecekan sendiri pada 17 Oktober 2026 terhadap delapan nama PyPI dari tabel nama paling sering dihalusinasikan di paper: aws-cdk, objc, opentelemetry, rest-framework, tencentcloud, mpl-toolkits, opengl, dan openstack. Endpoint JSON PyPI mengembalikan 404 untuk kedelapannya. Dari situ saya tidak bisa menyimpulkan apakah masing-masing bisa didaftarkan, karena PyPI memblokir sebagian nama lewat aturan. Hasilnya hanya memberi tahu bahwa perintah yang ditulis model-model ini untuk nama tersebut masih gagal di-resolve, yaitu hasil yang aman dan hanya berjarak satu pendaftaran baru dari tidak aman.

Gate pra-install: keberadaan, umur, hash

Tiga kontrol murah yang saling melengkapi. Pertama, tolak dependency yang tidak dikenal registry atau baru dikenal belakangan. API JSON PyPI mengembalikan upload time per file, jadi umur upload pertama cukup satu request. Kedua, pin dengan hash agar install hanya mengambil artifact yang sudah di-resolve manusia. Mode hash-checking pip bersifat semua-atau-tidak: begitu satu requirement punya hash, setiap requirement harus punya, dan masing-masing harus di-pin dengan == atau URL. Ketiga, beri resolver masa tunggu. exclude-newer pada uv menerima durasi seperti 7 days atau timestamp RFC 3339, dan membandingkan dengan upload time tiap file.

Berikut pengecekan yang saya tulis untuk kontrol pertama. Ini Python stdlib, memperlakukan project yang tidak ada sebagai blokir, dan memblokir apa pun yang file paling awalnya berumur kurang dari 30 hari. Angka 30 itu pilihan saya, bukan dari paper; sesuaikan dengan toleransi Anda.

# check_pypi_first_upload.py - run on names an assistant proposes,
# BEFORE they reach requirements.txt. Standard library only.
import json, sys, urllib.request, urllib.error
from datetime import datetime, timezone

MIN_AGE_DAYS = 30

def first_upload(name):
    url = f"https://pypi.org/pypi/{name}/json"
    try:
        with urllib.request.urlopen(url, timeout=15) as r:
            data = json.load(r)
    except urllib.error.HTTPError as e:
        if e.code == 404:
            return None
        raise
    times = [
        f["upload_time_iso_8601"]
        for files in data["releases"].values()
        for f in files
    ]
    return min(datetime.fromisoformat(t.replace("Z", "+00:00")) for t in times)

for name in sys.argv[1:]:
    first = first_upload(name)
    if first is None:
        print(f"BLOCK  {name}: not on PyPI (hallucinated?)")
        continue
    age = (datetime.now(timezone.utc) - first).days
    verdict = "BLOCK" if age < MIN_AGE_DAYS else "ok   "
    print(f"{verdict}  {name}: first upload {first:%Y-%m-%d}, {age} days old")

Jalankan terhadap nama yang diusulkan asisten sebelum masuk ke file requirements, bukan sesudahnya. Dua kontrol lainnya ada di file di bawah.

# requirements.in  (human-reviewed, loose)
httpx>=0.27

# Resolve once, with hashes (pip-compile comes from the pip-tools package). Every transitive dependency is pinned with ==
# and gets sha256 lines, which is what hash-checking mode demands.
pip-compile --generate-hashes -o requirements.txt requirements.in

# Deploy: --require-hashes turns "a dependency has no hash" into an error.
# Without it, hash checking only switches on if some line happens to carry one.
pip install --require-hashes -r requirements.txt

# pyproject.toml - uv: ignore any file uploaded in the last week.
# uv compares against each file's upload time, not the version's release date.
[tool.uv]
exclude-newer = "7 days"
# Per-package override, or false to exempt a package from the global cutoff:
# exclude-newer-package = { internal-tool = false }

Perhatikan apa yang tidak bisa dilakukan pengaturan masa tunggu. Ia memfilter berdasarkan upload time, jadi menahan package yang didaftarkan kemarin, tetapi squatter yang mendaftarkan nama halusinasi berbulan-bulan lalu dan menunggu akan lolos. Itu batas kontrolnya, makanya hash dan review tetap ada dalam stack.

Apa yang dihentikan tiap kontrol, dan apa yang lolos

KontrolMenghentikanMeloloskan
Cek keberadaan dan upload pertamaNama yang tidak ada, dan nama yang didaftarkan beberapa minggu terakhirSquat yang didaftarkan lama, dan nama sah yang diambil alih kemudian
pip --require-hashesSubstitusi diam-diam setelah lock di-resolve; artifact yang berubahPackage berbahaya yang Anda hash sendiri saat pertama kali ditambahkan
uv exclude-newerRilis yang baru diunggah masuk ke resolverApa pun yang diunggah sebelum cutoff, termasuk squat lama
Review manusia untuk setiap dependency baruNama lintas model, karena orang akan bertanya mengapa package ini adaKelelahan reviewer saat agent menambah dependency dalam jumlah besar
Agent dengan lookup registry sebelum installTebakan dari ingatan saja, setelan yang diukur paperTidak diukur paper ini; penulis mencantumkannya sebagai pekerjaan lanjutan

Aturan review paling murah dan bernilai tinggi adalah aturan diff: setiap pull request yang menambah nama ke file lock atau requirements wajib punya reviewer. Nama karangan teratas di paper tampak masuk akal sekilas, dan itulah alasan mereka berhasil.

Yang dikerjakan hari Senin

Tidak satu pun dari ini butuh tim platform. Mulai dari tempat asisten menulis perintah install untuk Anda, lalu melebar.

  1. Tambahkan cek keberadaan dan umur ke langkah pre-commit atau CI untuk perubahan requirements dan package.json, dan gagalkan jika nama tidak ada atau sangat baru.
  2. Pindahkan deploy Python ke hashed requirements dan tambahkan --require-hashes agar dependency tanpa hash menjadi error, bukan kejutan.
  3. Atur exclude-newer di project uv ke jendela pendek seperti 7 days, dan kecualikan package tertentu per project dengan exclude-newer-package hanya bila ada alasannya.
  4. Katakan pada tim bahwa perintah install dari jendela chat hanyalah saran. Agent yang menjalankan install tanpa pengawasan harus me-resolve nama ke registry terlebih dahulu.
  5. Jalankan ulang cek keberadaan pada file lock tiap kuartal, karena angka 53 adalah snapshot dan registry terus berubah.

Aturan yang saya bawa pulang: nilai slopsquatting dari namanya, bukan dari ratenya. Model yang salah 5% dari waktu salah di tempat yang sama dengan pesaingnya, yang mengubah gangguan statistik menjadi daftar pendek yang bisa dienumerasi dan didaftarkan penyerang sekali saja. Gate pada keberadaan, umur, dan hash, dan anggap 53 nama di paper sebagai batas bawah dari yang ada.

FAQ

Pertanyaan Umum

Jawaban singkat untuk pertanyaan yang paling sering diajukan pembaca tentang topik ini.

Apa itu slopsquatting?

Slopsquatting adalah pendaftaran package berbahaya dengan nama yang dihalusinasikan model AI. Developer atau agent menjalankan perintah install yang ditulis asisten, lalu package manager mengambil package milik penyerang. Istilah ini berasal dari riset yang diukur paper USENIX Security 2025 oleh Spracklen dan kolega.

Seberapa sering model AI berhalusinasi nama package di 2026?

Pada replikasi arXiv yang dijalankan April 2026 terhadap lima model frontier, rate keseluruhan berkisar dari 4,62% untuk Claude Haiku 4.5 sampai 6,10% untuk GPT-5.4-mini. Studi sebelumnya melaporkan 5,2% untuk model komersial dan 21,7% untuk open-source. Penulis mencatat batasan, termasuk perbedaan rate penolakan dan tidak adanya pengujian agentic.

Apa yang dimaksud nama halusinasi universal?

Itu adalah nama package yang dikarang identik oleh kelima model yang diuji: total 127, 109 di PyPI dan 18 di npm. Setelah diungkapkan ke PyPI Security dan Socket.dev, 53 masih bisa didaftarkan. Satu pendaftaran nama seperti itu bisa menjangkau pengguna semua provider sekaligus.

Apakah rate halusinasi yang lebih rendah berarti saya boleh berhenti memeriksa dependency?

Tidak. Pada 4 sampai 7 persen, penyerang tetap mengumpulkan ratusan nama unik dengan murah, dan upload ke PyPI atau npm gratis. Paper menegaskan bahwa ancaman tidak bergantung pada rate yang tinggi. Pertahankan cek keberadaan, umur, dan hash, plus review manusia untuk dependency baru.

Bagaimana cara memeriksa apakah package yang disarankan AI aman di-install?

Pastikan namanya ada di registry, cek kapan file pertamanya diunggah, dan lihat siapa maintainer-nya. Lalu pin dengan hash memakai mode require-hashes pip dan atur masa tunggu seperti exclude-newer pada uv. Tidak satu pun dari ini sendirian membuktikan package itu aman, jadi tetap review tambahan baru.