8. jūlijā kāds ar rakstīšanas tiesībām uz Injective Labs GitHub repozitoriju publicēja versiju @injectivelabs/sdk-ts@1.20.21. Līdz ar SDK tajā bija slēpts modulis, kas pārtver kriptomaka atslēgas un nosūta tās ārējai adresei. Versija npm reģistrā pastāvēja 49 minūtes — laiks pietika 310 lejupielādēm.
@injectivelabs/sdk-ts ir galvenais rīks izstrādātājiem uz Injective blokķēdes; paketei ir apmēram 175 000 lejupielāžu mēnesī. Datadog Security Labs publicēja pilnu tehnisko analīzi — backdoor modulis bija noslēpts kā anonīma telemetrija, tāpēc pētnieki rakstu nosauca par “Not-so-anonymous telemetry”.
Kā tika nozagtas atslēgas
Ļaunprogramma ievadīja āķus divās galvenajās atslēgas iegūšanas funkcijās: PrivateKey.fromMnemonic() un PrivateKey.fromHex(). Ikreiz, kad lietotne ielādēja maku, kods pārtver BIP-39 mnemonisko frāzi vai privāto atslēgu. BIP-39 ir standarts 12–24 vārdu atgūšanas frāzēm — kuram ir frāze, tas var nosūtīt visus makā esošos līdzekļus un parakstīt jebkuru darījumu.
Nozagtā informācija base64-kodētā formā tika ievietota X-Request-Id HTTP galvenē un nosūtīta parastā izsaucienā uz ārēju galapunktu. Serverim tas izskatījās kā regulāra SDK komunikācija.
Datadog Security Labs analīze rāda, ka kompromitētie dati devās ārā, slēpjoties aiz parastās X-Request-Id galvenes — galvenes, kuru serveru žurnāli parasti nereģistrē atsevišķi un kura trafika monitoringā reti rada brīdinājumus.
18 paketes saindētas vienlaikus
Uzbrucējs nepublicēja tikai galveno SDK. Vienā reizē tika atjauninātas 17 citas paketes @injectivelabs tvērumā — katra piespraudīta pie ļaunprogrammatūras versijas 1.20.21. Projekti, kas izmantoja kādu no šīm paketēm, iegūtu kodu tranzitīvi, pat neinstalējot sdk-ts tieši. StepSecurity analīze aprēķina, ka saindētais kods var sasniegt 87 atkarīgās paketes npm reģistrā.
Šāda mēroga darbība — 18 paketes vienā publicēšanā — liecina par automatizētu procesu. Manuāla darbība katrai atsevišķi aizņemtu daudz vairāk laika nekā 49 minūtēs atvēlētais logs.
Uzbrukuma vektors: kompromitēts GitHub konts
Šis scenārijs atšķiras no gadījumiem, kur tiek nozagts npm publicēšanas tokens. Šoreiz kāds ieguva rakstīšanas tiesības uz pašu GitHub repozitoriju, izmantojot kontu ar iepriekšēju ieguldījumu vēsturi projektā. Commits izskatījās no uzticama autora.
Repozitorija GitHub Actions konfigurācija automātiski publicēja jebkuru jaunu tagu uz npm. Tiklīdz commit bija reģistrā, atlikušais process noritēja bez cilvēka iejaukšanās. Pat ja Injective Labs npm kontam būtu bijusi stingra MFA aizsardzība, tas šo scenāriju nebūtu apturējis — publicēšana notika ar CI sistēmas akreditācijas datiem.
Laika josla: 49 minūtes
Lejupielāžu žurnāls rāda šādu secību:
- 08:12 UTC — versija 1.20.21 un 17 saistītās paketes parādās npm
- 09:01 UTC — repozitorijā tiek revertēts ļaunprogrammatūras kods
- 09:17 UTC — tīrā versija 1.20.23 pieejama npm
310 lejupielāžu šajā logā ietver izstrādātājus un automatizētus CI/CD pipeline’us, kas tūlīt instalē jaunas versijas bez cilvēka apstiprinājuma. Cik no sistēmām, kas lejupielādēja 1.20.21, faktiski izsauca PrivateKey.fromMnemonic() vai PrivateKey.fromHex() — precīzu atbildi nav iespējams dot.
Ko darīt, ja sistēmā bija 1.20.21
Pārbaudiet lock failu — package-lock.json, yarn.lock vai pnpm-lock.yaml: ja redzat @injectivelabs/sdk-ts@1.20.21 vai kādu no 17 saistītajām paketēm šajā versijā, jāmaina visas kriptomaka atslēgas, kuras šī lietotne jebkad ielādēja. OX Security publicēja pilnu skarto pakešu sarakstu. Atjaunināšana uz 1.20.23 dod tīru versiju, bet nemaina faktu, ka atslēgas jau varēja būt nopludinātas.
Injective Labs apstiprina, ka versija 1.20.23 ir tīra.
Avoti
- Datadog Security Labs: Not-so-anonymous telemetry — The @injectivelabs/sdk-ts backdoor
- StepSecurity: Injective npm Supply Chain Attack — 18 Packages Backdoored
- The Hacker News: Injective Labs GitHub Compromise Pushes Wallet-Key-Stealing npm Packages
- OX Security: Injectivelabs npm Package Hijacked, Impacting 87 Dependent Packages
- SC Media: Injective Labs SDK npm package compromised
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.