
Plugin4Shell: Pemilik Repo Boleh Menukar Plugin Terkunci
Plugin4Shell: Pemilik Repo Boleh Menukar Plugin Terkunci
Ada satu amalan yang kedengaran selamat dalam dunia AI coding agent: kunci setiap plugin yang anda pasang pada commit yang anda semak, melalui SHA 40 aksara. Semak sekali, pin selamanya, tak perlu fikir lagi. Rupanya pin itu selama ini cuma kepercayaan, bukan kunci sebenar.
Kajian AIR Security yang diterbitkan minggu ini — oleh Or Nevo, Dor Granat dan Niv Hoffman — menunjukkan pin SHA itu boleh dilangkau. Mereka menamakannya Plugin4Shell, dan ia membenarkan pemilik repo sesuatu plugin menyajikan kod yang lain sama sekali di bawah SHA yang telah disemak itu, merentas empat agent coding yang paling laris: Claude Code, OpenAI Codex, GitHub Copilot dan Gemini CLI.
Punca sebenar ialah kelakuan git yang wujud sejak dulu, jauh lebih tua daripada mana-mana agent ini. Bila anda lihat, tak boleh unsee.
Checkout yang tak pernah disahkan
Agent memasang plugin dari marketplace dengan mengklon repository dan checkout pada commit yang dipin:
git clone <plugin repo> ./
git checkout aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Marketplace dah putuskan aaa…aaa sebagai versi yang disemak dan dipercayai. Agent klon, agent checkout — tapi itulah sahaja. Tiada langkah selepas checkout yang mengesahkan working tree benar-benar berada pada aaa…aaa.
Git memberi penyerang satu cara untuk membuatkan checkout itu mendarat di tempat lain, sambil pin itu nampak seolah-olah utuh. Bila satu nama itu ref yang sah dan juga object id, git mendahulukan ref — cuma ia mencetak amaran refname is ambiguous. Jadi kalau pemilik repo mencipta branch yang namanya betul-betul SHA 40-hex yang dipin itu, menjadikannya branch default, dan menghalakannya ke kod jahat, git clone biasa akan menariknya turun sebagai local branch, dan git checkout <pinned-sha> akan sampai ke branch itu. Kod penyerang kini dalam working tree, dan agent melaporkan pemasangan berjaya pada commit yang dipin.
Saya jalankan semula serangan ini hujung ke hujung dalam repo percubaan. git check-ref-format milik git sendiri menerima nama branch 40-hex, dan behavior checkout itu betul-betul berlaku:
$ git branch <pinned-sha> # attacker names a branch like the pin
$ git branch -f <pinned-sha> <malicious> # ...and points it at other code
$ git checkout <pinned-sha> # victim/agent "checks out" the pin
warning: refname '<pinned-sha>' is ambiguous.
$ git rev-parse HEAD # d645fe8... — the MALICIOUS commit
Pin menamakan satu commit; working tree menjalankan commit lain. Amaran itu ditulis ke stderr dan biasanya diabaikan oleh tooling — sebab itulah bertahun-tahun tiada siapa perasan.
Dua laluan untuk kena, dua-dua zero-click
Menurut AIR, penyerang tidak perlu mengawal marketplace — cukup kawal repository di sebalik plugin yang orang memang dah percaya. Dua laluan:
- Terbitkan plugin yang jinak, kemudian rug-pull. Hantar sesuatu yang betul-betul berguna, biar ia lulus semakan dan dipin, biar ia merebak, kemudian tukar commit yang dipin itu. AIR sudah menunjukkan rantaian "dipercayai → viral → jahat" ini sebelum ini dengan skills.
- Rampas repository penulis yang sah. Ambil alih repo yang ditunjuk plugin yang dipercayai itu (kerja SkillJacking dan RepoJacking mereka sebelum ini berjaya menguasai 925 skills yang memang sudah digunakan), kemudian paksa versi jahat ke setiap agent yang memasang plugin itu.
Apa yang menukar keraguan masa pasang kepada zero-click sebenar ialah background auto-update, yang menjadi default dalam Claude Code dan Codex: bila marketplace menaikkan SHA pin untuk update sah, git checkout yang sama rosak itu berjalan semula secara senyap. Branch bbb…bbb milik penyerang sudah jadi default, maka pertukaran itu berlaku sendiri — tidak ada prompt, tidak ada klik, tiada apa-apa di skrin. Satu-satunya syarat: mangsa ada plugin itu terpasang, dan plugin itu dahulunya jinak.
Bila plugin itu jalan, ia mendapat akses yang sama dengan developer: fail tempatan, saved credentials, sistem yang anda boleh log masuk. Ini model ancaman AI agent di tempat yang paling buruk — tool yang anda sendiri jemput masuk ke terminal.
Tempat ia berkesan — dan varian Gemini
Trik nama branch ini tidak berfungsi pada semua host. GitHub menolak nama branch dan tag yang terdiri daripada SHA 40-hex semata-mata, menurut dokumentasi GitHub, maka plugin yang dipasang dari repository GitHub selamat daripada varian khusus ini. Trik ini berkesan pada host yang membenarkan nama sedemikian — Bitbucket dan git server sendiri (self-hosted) — kedua-duanya disokong secara rasmi oleh agent sebagai backend marketplace. The Hacker News mengesahkan semua plugin dalam katalog komuniti Anthropic dan katalog default Claude Code dan Copilot menghala ke repository GitHub, yang mengecilkan pendedahan varian branch untuk dua agent itu dengan ketara.
Gemini CLI cerita lain. Installer-nya memakai tiga langkah:
git clone --depth 1 <plugin repo> ./
git fetch origin 41d0bc0a4aeb2fbf797dacea39e876d98c95024b
git checkout FETCH_HEAD
git checkout FETCH_HEAD tak semestinya membaca commit yang difetch tadi: kalau branch default repository itu betul-betul dinamakan FETCH_HEAD, checkout akan sampai ke branch itu. Peraturan GitHub tentang nama berbentuk SHA tidak jelas menghalang nama FETCH_HEAD, jadi AIR kata belum terbukti bahawa memasang plugin Gemini dari GitHub terlepas daripada kelemahan ini. Gemini CLI juga agent yang tidak akan dibaiki.
Status patch: dua dibaiki, satu tiada, satu dihentikan
Bug ini diselesaikan dalam agent sendiri, pada mesin pengguna — tiada marketplace boleh menambalnya untuk semua orang. Inilah kedudukan setiap agent, menurut AIR dan The Hacker News:
| Agent | Status | Tindakan |
|---|---|---|
| Claude Code | Dibaiki (2.1.179, Anthropic sahkan 2026-06-17) | Update dan kekal terkini |
| OpenAI Codex | Dibaiki (0.146.0, disahkan 2026-08-12) | Update dan kekal terkini |
| GitHub Copilot | Tiada fix dihantar | Tiada patch tersedia |
| Gemini CLI | Dihentikan, tidak akan dibaiki | Migrasi ke Antigravity |
AIR kata mereka membina proof-of-concept yang berfungsi terhadap keempat-empat agent pada Mei 2026, memberitahu kesemua empat vendor pada Jun 2026, dan mengesahkan fix Anthropic pada 2026-06-17 serta keputusan "tidak akan dibaiki" Google pada 2026-08-04. Fix awam OpenAI turut mengesahkan mekanisme ini: git "boleh mentafsir commit SHA yang diminta sebagai nama branch", yang boleh menyebabkan sumber plugin "menghasilkan commit yang berbeza daripada yang dipin".
Setakat laporan The Hacker News pada 18 September, belum ada CVE diberi, belum ada security advisory vendor diterbitkan, dan tidak ada tanda kelemahan ini dieksploitasi dalam serangan sebenar. Google berhenti menyajikan Gemini CLI konsumer pada Jun dan mengarahkan pengguna ke Antigravity, yang kata AIR tidak boleh dicapai serangan ini — tetapi build enterprise Code Assist masih menerima update, dan sama ada fix Plugin4Shell ada antara update itu masih tidak jelas.
Yang turut tidak jelas: sama ada update agent itu membersihkan plugin yang sudah ditukar, atau hanya menghentikan pertukaran masa depan. Anggap hanya yang kedua melainkan diberitahu sebaliknya.
Fix ialah satu baris assertion
Baris penutup yang dicadangkan AIR bagi kedua-dua varian ialah satu semakan shell selepas checkout:
test "$(git rev-parse HEAD)" = "<pinned-sha>" || abort
Perhati: ia membandingkan HEAD yang diselesaikan, bukan ref yang diminta — perbezaan itulah jahitan yang varian Gemini FETCH_HEAD selit masuk.
Maksudnya untuk dunia di luar agent
Plugin4Shell menyertai September yang sibuk dengan insiden supply-chain AI coding assistant. Pengajaran besarnya mudah dan patut diulang: pin bukan verification. Di mana-mana sahaja pipeline anda buat pinned git checkout — agent plugin, build script, klon CI, dependency vendoring — tambah baris verify-after-checkout dan gagal dengan kuat bila HEAD yang diselesaikan tak padan. Default "ambiguous refname" git ini kini ada nama yang viral, tetapi ia memang sentiasa ada; apa-apa sahaja yang git checkout hash tanpa menyemak hasilnya selama ini berjalan atas kepercayaan, bukan atas kunci.
Sumber
- AIR Security: Plugin4Shell — Zero Click RCE Vulnerability found in top 4 most popular coding agents
- The Hacker News: Plugin4Shell Lets Repository Owners Swap Pinned Plugin Code Across Four AI Coding Agents
- OpenAI: codex: Verify Git plugin SHA checkouts (fix PR)
- GitHub Docs: Dealing with special characters in branch and tag names
- Anthropic: claude-code v2.1.179 release
- OpenAI: codex rust-v0.146.0 release
// penulis
Editor & Operator
Mohd Firdaus Abu Bakar (MrDodgerX) is an enterprise geospatial systems engineer in Malaysia and the editor behind hejes.my. He runs the briefing pipeline, curates and edits every draft, verifies each factual claim against primary sources, and presses the publish button — nothing ships without his review. He writes about AI, security and Malaysia's tech scene from a builder's perspective. Professional profile and code: the links below.
// sumber //
disahkan fakta · 21 SEP 2026 · hejes-content-fact-check
- Plugin4Shell — Zero Click RCE Vulnerability found in top 4 most popular coding agentsAIR Security · diakses 21 SEP 2026
- Plugin4Shell Lets Repository Owners Swap Pinned Plugin Code Across Four AI Coding AgentsThe Hacker News · diakses 21 SEP 2026
- codex: Verify Git plugin SHA checkouts (fix PR)OpenAI · diakses 21 SEP 2026
- Dealing with special characters in branch and tag namesGitHub Docs · diakses 21 SEP 2026
- claude-code v2.1.179 releaseAnthropic · diakses 21 SEP 2026
- codex rust-v0.146.0 releaseOpenAI · diakses 21 SEP 2026
berkaitan //

ARTEX AI dan Serangan ke atas Bank Korea Selatan
Satu alat pentest AI open-source dari China digunakan untuk menembusi sekurang-kurangnya tujuh bank Korea Selatan, mendedahkan data 68,000 orang.

15,465 Server MCP Tanpa Kawalan Memadai
OX Security memetakan 15,465 server MCP awam: 15.6% dihoskan di luar AS, 2.3% domain sudah mati. Protokolnya kukuh. Kepercayaan yang diberi, tidak.

Domain placeholder kini jadi pelantar malware
Domain placeholder third-party.com yang dipakai dalam docs kini menghidangkan ClickFix kepada pelawat Windows, dan 13 domain seumpamanya membawa scam.
// sertai suapan
satu ilmu seminggu. tiada spam.
ringkasan mingguan. berhenti bila-bila masa.