Katso lähdekoodi, kopioi avain, omista kaikki
Tutkija avasi ClickUpin sivun lähdekoodin, löysi JavaScriptiin kovakoodatun API-avaimen ja haki sillä yhdellä pyynnöllä 959 sähköpostiosoitetta ja 3 165 sisäistä feature-lippua. Avaimella ei ollut oikeuksien rajaa, nopeusrajoitusta eikä vanhenemisaikaa.
Tietoturvatutkija siirtyi sivustolle clickup.com. Avasi sivun lähdekoodin. Löysi API-avaimen, joka oli kovakoodattu JavaScriptiin. Kopioi sen. Lähetti yhden GET-pyynnön.
Vastaukseksi tuli 959 sähköpostiosoitetta ja 3 165 sisäistä feature-lippua. Työntekijöitä yrityksistä Home Depot. Fortinet. Autodesk. Tenable. Rakuten. Mayo Clinic.
Yksi merkkijono. Yksi pyyntö. Kaikki.
Näin tämä tapahtuu
Joku tarvitsi frontendin kutsumaan APIa. API vaati todennuksen. Joten avain laitettiin JavaScriptiin. Julkaise, eteenpäin, seuraava sprintti.
Tämä ei ole kehittynyt hyökkäys. Ei ole exploitia, ei zero-dayta, ei sosiaalista manipulointia. Kyse on view-source:-komennosta ja curl:stä. Selain ja terminaali. Sellainen asia, jonka utelias harjoittelija tekee ensimmäisenä työpäivänään.
Avaimella ei ollut oikeuksien rajaa — se pääsi kaikeen siihen, mihin API antoi pääsyn. Ei nopeusrajoitusta — yksi pyyntö palautti kaiken. Ei vanhenemisaikaa — avain toimi, kunnes joku huomasi sen. Ei toista tunnistetekijää — merkkijonon hallinta oli ainoa portti.
Rahan näkökulma
Puhutaan tietovuodoista. Puhutaan siitä, mitä nämä tiedot ovat arvoltaan.
959 yritysten sähköpostiosoitetta Fortune 500 -yrityksistä. Se on kohdennetun kalastelun kohdelista, josta uhka-aktorit maksavat. Nimet, roolit ja tieto siitä, että nämä yritykset käyttävät ClickUpia — se on sosiaalisen manipuloinnin konteksti, joka saa kalastelun onnistumaan.
3 165 sisäistä feature-lippua. Se on kehityssuunnitelma. Se kertoo kilpailijoille, mitä ClickUp rakentaa, mitä se testaa, mikä on portin takana. Se kertoo hyökkääjille, mitkä ominaisuudet ovat puolivalmiita ja todennäköisesti haavoittuvia.
Tämä ei ole tietosuojaincidentti. Se on liiketoimintatietojen vuoto.
Miksi tämä toistuu
Tämä on neljäs tapaus tässä kuussa, jossa tunnisteet ovat päätyneet lähdekoodiin. Bitwardenin CLI:stä kerättiin kirjautumistiedot, koska ne olivat salaamattomia tiedostoja. Vercelin ympäristömuuttujat voitiin purkaa, koska "sensitive"-lippu ei oletuksena ollut käytössä. Kehittäjä menetti 634 Chromen salasanaa, koska salauksenpurkuavain oli samalla levyllä.
Malli on aina sama: tunniste on olemassa merkkijonona — tiedostossa, muuttujassa, sivun lähdekoodissa — ja jokin lukee sen. Se jokin muuttuu. Malli ei muutu.
API-avaimet JavaScriptissä ovat räikein versio, koska hyökkäystä ei tarvita. Avain on julkaistu. Se toimitetaan jokaiselle vierailijalle. Selain lataa sen, renderöi sen ja näyttää sen kenelle tahansa, joka napsauttaa hiiren oikealla painikkeella.
Mitä olisi pitänyt tehdä toisin
API-kutsua ei olisi koskaan pitänyt todentaa staattisella avaimella asiakaspuolelta. Vaihtoehdot:
- Backend-välityspalvelin. Frontendi kutsuu omaa backendiasi, joka pitää avaimen palvelinpuolella ja välittää API-kutsun. Avain ei koskaan päädy selaimeen.
- Istuntokohtaiset tokenit. Frontendi saa todennuksen jälkeen lyhytikäisen, kapeasti rajatun tokenin. Se vanhenee. Se voi tehdä vain sen, mihin todennetulla käyttäjällä on oikeus. Se ei ole pääavain.
- Ei avainta lainkaan. Jos tiedot ovat julkisia, tarjoa ne ilman todennusta. Jos ne eivät ole julkisia, älä tarjoa niitä todentamattomalle JavaScriptille.
API-avaimen kovakoodaaminen asiakaspuolen koodiin on sama asia kuin taloavaimen jättäminen jalkamatin alle ja osoitteen julkaiseminen.
Avaimen elinkaari-ongelma
Tämä ClickUp-avain luotiin luultavasti kerran, liitettiin JavaScript-tiedostoon, commitoitiin repositorioon, otettiin tuotantoon ja siitä ei sen jälkeen enää ajateltu. Kukaan ei vaihtanut sitä. Kukaan ei rajannut sen oikeuksia. Kukaan ei asettanut vanhenemisaikaa. Kukaan ei seurannut, mitä se haki.
Useimpien organisaatioiden useimpien API-avainten elinkaari on tällainen. Luotu kiireessä, liitetty sinne missä niitä tarvitaan, unohdettu. Ne kasaantuvat koodikantoihin, konfiguraatiotiedostoihin, CI/CD-putkiin ja ilmeisesti myös sivujen lähdekoodiin — kukin niistä on ovi, joka ei koskaan lukitu.
Kysymys ei ole, onko organisaatiollanne tällainen avain. Kysymys on, kuinka monta teillä on ja tietäisittekö, jos joku kopioisi sellaisen tänään.