Säkerheten i SL:s SMS-biljetter
Förvarning: det här inlägget rusade ur händerna på mig och blev lite för omfattande. Sorry.
Jag har sedan inlägget om säkerheten i SL:s spärrar (och uppföljarna om tilläggsavgiften och glasspärrarna) funderat på att skriva om problemen med SMS-biljetterna men inte kommit mig för. Nu är det dock dags.
I september 2010 släppte SL Lägesrapport fusk och svinn (pdf), se screenshot nedan. Där framgår att 4,62 % av alla resor är plankade och att detta innebär ett intäktsbortfall på 314,3 miljoner kronor per år. Intressant är också observationen att många plankare bara handlar rationellt. Som jag skrev i första posten om spärrar; med hänsyn taget till tilläggsavgiften, risken att bli kontrollerad och resmönster så är det för somliga helt enkelt värt det.
Vidare framgår det att omkring 10 % av fusket utgörs av "förfalskade eller felaktiga SMS-biljetter". Den verkliga andelen är sannolikt högre då man får anta att en del hellre säger att de inte har någon biljett alls.
SMS-biljetter
Det finns en fundamental motsättning i designkraven för SMS-biljetter: (1) de ska vara billiga att massproducera, att skicka femton biljetter eller femton tusen biljetter ska inte innebära någon stor skillnad i pris (för SL). Samtidigt ska de (2) vara omöjliga att kopiera för slutanvändarna. Att en biljett bara består av en liten mängd digitala data uppfyller det första kravet men har samtidigt goda förutsättningar att fullständigt trasha det andra.
Hur kommer det sig? Jo, det fanns ett tredje krav; (3) en spärrvakt ska kunna verifiera biljetten endast genom att titta på den. Utseendet har ändrats flera gånger sen introduktionen men idag ser biljetterna ut så här:
Det tredje kravet gör att allt faller. Detta är enkelt att förvissa sig om, ett simpelt exempel är replay attacks. En spärrvakt har inga möjligheter att avgöra om en biljett har passerat tidigare med mindre än att denne memorerar varje visad biljett. Du köper en biljett, jag skapar en identisk kopia av din biljett, du visar din biljett för spärrvakten, ger denne tio sekunder att glömma och sedan passerar jag.
En annan, vanligare, attack har visat sig vara att skapa biljetter som bara är tillräckligt lika de riktiga. Den vänstra biljetten ovan är äkta medan den högra biljetten är förfalskad. Förfalskningen är inte ens ett riktigt SMS utan bara ett screenshot av ett. (Webbsidorna där dessa kan hämtas verkar flytta runt regelbundet då de blir avstängda efter ett tag. Den ovan är från slsms.300mb.us.)
För att kunna göra en trovärdig förfalskning måste man veta vilka detaljer en spärrvakt, busschaufför eller kontrollant studerar. Egentligen kan det vara vad som helst, t ex att slutsiffran på första raden stämmer överens med slutsiffran i avsändarnumret. Det skulle också kunna vara att kontrollanten vet att dagens biljetter måste ha kombinationen "C03" efter timme och minut i teckenkombinationen, med mera. Det kan förstås vara en kombination av flera.
(Notera förresten att avsändarnumret inte går att lita på då det är telefonägaren som bestämmer vilket namn (eller nummer) som visas eftersom det hämtas från adressboken.)
Genom att studera hur biljettkoderna är uppbyggda kan man förfina förfalskningen. En hel del arbete har gjorts på det här tidigare, t ex det här från Reklamerad och Malako på Flashback-forumet. Eftersom det är möjligt att probe:a systemet genom att begära olika biljetter från olika telefoner vid olika tidpunkter och jämföra resultatet kan man behandla systemet som en svart låda.
Lösningsförslag
Nu är jag ute på djupt vatten, att designa säkra protokoll är inget man gör framför datorn, på egen hand, medan man bloggar, i realtid, utan djupare erfarenhet. Texten nedan är väl inte så strukturerad och genomtänkt som jag önskat. Jag tar inget ansvar för det här... Men, det är ju för skojs skull. :-)
Om ett system med SMS-biljetter ska vara pålitligt måste det finnas något i systemet som vi med mobiltelefonerna inte kan påverka.
Man skulle kunna välja att gå en väg med delade kryptonycklar och MAC:ar av biljettinformationen men förmodligen kommer man då att få lösa samma problem som Kerberos har fått kämpa med genom åren. Dessutom bygger Kerberos på att du som användare inte vill att andra ska använda din identitet. Något som inte gäller i kollektivtrafiken...
En (konceptuellt) enklare lösning skulle vara att som biljett skicka ett slumpmässigt serienummer. Vakter, chaufförer och kontrollanter har möjlighet att fråga en central databas om serienumret finns och i s f vilken sorts biljett den motsvarar och utifrån detta avgöra om personen får åka. Eftersom biljettens nummer inte har någon korrelation till vad det är för biljett och trafikanten inte har tillgång till databasen kan den inte förfalskas. Förutsatt att serienumren inte är förutsägbara.
Metoden har dock problem med replay-attacker, efter att den har använts kan man "dela med sig" av sin biljett. En lösning på detta kan vara att invalidera den efter att man passerat spärrlinjen så att kopior kan upptäckas. Det här innebär förstås problem när man ska byta trafikslag, biljetten har ju invaliderats. Det kanske skulle kunna lösas genom att man kan begära nya biljetter efterhand man byter:
Våra förutsättningar är redan ganska goda. När man begär en "ny biljett" efter att den initiala har invaliderats måste ju systemet verifera att du har en giltig biljettperiod. Av användbarhetsskäl borde denna kontroll ske med biljettköparens telefonnummer som nyckel i databasen, annars skulle denne vara tvungen att skicka med det initiala serienumret och det verkar jobbigt.
Vakten kan alltså genom att kolla på ditt serienummer på din biljett ta reda på vilket telefonnummer som begärde det serienumret. Så, om du, som i föregående attack, fick en kopia av din kompis förnyade biljett kan vakten se att du försöker lura systemet. Biljetten du har begärdes ju av någon annans telefonnummer.
Tyvärr kan man inte se på en telefon vilket nummer den har. Vakten kan ju naturligtvis inte heller lita på vad trafikanten ifråga säger, det kan ju vara en bov. Vad sägs om att ett nytt SMS skickas till biljettens registrerade telefonnummer när serienumret verifieras? Alltså, som vakt, när du kontrollerar någons biljettnummer mot systemet borde det direkt efteråt dyka upp ett nytt SMS, ett verifikationsmeddelande, på telefonen. Om inte så kan det bero på att det är en kopia av någon annan telefons biljettnummer och då dök meddelandet upp på den istället.
Vidare kan man argumentera för att det här verifikationsmeddelandet måste vara svårt att förfalska, annars kan jag ha en telefon i fickan med vilken jag skickar ett sådant till telefonen som visas för kontrollanten. Oh my... är det inte intressant hur sådana här säkerhetsprotokoll blir mer och mer komplicerade ju mer man tänker på det? :-) Jag slutar här.
Det finns flera övergripande problem med det här dock. Ibland kommer SMS inte fram direkt av olika anledningar, kan en kontrollant hålla kvar en trafikant i spärren? (Nej.) Dessutom kommer alla vakter, bussförare och kontrollanter behöva en läsare av någon form som har uppkoppling mot den centrala servern. Blir det för dyrt? Vidare finns problemet med pålitlig enhet, kan SL:s personal överhuvudtaget lita på den telefon som trafikanten håller i handen?
Avslutningsvis...
Gör inte misstaget att tro att SMS-biljetterna är som de är för att SL inte vet vad de sysslar med. Systemet togs nog fram i all hast i samband med att kontanthanteringen förbjöds. Att ta fram ett system där biljetter kan verifieras on-line är tidsödande, inte minst för att det kräver läsare med kommunikation till alla som ska verifiera biljetter. Det är till och med sannolikt att systemet redan fungerar så här i viss utsträckning men att det bara är kontrollanter som kan göra kontrollen (deras dosor gör ju nånting).
--
Stefan Pettersson
Jag har sedan inlägget om säkerheten i SL:s spärrar (och uppföljarna om tilläggsavgiften och glasspärrarna) funderat på att skriva om problemen med SMS-biljetterna men inte kommit mig för. Nu är det dock dags.
I september 2010 släppte SL Lägesrapport fusk och svinn (pdf), se screenshot nedan. Där framgår att 4,62 % av alla resor är plankade och att detta innebär ett intäktsbortfall på 314,3 miljoner kronor per år. Intressant är också observationen att många plankare bara handlar rationellt. Som jag skrev i första posten om spärrar; med hänsyn taget till tilläggsavgiften, risken att bli kontrollerad och resmönster så är det för somliga helt enkelt värt det.
Vidare framgår det att omkring 10 % av fusket utgörs av "förfalskade eller felaktiga SMS-biljetter". Den verkliga andelen är sannolikt högre då man får anta att en del hellre säger att de inte har någon biljett alls.
SMS-biljetter
Det finns en fundamental motsättning i designkraven för SMS-biljetter: (1) de ska vara billiga att massproducera, att skicka femton biljetter eller femton tusen biljetter ska inte innebära någon stor skillnad i pris (för SL). Samtidigt ska de (2) vara omöjliga att kopiera för slutanvändarna. Att en biljett bara består av en liten mängd digitala data uppfyller det första kravet men har samtidigt goda förutsättningar att fullständigt trasha det andra.
Hur kommer det sig? Jo, det fanns ett tredje krav; (3) en spärrvakt ska kunna verifiera biljetten endast genom att titta på den. Utseendet har ändrats flera gånger sen introduktionen men idag ser biljetterna ut så här:
Det tredje kravet gör att allt faller. Detta är enkelt att förvissa sig om, ett simpelt exempel är replay attacks. En spärrvakt har inga möjligheter att avgöra om en biljett har passerat tidigare med mindre än att denne memorerar varje visad biljett. Du köper en biljett, jag skapar en identisk kopia av din biljett, du visar din biljett för spärrvakten, ger denne tio sekunder att glömma och sedan passerar jag.
En annan, vanligare, attack har visat sig vara att skapa biljetter som bara är tillräckligt lika de riktiga. Den vänstra biljetten ovan är äkta medan den högra biljetten är förfalskad. Förfalskningen är inte ens ett riktigt SMS utan bara ett screenshot av ett. (Webbsidorna där dessa kan hämtas verkar flytta runt regelbundet då de blir avstängda efter ett tag. Den ovan är från slsms.300mb.us.)
För att kunna göra en trovärdig förfalskning måste man veta vilka detaljer en spärrvakt, busschaufför eller kontrollant studerar. Egentligen kan det vara vad som helst, t ex att slutsiffran på första raden stämmer överens med slutsiffran i avsändarnumret. Det skulle också kunna vara att kontrollanten vet att dagens biljetter måste ha kombinationen "C03" efter timme och minut i teckenkombinationen, med mera. Det kan förstås vara en kombination av flera.
(Notera förresten att avsändarnumret inte går att lita på då det är telefonägaren som bestämmer vilket namn (eller nummer) som visas eftersom det hämtas från adressboken.)
Genom att studera hur biljettkoderna är uppbyggda kan man förfina förfalskningen. En hel del arbete har gjorts på det här tidigare, t ex det här från Reklamerad och Malako på Flashback-forumet. Eftersom det är möjligt att probe:a systemet genom att begära olika biljetter från olika telefoner vid olika tidpunkter och jämföra resultatet kan man behandla systemet som en svart låda.
Lösningsförslag
Nu är jag ute på djupt vatten, att designa säkra protokoll är inget man gör framför datorn, på egen hand, medan man bloggar, i realtid, utan djupare erfarenhet. Texten nedan är väl inte så strukturerad och genomtänkt som jag önskat. Jag tar inget ansvar för det här... Men, det är ju för skojs skull. :-)
Om ett system med SMS-biljetter ska vara pålitligt måste det finnas något i systemet som vi med mobiltelefonerna inte kan påverka.
Man skulle kunna välja att gå en väg med delade kryptonycklar och MAC:ar av biljettinformationen men förmodligen kommer man då att få lösa samma problem som Kerberos har fått kämpa med genom åren. Dessutom bygger Kerberos på att du som användare inte vill att andra ska använda din identitet. Något som inte gäller i kollektivtrafiken...
En (konceptuellt) enklare lösning skulle vara att som biljett skicka ett slumpmässigt serienummer. Vakter, chaufförer och kontrollanter har möjlighet att fråga en central databas om serienumret finns och i s f vilken sorts biljett den motsvarar och utifrån detta avgöra om personen får åka. Eftersom biljettens nummer inte har någon korrelation till vad det är för biljett och trafikanten inte har tillgång till databasen kan den inte förfalskas. Förutsatt att serienumren inte är förutsägbara.
Metoden har dock problem med replay-attacker, efter att den har använts kan man "dela med sig" av sin biljett. En lösning på detta kan vara att invalidera den efter att man passerat spärrlinjen så att kopior kan upptäckas. Det här innebär förstås problem när man ska byta trafikslag, biljetten har ju invaliderats. Det kanske skulle kunna lösas genom att man kan begära nya biljetter efterhand man byter:
- Köper biljett på T-centralen.
- Spärrvakt kontrollerar den.
- Biljett invalideras.
- Begär ny biljett.
- Byter till buss i Fridhemsplan.
- Biljetten invalideras.
- Köper biljett.
- Busschaufför kontrollerar den.
- Biljetten invalideras.
- Begär ny biljett, skickar numret till en kumpan.
- Busschaufför (eventuellt på annan buss) kontrollerar den.
- Biljett invalideras.
Våra förutsättningar är redan ganska goda. När man begär en "ny biljett" efter att den initiala har invaliderats måste ju systemet verifera att du har en giltig biljettperiod. Av användbarhetsskäl borde denna kontroll ske med biljettköparens telefonnummer som nyckel i databasen, annars skulle denne vara tvungen att skicka med det initiala serienumret och det verkar jobbigt.
Vakten kan alltså genom att kolla på ditt serienummer på din biljett ta reda på vilket telefonnummer som begärde det serienumret. Så, om du, som i föregående attack, fick en kopia av din kompis förnyade biljett kan vakten se att du försöker lura systemet. Biljetten du har begärdes ju av någon annans telefonnummer.
Tyvärr kan man inte se på en telefon vilket nummer den har. Vakten kan ju naturligtvis inte heller lita på vad trafikanten ifråga säger, det kan ju vara en bov. Vad sägs om att ett nytt SMS skickas till biljettens registrerade telefonnummer när serienumret verifieras? Alltså, som vakt, när du kontrollerar någons biljettnummer mot systemet borde det direkt efteråt dyka upp ett nytt SMS, ett verifikationsmeddelande, på telefonen. Om inte så kan det bero på att det är en kopia av någon annan telefons biljettnummer och då dök meddelandet upp på den istället.
Vidare kan man argumentera för att det här verifikationsmeddelandet måste vara svårt att förfalska, annars kan jag ha en telefon i fickan med vilken jag skickar ett sådant till telefonen som visas för kontrollanten. Oh my... är det inte intressant hur sådana här säkerhetsprotokoll blir mer och mer komplicerade ju mer man tänker på det? :-) Jag slutar här.
Det finns flera övergripande problem med det här dock. Ibland kommer SMS inte fram direkt av olika anledningar, kan en kontrollant hålla kvar en trafikant i spärren? (Nej.) Dessutom kommer alla vakter, bussförare och kontrollanter behöva en läsare av någon form som har uppkoppling mot den centrala servern. Blir det för dyrt? Vidare finns problemet med pålitlig enhet, kan SL:s personal överhuvudtaget lita på den telefon som trafikanten håller i handen?
Avslutningsvis...
Gör inte misstaget att tro att SMS-biljetterna är som de är för att SL inte vet vad de sysslar med. Systemet togs nog fram i all hast i samband med att kontanthanteringen förbjöds. Att ta fram ett system där biljetter kan verifieras on-line är tidsödande, inte minst för att det kräver läsare med kommunikation till alla som ska verifiera biljetter. Det är till och med sannolikt att systemet redan fungerar så här i viss utsträckning men att det bara är kontrollanter som kan göra kontrollen (deras dosor gör ju nånting).
--
Stefan Pettersson
Kommentarer
Postat av: Martin da Fonseca
Tack för din analys :)
Man får anta att dom siktar in sig på problemet med förfalskningar. Replay är också ett problem, men jag gissar att det inte utgör en stor del av "smitningar" från avgiften.
SAS erbjuder ju möjligheten med boardingkort via SMS. Där får man en länk till en JPG i form av en QR-code (2D-barcode).
Kanske nått för SL?
Trackback