AIR Securityn tutkijat Or Nevo, Dor Granat ja Niv Hoffman tekivät toukokuussa kokeen, jonka ei olisi pitänyt onnistua. He julkaisivat koodiagentille lisäosan, jonka sisältö oli lukittu tiettyyn Git-commitin tiivisteeseen, ja vaihtoivat sen jälkeen koodin toiseksi. Tiiviste näytti agentille yhä samalta. Agentti latasi uuden koodin ja ajoi sen.
Sama temppu toimi Claude Codessa, OpenAI:n Codexissa, GitHub Copilotissa ja Gemini CLI:ssä. Tutkijat antoivat virheelle nimen Plugin4Shell. Anthropic ja OpenAI korjasivat sen kesän aikana. Google ilmoitti elokuussa, ettei korjaa Gemini CLI:tä lainkaan, ja GitHub:lla korjausta ei ole vieläkään.
Tiiviste tarkistettiin, lopputulosta ei
SHA-pinnitys on lupaus, jonka varaan lisäosakauppojen turvallisuusmalli on rakennettu. Kauppa kertoo agentille tarkan commit-tiivisteen, agentti asentaa juuri sen koodin, eikä kertaalleen tarkistettu lisäosa voi muuttua kenenkään huomaamatta. Lupaus pitää vain, jos joku katsoo lopputuloksen.
Agentit eivät katsoneet. Jokainen neljästä ajoi git checkoutin pinnitetyllä tiivisteellä mutta jätti varmistamatta, mihin checkout todella päätyi.
Claude Codessa, Codexissa ja GitHub Copilotissa reitti sisään kulki haarojen nimien kautta. Hyökkääjä loi hallitsemaansa koodivarastoon haaran, jonka nimi oli täsmälleen sama 40 merkin heksajono kuin pinnitetty tiiviste, ja asetti sen oletushaaraksi. Git ratkaisee kaksiselitteisen viitteen haaran hyväksi, joten checkout toi hyökkääjän koodin. Gemini CLI:ssä aukko oli toisessa kohdassa: se haki commitin erikseen mutta ajoi sen jälkeen git checkout FETCH_HEAD, ja jos oletushaaran nimi oli FETCH_HEAD, juuri haettu commit jäi kokonaan käyttämättä.
Ulkopuolelta tähän ei pysty. Plugin4Shell vaatii lisäosan koodivaraston hallinnan, eli joko oman julkaistun lisäosan tai kaapatun varaston. Kaupan tarkistusprosessiin ei tarvitse koskea, koska tarkistus tehdään kerran ja tiiviste jää paikalleen. Nollaklikkisyys syntyy automaattipäivityksistä, jotka ovat oletuksena päällä Claude Codessa ja Codexissa: kun kauppa päivittää pinnitetyn tiivisteen, koodi vaihtuu taustalla jo asennettuihin lisäosiin. Onnistuessaan hyökkääjä saa saman pääsyn kuin agenttia ajava työntekijä, eli samat tiedostot, samat avaimet ja saman verkkoyhteyden.
Missä mennään nyt: neljä työkalua, kaksi korjausta
Claude Code: korjattu. Anthropic vahvisti korjauksen versiossa 2.1.179 kesäkuun 17. päivä. Tarkista versionumero ja päivitä, jos se on vanhempi.
OpenAI Codex: korjattu. Versio 0.146.0 vahvistettiin korjatuksi elokuun 12. päivä. Julkaistu versio on jo 0.155-sarjaa, eli tavallinen päivitys riittää.
GitHub Copilot: ei korjausta. Microsoft ei ole julkaissut paikkausta, joten päivittäminen ei auta. Ainoa suoja on jättää lisäosat asentamatta tai rajata ne varastoihin, joiden hallinta on omissa käsissä.
Gemini CLI: ei korjausta. Google kertoi elokuun 4. päivä, ettei tuotetta paikata, ja ohjaa käyttäjät Antigravityyn, joka ei käytä samaa pinnitysmallia.
“Yksi virhe, ja jokainen suuri tutkimuslaboratorio teki sen. Sama suunnitteluvirhe istuu jokaisessa haavoittuvassa agentissa.”
Alkukielinen virke kuuluu englanniksi: "One flaw, and every major lab made it." Raportti ei osoita sormella yhtä tiimiä vaan tapaa, jolla sama turvallisuusmalli on kopioitu agentista toiseen tarkistamatta sen pohjaa.
Googlen ja GitHub:n kannat ovat tässä jutussa peräisin AIR:n raportista ja yhtiöiden julkisista sivuista. Gemini CLI:n julkisessa koodivarastossa ei 20. syyskuuta ollut mitään merkintää tuen päättymisestä, vaikka Google kertoi tutkijoille jo elokuussa, ettei työkalua korjata. Koodivarastoa seuraava kehittäjä ei siis saa mistään signaalia siitä, että työkalu on jätetty paikkaamatta.
Plugin4Shellin vaiheet: löydöstä julkaisuun neljässä kuukaudessa
Toukokuu 2026
Virhe löytyy
AIR Securityn tutkijat rakentavat toimivan todisteen kaikkiin neljään koodiagenttiin.
Kesäkuu 2026
Ilmoitus valmistajille
Haavoittuvuudesta kerrotaan Anthropicille, OpenAI:lle, GitHub:lle ja Googlelle.
17.6.2026
Anthropic korjaa
Yhtiö vahvistaa korjauksen Claude Code -versiossa 2.1.179.
4.8.2026
Google kieltäytyy
AIR:n mukaan Google ilmoitti, ettei Gemini CLI:tä korjata. Yhtiön julkisilla sivuilla ei ole asiasta merkintää.
12.8.2026
OpenAI korjaa
Codex-versio 0.146.0 vahvistetaan korjatuksi.
18.9.2026
Tutkimus julki
AIR julkaisee raportin. GitHub Copilotilla ei ole korjausta.
Suomalaisessa ohjelmistotalossa koodiagentti ei ole hankintapäätös samalla tavalla kuin palvelin tai lisenssi. Se asennetaan kehittäjän koneelle, se päivittyy taustalla, ja versiosta toiseen siirrytään ilman että kukaan tekee siitä erillistä päätöstä. Juuri se on Plugin4Shellin kannalta olennaista. Sama automaatio, joka tuo korjauksen ilman vaivaa, toisi myös hyökkääjän koodin.
Tarkistus on lyhyt tehdä. Claude Coden versionumeron näkee komennolla claude --version, ja korjattu versio on 2.1.179 tai uudempi. Codexissa raja on 0.146.0. Gemini CLI:n ja GitHub Copilotin kohdalla päivittäminen ei auta, koska päivitystä ei ole olemassa.
Niille kahdelle jää vain lisäosien hallinta. Jos agentti hakee lisäosia kaupasta, jonka koodivarastoja organisaatio ei hallitse, koko suoja lepää kolmannen osapuolen ylläpitäjätilin varassa. Monessa talossa kukaan ei tiedä, mitä lisäosia kehittäjien agenteille on vuoden mittaan kertynyt. Se lista kannattaa katsoa nyt eikä siinä vaiheessa, kun se pitää katsoa kiireellä.
Sanasto
Commit-tiiviste (SHA)
Git-versionhallinnan antama 40 merkin tunnus, joka lasketaan koodin sisällöstä ja yksilöi täsmälleen yhden tallennetun version. Jos koodi muuttuu, tunnus muuttuu.
SHA-pinnitys
Ohjelmiston lukitseminen tiettyyn commit-tiivisteeseen, jotta asennettava koodi ei voi vaihtua huomaamatta uudempaan tai muokattuun versioon.
Nollaklikkihyökkäys
Hyökkäys, joka onnistuu ilman että käyttäjä tekee mitään – ei klikkausta, ei latausta. Tässä riittää, että ohjelma päivittää itsensä taustalla.
Korjaus on yksi rivi, mutta sen paikka ratkaisee
AIR:n ehdottama korjaus on lyhyt: checkoutin jälkeen verrataan git rev-parse HEADin tulosta pinnitettyyn tiivisteeseen ja keskeytetään asennus, jos ne eroavat. Rivin paikka on agentissa, koska viite ratkeaa vasta käyttäjän koneella.
Lisäosakaupat eivät pysty paikkaamaan tätä valmistajien puolesta. GitHub hylkää jo haarojen nimet, jotka näyttävät 40 merkin tiivisteiltä, mutta agentit tukevat virallisesti myös Bitbucketia ja itse ylläpidettyjä Git-palvelimia, joissa vastaavaa rajoitusta ei ole. Palveluiden varaan jätetty korjaus suojaisi vain osaa käyttäjistä.
Taustalla kulkee AIR:n aiempi tutkimus SkillJacking, jossa 925 kaapattua taitoa tavoitti 134 000 agenttia. Luvut kertovat mittakaavasta, jossa yksi ylläpitäjätili riittää. Plugin4Shell lisää siihen sen kiusallisen yksityiskohdan, että tiiviste, jonka oli määrä pysäyttää täsmälleen tämä hyökkäys, ei pysäyttänyt sitä.
Viikoittainen uutiskirje
Tule firmasi fiksuimmaksi AI-osaajaksi
Yksi uutiskirje kerrallaan. Kokoamme viikon tärkeimmät tekoälyuutiset suomeksi ja kerromme, mitä ne tarkoittavat sinun työsi kannalta. Luet sen kahvitauolla.