Gigantisk bakdør oppdaget i påsken: – Planlagt i årevis

Hvordan sårbarheten ble skjult er fascinerende og et tegn på hva vi kanskje har i vente, skriver Johannes Brodwall om en bakdør i komprimeringsbiblioteket XZ.

– Vi er avhengig av en stor mengde open source som ofte vedlikeholdes av én overarbeidet enkeltperson på frivillig basis, sier Johannes Brodwall i Sopra Steria. 📸: Privat / xkcd.com/2347
– Vi er avhengig av en stor mengde open source som ofte vedlikeholdes av én overarbeidet enkeltperson på frivillig basis, sier Johannes Brodwall i Sopra Steria. 📸: Privat / xkcd.com/2347 Vis mer

Når Andres Freund, en av kjerneutviklerne av PostgreSQL skulle bruke langfredag til å gjøre noen ytelsestester oppdaget han at noe brukte mer av ressursene på serverne hans enn vanlig.

Når han undersøkte det nærmere virket det som om programmet SSH – som brukes til å få fjerntilgang til servere – brukte mye ressurser i et bibliotek som heter XZ. XZ er et populært bibliotek som brukes til å komprimere store filer til å bli små.

Han må ha tenkt at dette var rart, for han startet å grave og publiserte det han fant på mailing-listen oss-security.

Andres hadde oppdaget et supply-side angrep som antageligvis har vært planlagt i årevis og som har krevd mye kompetanse og innsats.

«Historien om hvordan sårbarheten ble skjult er fascinerende og et tegn på hva vi kanskje har i vente.»

Bakdøren skjult på snedig vis

Når ssh-serveren kompileres med versjon 5.6.1 av XZ som en avhengighet, så innføres det som ser ut som en remote command execute-sårbarhet i koden som sjekker klientsertifikater.

Sikkerhetseksperter jobber fortsatt med å finne ut nøyaktig hva som endres i SSH, men historien om hvordan sårbarheten ble skjult er fascinerende og et tegn på hva vi kanskje har i vente.

23. februar i år opprettet Jia Tan, en av to utviklere med admin-tilgang til XZ, en commit med den korte kommentaren “Tests: Add a few test files”. Et par dager senere publiserte han versjon 5.6.0.

Den 9. mars opprettet han en commit som oppdaterte to av disse filene og publiserte release 5.6.1. Lenkene er til hovedutvikler Lasse Collins' git-speil ettersom GitHub tok ned prosjektet.

Det Andres Freud fant ut var at i publiseringen av releases ble disse testfilene brukt på en snedig måte for å lage bakdøren, ifølge Gynvael Coldwin sin forklaring av Andres Freunds email.

Slik fungerte det

  1. Når XZ bygges generes scriptet build-to-host.m4. Andres oppdraget at den versjonen som var med i leveransen (som var kjørt på Jia Tans maskin) hadde en tilsynelatende uskyldig, men kryptisk linje som ikke lå i Git.
  2. Ved nærmere ettersyn viser det seg at denne kodelinjen trekker ut og eksekverer et script fra en av testfilene Jia Tan la til 23. februar (og oppdaterte 9. mars). Fila heter `bad-3-corrupt-lzma2.xz` og er tilsynelatende korrupt, som navnet tilsier. Men det er kun noen byteverdier som er byttet rundt (substitution cypher) og kommandoen i `build-to-host.m4` bytter dem tilbake.
  3. Scriptet som ligger i `bad-3-corrupt-lzma2.xz` pakker det ut den andre testfilen (`tests_files_good-large_compressed.lzma`). Innholdet er tilsynelatende bare tilfeldige bytes. Men den gjør noe mer: Den plukker ut en serie med enkeltdeler av den dekomprimerte fila og gjennomfører en substitusjon (altså bytter ut hver byte-verdi med en annen). Resultatet blir et nytt script som det første scriptet utfører
  4. Dette nye scriptet som ligger pakket inn i `tests_files_good-large_compressed.lzma` gjør to ting. For det første ser det etter testfiler med et innhold som matcher en signatur og prøver å trekke ut script derfra. Dette har blitt antatt som et slags plugin-system for fremtidige bakdører, men ingen testfiler ser ut til å utnytte denne utvidelsen ennå. Det andre scriptet i `tests_files_good-large_compressed.lzma`gjør er å pakke ut en kryptert, kompilert c-kode fil som blir lagt ved i byggprosessen (denne fila ligger også i `tests_files_good-large_compressed.lzma`)
  5. Den kompilerte c-fila som inkluderes i byggprosessen er i kryptert (med RC4-kryptering) og kun scriptet kan dekryptere den. Fila heter `liblzma_la-crc64-fast.o`. Den inkluderer funksjoner som overstyrer funksjonene crc64_resolve og _get_cpuid i SSH. Oppførselen her er ikke fullstendig analysert ennå, men det virker som om den åpner for remote code execution i funksjonen RSA_public_decrypt. Det virker som om sårbarheten kun tillater å bli utnyttet fra en spesifikk SSL public key.

Resultatet er at ssh-serveren som bygges med versjon 5.6.1 av XZ har fått installert en bakdør som Jia Tan eller hvem som står bak ham kan utnytte.

Denne bakdøren har blitt skjult ved å ha blitt gjemt i to testfiler med obfuskering og kryptering så det er ingen tvil om at dette er et bevisst forsøk på å skape og skjule en bakdør, ikke en sikkerhetsfeil som har oppstått ved et uhell.

Har committet til andre åpen kildekode-prosjekter

Hvem er Jia Tan og hvordan fikk han tilgang til å gjøre dette? Som mange på GitHub (og internett) så er den egentlige identiteten bak brukernavnet jiat0218 ukjent. Denne brukeren har eksistert på GitHub siden 2021 og har opprettet totalt 700 commits på en rekke open source-prosjekter. Hans første commit var på et annet prosjekt (libarchive).

Først i april i 2022 gjorde Jian Tan sin første commit på et prosjekt relatert til XZ (xz-utils). Senere samme året var det en tilsynelatende uavhengig bruker (“Jigar Kumar”) som maset på Lasse Collin, hovedutvikleren på XZ, om at han måtte få inn noen flere som kunne vedlikeholde prosjektet.

I svaret fra Lasse sier han “I haven't lost interest but my ability to care has been fairly limited mostly due to longterm mental health issues” og “Recently I've worked off-list a bit with Jia Tan on XZ Utils and perhaps he will have a bigger role in the future, we'll see.”

«Jia Tan bidrar gradvis mer til ZX og får fulle rettigheter til prosjektet ni måneder senere. Det går enda et år før han skal publisere versjonen med bakdøren.»

“Jigar Kumar” hører vi aldri fra igjen, men Jia Tan bidrar gradvis mer til ZX og får fulle rettigheter til prosjektet ni måneder senere. Det går enda et år før han skal publisere versjonen med bakdøren.

Når det gjelder identiteten til Jia Tan så bemerker en av de som har analysert saken at i en commit er navnet hans “Jia Cheong Tan”, men “Jia” og “Cheong” er fra forskjellige kinesiske språk. Så sjansene er gode for at det er et fiktivt kinesisk navn funnet på av noen som ikke er fra Kina.

Svært mange gjetter at det er et lands etterretningsorganisasjoner som står bak.

Så vidt jeg vet er det første gangen dette skjer (som vi vet om!), men det har ligget i kortene lenge. Vi er avhengig av en stor mengde open source som ofte vedlikeholdes av én overarbeidet enkeltperson på frivillig basis.

Å bygge opp tillit for en svindel som “Jia Tan” krever tid, kompetanse og innsats, men i en stadig mer utrygg verden kan mulighetene til å få nøklene til bakdøren i sentral programvare være verdt kostnaden.